Понг отражатель математика? - PullRequest
0 голосов
/ 24 января 2012

Я делаю клон Понга и обрабатываю свои переменные следующим образом:

direction = a value from 0 to 2*pi 
distX = cos(direction)*speed of the ball
distY = sin(direction)*speed of the ball

on update:
ball's x position += distX
ball's y position += distY

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

Зависит ли это от того, куда он попадает на весло? Имеет ли значение, если весло движется? и т.д.

Я не знаю разумного способа справиться с математикой здесь.

Ответы [ 2 ]

1 голос
/ 24 января 2012

Нет «правильного» способа сделать это. Вы тот, кто пишет код, и если у вас нет строгих спецификаций, вы можете справиться с этим так, как предпочитаете.

По сути, вы можете справиться с столкновением шарик-лопасть точно так же, как вы справляетесь с столкновением шарик-стена, то есть просто вычислите угол отражения и присвойте его direction.

Если вы хотите увеличить угол отражения пропорционально скорости вращения лопастей, вы можете просто применить некоторый вес к новому direction.

Но это действительно зависит от вас.

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

0 голосов
/ 24 января 2012

Полагаю, ваши весла - это прямоугольники? Для простоты предположим, что мяч может ударить только по поверхности лопатки (то есть не по углам и не по бокам).

В: Зависит ли это от того, где он ударяет по веслу? A: Если лопатка представляет собой выровненный по оси прямоугольник, и мяч может ударить только о его поверхность, то нет.

В: Имеет ли значение, если весло движется? A: Это ваш выбор. Физика игры не настоящая физика, поэтому вы можете делать все, что делает игру лучшей.

Во-первых, вращение шара на 90 градусов не позволяет точно отклонить шар от стены. Рассмотрим крайний случай, когда мяч попадает в стену. Если бы я повернул шар на 90 градусов, то шар двигался бы параллельно стене.

Я верю в то, что вы в настоящее время делаете, и просто немного запутанно заявил, что если мяч ударяется о вертикальную стенку, вы меняете горизонтальное направление мяча. Это, конечно, не эквивалентно повороту шара на 90 градусов.

Если бы я хотел передать скорость от весла к мячу, я бы рассматривал движение мяча как вектор, а движение весла как вектор. Затем я бы добавил эти два вектора вместе. Чтобы контролировать, какая скорость передается мячу, я бы использовал коэффициент (назовем его k), и если шар должен поддерживать постоянную скорость, я бы нормализовал вектор конечной скорости мяча (но так как вы сохраняют скорость вместо компонентов x, y, в этом нет необходимости).

if (ball hits paddle):
  k = 0.5;
  // paddle only moves horizontally, which simplifies the math
  paddle_vx = paddle_speed * paddle_xdirection;
  ball_vx = cos(ball_direction) * speed + k*paddle_vx; 
  ball_vy = - sin(ball_direction) * speed // flips from the collision
  ball_direction = atan2(ball_vy, ball_vx);
  ball_speed = 100; // always constant
...