Прыгающий мяч логика - PullRequest
6 голосов
/ 03 января 2012

У меня есть мяч, который отскакивает от стен.Этот отскок прост, я просто делаю это, (фрагмент кода)

if ( x - moveSpeed < 0 ) // Ball hit left wall
    xVel *= -1;

Однако у меня также есть прямоугольник, который перемещает игрок.Отскок на этом практически работает как отскок на стенах.

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

Извините за мои дрянные фотографии, надеюсь, они имеют смысл.Моя математика ржавая, поэтому мне действительно нужен толчок в правильном направлении.

Ответы [ 4 ]

9 голосов
/ 03 января 2012

Вот учебник по некоторой физике (это то, что вам нужно знать), и вам нужно узнать о векторах. Учебное пособие не описывает то, что вы ищете (отражение отскока и углов), но это БОЛЬШОЙ старт для начала, потому что вам нужно знать все это, чтобы закончить свой проект. 101

Если вы хотите сделать это простым способом, здесь - это код на c ++, который точно описывает, как делать то, что вы ищете.

Редактировать


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

6 голосов
/ 03 января 2012

Здесь нет необходимости в какой-либо причудливой математике.Мое понимание этих типов игр состоит в том, что угол, в котором мяч отрывается от весла, определяется тем, где на весле он отскакивает.Если он подпрыгивает в середине, то текущий угол сохраняется.Когда он подпрыгивает ближе к краю лопасти, угол регулируется в направлении этой стороны лопасти.Думайте о весле как о закругленной поверхности.

4 голосов
/ 03 января 2012

Идти по пути симуляции реальной физики (в отличие от ответа @ Treebranche, как я думаю, такие игры действительно работают) может быть очень сложно. Вы можете рассмотреть трение, вращение, продолжительность контакта и т. Д. Вот несколько ссылок, которые обсуждают это.

https://physics.stackexchange.com/questions/11686/finding-angular-velocity-and-regular-velocity-when-bouncing-off-a-surface-with-f

https://physics.stackexchange.com/questions/1142/is-there-a-2d-generalization-of-the-coefficient-of-restitution/

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

Этот код демонстрирует, как отскочить мяч назад или в другом направлении, изменив направление X или Y шара с ball.headingX=-ball.headingX и ball.headingY=-ball.headingY.

Применение теории на практике:

/* update ball's x heading */
ball.x+=ball.headingX;

/* update ball's y heading */
ball.y+=ball.headingY;

/* if ball at most right of screen then reverse ball's x heading */
if( (ball.x>PONG_SCREEN_RIGHT) )
{
    ball.headingX=-ball.headingX;

}

/* check if ball's location at top or bottom of screen,if true reverse ball's y heading */
if( (ball.y<PONG_SCREEN_TOP) || (ball.y>PONG_SCREEN_BOTTOM-2) ) 
{
   ball.headingY=-ball.headingY;
}



/* check if ball lands on pad, if true bounce back */
if ( (ball.y>= PlayersPad.LEFT) && (ball.y<= PlayersPad.RIGHT) && (ball.x==PlayersPad.x))
{
    ball.headingX=-ball.headingX;
    playersScore+=10;
}

/* let computer track ball's movement */
if (ball.x>PONG_SCREEN_RIGHT-18) computersPad.y=ball.y;


/* check if ball misses pad, if true display you missed */
if (ball.x<PONG_SCREEN_LEFT)
{
    displayYouMissed();
    ball.x=ball_Default_X;
    ball.y=ball_Default_Y;

}
...