Распознавание столкновений и отскок коробки
Я делаю понг, и мне действительно трудно написать алгоритм, который правильно отскакивает мяч от четырех стенок (я буду иметь дело с забиванием мячей позже, потому что только часть с запада + восточная сторона будет целями). Поэтому сейчас я хочу, чтобы мяч отскочил от штрафной.
Легко определить, попал ли мяч в стену, но у меня возникли проблемы с вычислением нового угла.
Это то, что я придумал до сих пор:
if(dstY == 0) {
// North wall
if(angle < 90) {
newAngle = angle + 90;
} else {
newAngle = angle - 90;
}
} else if(dstX == maxWidth) {
// East wall
if(angle < 90) {
newAngle = angle + 270;
} else {
newAngle = angle + 90;
}
} else if(dstY == maxHeight) {
// South wall
newAngle = angle + 90;
} else if(dstX == 1) {
// West wall
if(angle < 270) {
newAngle = angle - 90;
} else {
newAngle = angle - 270;
}
}
Это работает только для примерно половины столкновений и выглядит действительно ужасно. Я уверен, что это должно быть действительно просто и что это было сделано много раз прежде.
В моем коде dstX/dstY - это координаты назначения X/Y. X=0 и y=0 вверху слева.
4 ответа
Вы можете посмотреть на это двумя способами:
Углы: если вы знаете угол, под которым сталкивается шар, просто выполните угол 180, чтобы найти новый угол.
Градиент: возможно, проще. Вы должны перемещать мяч с определенными значениями dY и dX каждые t миллисекунды. так что если вы ударите о стену, вы можете просто играть с инвертирующими знаками dY и dX. Например, если вы попали в правую стену, dX становится -dX, а dY продолжает свой курс.
В этом KineticModel
, метод collideWalls()
использует двумерную векторную арифметику, чтобы упростить моделирование упругого столкновения между частицей и плоской поверхностью.
Слово мудрости об использовании градиентного метода jbx. Если мяч попадет в угол коробки, а dx будет перевернут, dy может поместить мяч выше верхней границы.
Спасибо @jbx, я знал, что есть более простой способ:) Однако, это не похоже на восточные и западные стены и весла (если они на этих стенах). Кажется, это работает для меня на восточной и западной стенах:
(180 - (angle + 90)) - 90.
что упрощает просто (180-angle)
, Надеюсь, это поможет.