Вот соответствующая логика, которую я использовал на понге на моей домашней странице : (пожалуйста, поиграйте в нее перед чтением, чтобы вы знали эффект, которого я достигаю с помощью следующего кода)
По существу, когда мяч сталкивается с веслом, его направление полностью игнорируется; ему дается новое направление в зависимости от того, как далеко от центра весла оно столкнулось. Если мяч попадает в лопатку прямо в центре, он удаляется точно горизонтально; если он ударяет прямо по краю, он улетает под крайним углом (75 градусов). И он всегда путешествует с постоянной скоростью.
var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;
Возьмите среднее значение Y весла и вычтите пересечение Y шара. Если весло имеет высоту 10 пикселей, это число будет между -5 и 5. Я называю это «относительным пересечением», потому что оно сейчас находится в «пространстве весла», пересечении мяча относительно середины весла.
var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;
Возьмите относительное пересечение и разделите его на половину высоты весла. Теперь наше число от -5 до 5 является десятичным от -1 до 1; это нормализовано . Затем умножьте его на максимальный угол, на который вы хотите, чтобы мяч отскочил. Я установил его на 5 * Пи / 12 радиан (75 градусов).
ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);
Наконец, рассчитайте новые скорости мяча, используя простую тригонометрию.
Это может быть не совсем тот эффект, к которому вы стремитесь, или вы можете также определить скорость, умножив нормализованное относительное пересечение на максимальную скорость; это заставило бы мяч двигаться быстрее, если он ударяется о край весла, или медленнее, если он ударяется о центр.
Возможно, я хотел бы получить некоторый код о том, как будет выглядеть вектор или как я могу сохранить переменную вектора, имеющую шары (скорость и направление).
Вектор содержит не только скорость, но и направление. Я храню свой вектор как "vx" и "vy"; то есть скорость в направлении х и скорость в направлении у. Если вы не прошли начальный курс по физике, это может показаться вам чуждым.
Причина, по которой я это делаю, заключается в том, что это уменьшает необходимые расчеты для каждого кадра; каждый кадр, который вы только что делаете, x += vx * time;
и y += vy * time;
где время - это время с последнего кадра, в миллисекундах (следовательно, скорости в пикселях на миллисекунду).
Что касается реализации способности изгибать мяч:
Прежде всего, вам нужно знать скорость весла в момент удара мяча; Это означает, что вам нужно отслеживать историю весла, чтобы вы могли знать одну или несколько из прошлых позиций весла, чтобы вы могли сравнить их с его текущим положением, чтобы увидеть, перемещалось ли оно. (изменение в положении / изменение во времени = скорость; вам нужно 2 или более позиций и время этих позиций)
Теперь вам также необходимо отслеживать угловую скорость шара, которая практически представляет собой кривую, по которой он движется, но эквивалентна реальному вращению шара. Аналогично тому, как вы будете интерполировать угол отскока от относительного положения мяча при столкновении с веслом, вам также необходимо будет интерполировать эту угловую скорость (или вращение) от скорости движения весла при столкновении. Вместо того, чтобы просто устанавливать вращение, как вы делаете с углом отскока, вы можете добавить или вычесть существующее вращение мяча, потому что это хорошо работает в играх (игрок может заметить, что шар вращается, и заставить его вращаться). еще более дико или противостоять вращению в попытке заставить его двигаться прямо).
Обратите внимание, однако, что, хотя это самый здравый смысл и, возможно, самый простой способ его реализации, реальная физика отскока не зависит исключительно от скорости объекта, по которому он попадает; объект без угловой скорости (без вращения), который ударяется о поверхность под углом, получит вращение на нем. Это может привести к лучшей игровой механике, так что вы можете захотеть разобраться в этом, но я не уверен в физике, стоящей за этим, поэтому я не буду пытаться объяснить это.