ОТСКОК ОТ ПРЕПЯТСТВИЙ отскок от вертикальных и горизонтальных препятствий

 

Бильярдный шар после удара о препятствие отскакивает по известной формуле - угол падения равен углу отражения. Однако этот угол не придётся вычислять, если препятствие вертикально или горизонтально. В этих случаях достаточно изменить значение одной из составляющих движения на противоположное. Проиллюстрирую на примере: В нашем примере нарисуйте рамку по периметру поля и замените код на следующий:

 

onClipEvent (load) { // При загрузке

MovieWidth = 600; // Устнавливаем переменные ширины

MovieHeight = 400;// и высоты

_y = random(400);// помещаем мувиклип на случайное место на

_x = random(600); // сцене

x_speed = random(20);// задаём случайную скорость по оси х и

y_speed = random(20); // по оси у

} onClipEvent (enterFrame) {// и затем каждый кадр

x = (_x+speed); // вычислЯем возможную позицию по оси х в следующем кадре

if (x<_width/2) { // проверЯем позицию отностиельно левого краЯ: - вышли за пределы полЯ?

_x = _width/2; // если да, то устанавливаем на левый край полЯ

x_speed = -x_speed;// и менЯем направление движениЯ по оси х

} else if (x>MovieWidth-_width/2) { // иначе, если вышли за пределы полЯ справа

_x = MovieWidth-_width/2; // то устанавливаем на правый край полЯ

x_speed = -x_speed;// и менЯем направление движениЯ по оси х

} else { // и если не вышли за пределы полЯ ни справа ни слева

_x = (_x+x_speed); // то перемешаем объект на следующую позицию траектории

} y = (_y+y_speed); // дальше те же проверки делаем относительно верхнего и нижнего краЯ полЯ.

if (y<_height/2) {

_y = _height/2; y_speed = -y_speed;

} else if (y>MovieHeight-_height/2) {

_y = MovieHeight-_height/2; y_speed = -y_speed;

} else { _y = (_y+y_speed);

}

}

 

А теперь давайте разберём, что у нас получилось. Перед тем, как присваивать новое значение или мы его проверяем на переменных x и y, и если значение этих переменных выходит за рамки поставленных ограничений, а в нашем случае это рамки Movie, то свойству задаём соответствующее значение рамки и меняем направление движения на противоположное. В этом примере учтено, что объект имеет высоту и ширину, для того, чтобы это учесть, от координат рамки были вычтены соответственно половина ширины и высоты объекта. В данном примере достаточно было бы ввести одну переменную, равную радиусу круга.

Этот пример не отражает возможную деформацию объекта при столкновении с препятствием, что подходит, если вы изображаете бильярдные шары, но не резиновый мяч. Мы это учтем впоследствии на основании этого примера.

 

Hosted by uCoz