Угол отражения

11

У меня есть эта игра "Стиль Брейкаут".

У меня есть пушка в центре, блоки вокруг пушки и колодки вокруг блоков. Вот как выглядит игра:

Круговой прорыв

Мне удалось получить столкновение на пиксель, и мой мяч « отражается » при контакте с блоками со следующей математикой:

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

Изображение, изображающее расчет угла отражения

Где синяя линия - направление шара, а черная линия (базовая линия) - поверхность блока.

Направление - это угол, выраженный в радианах (который, конечно, можно преобразовать в градусы).
Мяч перемещается:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

Все идет нормально.

Моя проблема возникает сейчас, с колодками (3 темные и большие блоки вокруг маленьких цветных блоков).

Когда они поворачиваются, угол поверхности меняется.
Более того, мяч должен ударить по сторонам, так как я могу измерить направление удара и новое направление движения мяча?

PS : При необходимости, я могу предоставить код и воспроизводимый SWF.


редактировать

Хорошо, проблема с углами была решена с помощью Векторов , но у меня все еще есть проблема со сторонами и задним столкновением.

Я открою для этого еще один вопрос и свяжу его здесь.

NemoStein
источник
3
Если вы реассоциируете ваши счета, вы должны получить бонус +100 репутации. Это должна быть опция на вашей вкладке Аккаунты вашего профиля. В то же время, я выложу эти изображения для вас.
Грейс Примечание
Я понимаю, что ваше направление - это угол между 0 и 360, и для перемещения мяча вы используете тригонометрию?
Джонатан Коннелл
@Grace, Большое спасибо за изображения ... @ 3nixios, я добавил больше информации об угле и движении.
NemoStein
Если вы храните только одно «направление» в блоке, возможно , вы переосмыслить каждый черный блок , как группа из четырех отдельных блоков, где «направление» лицо всегда обращена наружу. Вероятно, были бы крайние случаи в четырех углах.
Хоратио

Ответы:

8

Я не уверен, правильно ли я понял вашу проблему, но я предположил, что вы хотите найти направление движения вашего мяча после столкновения.

Вот быстрый рисунок на моей белой доске, который показывает возможное решение для этого:

введите описание изображения здесь

Зеленые стрелки представляют скорость шара (как вектор), синие блоки представляют ваши большие черные блоки, а красная стрелка - результирующий вектор.

В первом случае синий блок имеет наклон 30 градусов. Один из способов решения проблемы столкновения - вернуть все на горизонтальную ось. Вам нужно повернуть все на 30 градусов (угол наклона блока) (для этого вы можете использовать матрицы).

Затем проверьте , где столкновение было с . Если столкновение было горизонтальным, обратные х - компонента скорости. Если бы это была вертикальной (как в данном случае), то у компонента ( ball.Velocity.Y = -ball.Velocity.Y). Это также заставит шар действовать правильно, когда он ударяет по углам (он перевернет оба компонента). После этого, вы просто должны Вращать Вернуться к реальной ситуации (которая не находится на чертеже).

Во втором случае это то же самое, за исключением того, что скорость мяча не перпендикулярна блоку. Вы поворачиваетесь на 70 градусов, проверить, где столкновение было с, и поменять местами соответствующие компоненты. После вы вернетесь к своей реальной ситуации.

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

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

Джесси Эмонд
источник
Спасибо ... Очень понравилась твоя доска. Я попробую через минуту ... Ан, а вы думаете, что векторы лучше поддерживать / работать с ??
NemoStein
Хаха, прости мои плохие навыки рисования.
Джесси Эмонд,
Ой, я на самом деле забыл важный шаг при рисовании. Вам нужно повернуть назад, -block inclination angleчтобы получить соответствующую реакцию на столкновение.
Джесси Эмонд,
Я предполагаю, что это о личных предпочтениях, но я предпочитаю векторы много. Вам просто не нужно думать о математике, стоящей за ними большую часть времени, и это обычно делает код чище. Таким образом , вы могли бы держать Direction(как вектор) и обновить положение шара примерно так: ball.Position += ball.Direction * ball.Speed;.
Джесси Эмонд,
@ Джесси, я не мог сделать это до сих пор. Я прекрасно понял ваш метод, но не смог его реализовать. Чтобы сделать это, мне нужно переписать всю часть, использующую радианные углы, для использования векторов (на самом деле это немного). Сейчас я попробую другие варианты, и если у вас есть другой, я буду рад попробовать. Спасибо.
NemoStein