Java - физика прорыва, направление мяча при столкновении весла?

Я создаю игру Breakout, чтобы познакомиться с Java. В настоящее время у меня все работает, но я заметил, что мяч летит в том же направлении.

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

Как сделать столкновение более реалистичным?

Когда мяч попадает в левую сторону ракетки, я хочу перенаправить его обратно влево, но я не уверен, под каким углом его отразить. Может ли кто-нибудь предоставить формулу, которая поможет мне определить угол, под которым мне нужно направить мяч при контакте с левой или правой стороной весла?


person user3422952    schedule 16.04.2014    source источник
comment
Не могли бы вы показать нам свой код столкновения? Может быть проще увидеть, что вы спрашиваете с ним.   -  person user3507600    schedule 16.04.2014
comment
возможный дубликат Ball to Ball Collision — обнаружение и обработка   -  person Michael    schedule 16.04.2014
comment
Я подозреваю, что вопрос заключается в том, как позволить пользователю немного изменить направление, а не просто изменить направление Y при ударе по веслу. В противном случае мяч просто попадет в простой узор и по некоторым кирпичикам будет трудно или даже невозможно попасть. Я столкнулся с той же проблемой несколько десятилетий назад на Apple ][, используя Integer BASIC.   -  person Fred Larson    schedule 16.04.2014
comment
@FredLarson - это именно то, что я имею в виду. Не могли бы вы предоставить свое решение (хотя это было несколько десятилетий назад)?   -  person user3422952    schedule 16.04.2014
comment
@ user3422952: Я не думаю, что когда-либо решал эту проблему тогда. С графикой низкого разрешения 40x40 было не так много хороших вариантов направления мяча. Мяч был буквально одним большим толстым пикселем. Любое движение, кроме горизонтального, вертикального или диагонального, и мяч будет выглядеть так, как будто он действительно поднимается по лестнице. Современные разрешения экрана предлагают лучшие возможности. Смотрите мой ответ для предложения.   -  person Fred Larson    schedule 16.04.2014


Ответы (4)


Если мяч ударяется о ракетку сверху, отрицайте Y скорость.

Если мяч ударяется о ракетку сбоку, отрицайте X скорость.

person thumbmunkeys    schedule 16.04.2014

Изменение вертикальной скорости на противоположное — правильное решение для идеально упругого столкновения, чего вы и хотите. в игре прорыва (мяч сохраняет свою полную скорость после столкновения).

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

Чтобы сделать последнее, вам нужно вычислить абсолютное положение, в котором мяч ударяется о площадку, нормализовать его (путем вычитания позиции площадки и деления на длину площадки) и сопоставить ее с диапазоном углов (возможно, от -80 до 80 градусов). . Затем вы можете рассчитать желаемые горизонтальные и вертикальные скорости, используя тригонометрические функции.

person loopbackbee    schedule 16.04.2014

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

person Fred Larson    schedule 16.04.2014

Здесь задействованы две отдельные проблемы: проблема дизайна и проблема физики. В конце концов, проблема физики может иметь более простое решение:

  1. Вычислите точку столкновения на весле
  2. Вычислите мгновенную горизонтальную скорость pvx весла.
  3. Вычислите нормированную нормаль к внешней поверхности (nx,ny) в точке удара. Это конструктивное решение, в средней части лопасти, вероятно, нужно (nx,ny)=(0,1), а слева (nx,ny)=(-1,0) или вообще в направлении ЗСЗ , в правой части соответственно (nx,ny)=(1,0) или в общем положении ВСВ.
  4. Используйте формулу физики для столкновения с движущимся бесконечно массивным объектом, чтобы вычислить новый вектор скорости (vx,vy):

    dot = nx*(vx-pvx)+ny*vy
    vx = vx - 2*dot*nx
    vy = vy - 2*dot*ny
    

    Можно проверить, является ли скалярное произведение dot положительным, чтобы избежать ложных вычислений столкновения, если ракетка и мяч не разделяются достаточно быстро после столкновения.

person Lutz Lehmann    schedule 21.04.2014