Столкновения ActionScript: решение исключений и странных случаев - PullRequest
2 голосов
/ 16 июля 2010

Я создал класс столкновений для обнаружения столкновений с использованием пикселей.В моем классе я также разработал некоторые функции для определения угла столкновения.Основываясь на этом, я создал несколько примеров:

http://megaswf.com/serve/25437/

http://megaswf.com/serve/25436/

(пространство для изменения силы тяжести, вправо / влево, чтобы придать мячу некоторую скорость.)

Как вы, вероятно, заметите, происходят странные вещи:

  • Когда скорость мяча очень низкая
  • Когда направление мяча почти касательнодо препятствия.

столкновение http://img514.imageshack.us/img514/4059/colisao.png

На изображении выше показано, как рассчитать угол столкновения.Я называю красные точки ключевыми точками.Я ищу максимальное количество ключевых точек (обычно 4).Если я нахожу более 2 ключевых точек, я выбираю 2 самые дальние (как показано на одном из синих объектов).Вот как я тогда нахожу нормальный угол, где на поверхности столкнулся объект.Я не знаю, является ли это устаревшим способом выполнения действий.

на основе этого угла я поворачиваю вектор скорости, чтобы выполнить подпрыгивание.

Кусок кода для выполнения математических операцийздесь:

static public function newSpeedVector(speedX: Number, speedY: Number, normalAngle: Number): Object{
            var vector_angle: Number = Math.atan2(speedY, speedX) * (180/Math.PI);
            var rotating_angle: Number = (2*(normalAngle - vector_angle) + 180) % 360;
            var cos_ang: Number = Math.cos(rotating_angle/DEGREES_OF_1RAD);
            var sin_ang: Number = Math.sin(rotating_angle/DEGREES_OF_1RAD);
            var final_speedX: Number = speedX * cos_ang - speedY * sin_ang;
            var final_speedY: Number = speedX * sin_ang + speedY * cos_ang;

            return {x_speed: final_speedX, y_speed: final_speedY};
        }

Вот как рассчитывается новый вектор скорости ...

Мой вопрос: кто-нибудь сталкивался с подобной проблемой или имеет представление о том, как ее избежать?от происходящего?

Ответы [ 3 ]

3 голосов
/ 16 июля 2010

Не видя ваш код, это лучшее, что я могу предоставить.

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

Когда происходит столкновение, важно, по крайней мере, попытаться исправить любое проникновение.Это, скорее всего, причина, почему касательные столкновения ведут себя странно.Попытайтесь отодвинуть сталкивающийся объект от того, что он ударил разумным образом.

Ваш метод определения нормального уровня должен работать нормально.Физика игры - это все обманывают (обманывают так, что все еще выглядит хорошо).Я считаю, что вращение и трение не являются частью того, что вы собираетесь?

Попробуйте это.У тебя нормальный контакт.Когда вы обнаружите столкновение, рассчитайте глубину проникновения и перемещайте ваш объект по нормали, чтобы он больше не проникал.Вы можете использовать две точки, которые вы уже рассчитали, чтобы получить одну точку проникновения, вам нужно будет рассчитать и другую.Для кругов это легко (центральная точка + радиус в направлении нормали).Есть более сложные способы решения этой проблемы, но посмотрите, подходит ли вам этот простой метод.

Я прочитал и рекомендую эту книгу: Разработка движка игровой физики

1 голос
/ 16 июля 2010

Я сделал что-то вроде этого и получил похожую проблему. Что я сделал, так это то, что когда пиксели от прыгающего объекта (мяч в вашем случае) перекрываются с пикселями от препятствия, вам нужно переместить шар из препятствия, чтобы они не перекрывались.

Скажем, мяч катится по препятствию, прежде чем снова сделать мяч, вам нужно отодвинуть его назад на величину «перекрытия». Если вы знаете, под каким углом мяч попал в мрачный круг, просто переместите его вдоль этого угла.

Вам также нужно добавить некоторое демпфирование, иначе мяч никогда не остановится. Примите (очень) небольшое значение, если скорость мяча ниже этого значения, установите скорость на 0.

0 голосов
/ 05 августа 2016

Вы можете попробовать еще одну вещь, которая я считаю очень эффективной.

Вы можете сделать такие функции, как getNextX () и getNextY () (которые, конечно, дают их координаты, согласованные после следующего обновления) в ваших игровых объектах и ​​проверять столкновение объектов на основе их следующей позиции вместо их текущей позиции.

Таким образом, объекты никогда не будут перекрываться, вы будете знать, когда они вот-вот столкнутся, и изящно примените свою физику после столкновения!

...