Математика рефлектора понга?

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

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 градусов), но как насчет весла? Я не знаю, как лучше всего управлять углом и скоростью мяча после того, как он коснется мяча.

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

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


person John Smith    schedule 24.01.2012    source источник
comment
Это принадлежит бирже разработчиков игр.   -  person erisco    schedule 24.01.2012


Ответы (2)


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

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

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

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

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

person Pietro Lorefice    schedule 24.01.2012
comment
Сейчас я держу скорость своего весла постоянной. Движение в любом направлении будет перемещать весло с одинаковой скоростью. - person John Smith; 24.01.2012
comment
Ну, в таком случае я действительно не вижу необходимости увеличивать или уменьшать скорость мяча. Однако вы можете ускорить мяч, если ракетка ударится около угла. Нетрудно получить точку столкновения и увеличить ball speed на ее основе. - person Pietro Lorefice; 24.01.2012
comment
Моя забота помимо этого - рыбалка. Должны ли углы изменяться в зависимости от того, где он попадает на весло? Если да, то как разумно его изменить? - person John Smith; 24.01.2012
comment
Первое, что я рекомендую, это попробовать поиграть в клон Pong. Посмотрите внимательно, как ведет себя мяч, когда он ударяется о ракетку. Помимо этого, я думаю, что обычно угол становится шире, когда по мячу ударяет быстро движущаяся ракетка, а не неподвижная. Поэтому я думаю, что это может быть хорошей отправной точкой. Затем вы можете настроить его так, как вы предпочитаете. - person Pietro Lorefice; 24.01.2012
comment
Меня беспокоит то, что, поскольку я управляю веслом с помощью клавиатуры, скорость весла постоянна. Следовательно, каждый раз, когда весло движется и мяч ударяется о него, будет ли он каждый раз менять мяч одним и тем же образом? - person John Smith; 24.01.2012
comment
Нет, если вы сделаете изменение скорости зависящим от места столкновения, т.е. если мяч ударится о ракетку рядом с одним из ее краев, приращение (или уменьшение) скорости будет больше. - person Pietro Lorefice; 24.01.2012
comment
Я думаю, что это подход, который я хочу использовать, но я не знаю, как лучше всего математически изменить направление/скорость, поскольку в настоящее время я обрабатываю вещи так, как я изложил в своем OP. Возможно, мне нужны разные переменные скорости для X и Y? - person John Smith; 24.01.2012

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

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

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

Во-первых, вращение мяча на 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
person erisco    schedule 24.01.2012
comment
Я должен уточнить (поскольку я, вероятно, оговорился): когда я сталкиваюсь со стеной, все, что я делаю, это меняю направление на отрицательное. Даже если я инициализирую мяч, направляющийся прямо к стене, он будет вечно прыгать туда-сюда между стенами. - person John Smith; 24.01.2012