Распознавание столкновений и отскок коробки - PullRequest
0 голосов
/ 29 декабря 2010

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

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

Это то, что я до сих пор придумал:

        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 ]

1 голос
/ 29 декабря 2010

Вы можете посмотреть на это двумя способами:

Углы: если вы знаете угол, под которым сталкивается шар, просто выполните угол 180, чтобы найти новый угол.

Градиент: возможно, проще. Вы должны перемещать мяч с определенными значениями dY и dX каждые t миллисекунды. так что если вы врежетесь в стену, вы можете просто играть с инвертирующими знаками dY и dX. Например, если вы нажмете правую стену, dX станет -dX, а dY продолжит свой курс.

1 голос
/ 29 декабря 2010

В этом KineticModel метод collideWalls() использует двумерную векторную арифметику для упрощения моделирования упругого столкновения между частицей и плоской поверхностью.

0 голосов
/ 12 апреля 2011

Спасибо @jbx, я знал, что есть более простой способ :) Однако, похоже, что это не работает для восточной и западной стен и весла (если они на этих стенах). Кажется, это работает для меня на восточной и западной стенах:

(180 - (angle + 90)) - 90.

, что упрощается до (180-angle). Надеюсь, это поможет.

0 голосов
/ 30 декабря 2010

Слово мудрости об использовании градиентного метода jbx. Если мяч попадает в угол коробки, а dx будет перевернут, dy может поместить мяч выше верхней границы.

...