У меня есть эта игра "Стиль Брейкаут".
У меня есть пушка в центре, блоки вокруг пушки и колодки вокруг блоков. Вот как выглядит игра:
Мне удалось получить столкновение на пиксель, и мой мяч « отражается » при контакте с блоками со следующей математикой:
Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;
Где синяя линия - направление шара, а черная линия (базовая линия) - поверхность блока.
Направление - это угол, выраженный в радианах (который, конечно, можно преобразовать в градусы).
Мяч перемещается:
// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;
Все идет нормально.
Моя проблема возникает сейчас, с колодками (3 темные и большие блоки вокруг маленьких цветных блоков).
Когда они поворачиваются, угол поверхности меняется.
Более того, мяч должен ударить по сторонам, так как я могу измерить направление удара и новое направление движения мяча?
PS : При необходимости, я могу предоставить код и воспроизводимый SWF.
редактировать
Хорошо, проблема с углами была решена с помощью Векторов , но у меня все еще есть проблема со сторонами и задним столкновением.
Я открою для этого еще один вопрос и свяжу его здесь.
источник
Ответы:
Я не уверен, правильно ли я понял вашу проблему, но я предположил, что вы хотите найти направление движения вашего мяча после столкновения.
Вот быстрый рисунок на моей белой доске, который показывает возможное решение для этого:
Зеленые стрелки представляют скорость шара (как вектор), синие блоки представляют ваши большие черные блоки, а красная стрелка - результирующий вектор.
В первом случае синий блок имеет наклон 30 градусов. Один из способов решения проблемы столкновения - вернуть все на горизонтальную ось. Вам нужно повернуть все на 30 градусов (угол наклона блока) (для этого вы можете использовать матрицы).
Затем проверьте , где столкновение было с . Если столкновение было горизонтальным, обратные х - компонента скорости. Если бы это была вертикальной (как в данном случае), то у компонента (
ball.Velocity.Y = -ball.Velocity.Y
). Это также заставит шар действовать правильно, когда он ударяет по углам (он перевернет оба компонента). После этого, вы просто должны Вращать Вернуться к реальной ситуации (которая не находится на чертеже).Во втором случае это то же самое, за исключением того, что скорость мяча не перпендикулярна блоку. Вы поворачиваетесь на 70 градусов, проверить, где столкновение было с, и поменять местами соответствующие компоненты. После вы вернетесь к своей реальной ситуации.
Примечание: я заметил, что вы используете угол вместо вектора. Вы можете просто создать вектор для этих вычислений или сохранить ту же общую идею, но работать с углами.
Это, конечно, не лучший способ, и я уверен, что вы можете просто рассчитать его каким-то образом, но я думаю, что это возможное решение вашей проблемы.
источник
-block inclination angle
чтобы получить соответствующую реакцию на столкновение.Direction
(как вектор) и обновить положение шара примерно так:ball.Position += ball.Direction * ball.Speed;
.