ОТСКОК ОТ ПРЕПЯТСТВИЙ отскок от вертикальных и горизонтальных препятствий
Бильярдный шар после удара о препятствие отскакивает по известной формуле - угол падения равен углу отражения. Однако этот угол не придётся вычислять, если препятствие вертикально или горизонтально. В этих случаях достаточно изменить значение одной из составляющих движения на противоположное. Проиллюстрирую на примере: В нашем примере нарисуйте рамку по периметру поля и замените код на следующий:
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, то свойству задаём соответствующее значение рамки и меняем направление движения на противоположное. В этом примере учтено, что объект имеет высоту и ширину, для того, чтобы это учесть, от координат рамки были вычтены соответственно половина ширины и высоты объекта. В данном примере достаточно было бы ввести одну переменную, равную радиусу круга.
Этот пример не отражает возможную деформацию объекта при столкновении с препятствием, что подходит, если вы изображаете бильярдные шары, но не резиновый мяч. Мы это учтем впоследствии на основании этого примера.