Понг — алгоритм обнаружения отскока мяча и столкновения

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

введите здесь описание изображения

bool Ball::DetectCollision(Paddle p)
{
if(GetPosition().y >= p.GetPosition().y + p.GetSize().y
|| GetPosition().y + GetSize().y <= p.GetPosition().y
|| GetPosition().x >= p.GetPosition().x + p.GetSize().x
|| GetPosition().x + GetSize().x <= p.GetPosition().x)
{
    return false;
}

if(GetPosition().y <= p.GetPosition().y + p.GetSize().y )
{
    Bounce(-1,1);
}
else if(GetPosition().y + GetSize().x >= p.GetPosition().y)
{
    Bounce(-1,1);
}

else if(GetPosition().x + GetSize().x >= p.GetPosition().x )
{
    Bounce(1,-1);
}
else if(GetPosition().x <= p.GetPosition().x + p.GetSize().x)
{
    Bounce(1,-1);
}


    return true;
}

void Ball::Bounce(int a, int b)
{
    velocity = sf::Vector2f(velocity.x * a,velocity.y * b);
}

сначала вроде бы работает, потом я обнаружил, что он работает только по одной оси (если мяч ударяется о ракетку снизу или сверху, он не отскакивает должным образом, а отскакивает, как будто ударяется о переднюю поверхность ракетки). весло -> ^|)


person Athomield    schedule 26.12.2014    source источник


Ответы (3)


Мне кажется, что линия

else if(GetPosition().y + GetSize().x >= p.GetPosition().y)

должно быть

else if(GetPosition().y + GetSize().y >= p.GetPosition().y)

Обратите внимание на изменение GetSize().x на GetSize().y.

Посмотрим, решит ли это. Ваше здоровье!

person Rockbag    schedule 31.12.2014

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

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

  if(GetPosition().y > p.GetPosition().y + p.GetSize().y
|| GetPosition().y + GetSize().y < p.GetPosition().y
|| GetPosition().x > p.GetPosition().x + p.GetSize().x
|| GetPosition().x + GetSize().x < p.GetPosition().x)
{

Попробуйте добавить это условие не вложенным в конце

//Assuming origin at top-left of ball
if((GetPosition().x  + GetSize().y/2 < p.GetPosition().x + p.GetSize() //GetSize().y/2 to point at center
&& GetPosition().x + GetSize().y/2 > p.GetPosition().x) /*if x-cord is between paddle*/
&& (GetPosition().y + getSize() == p.GetPosition().y || 
GetPosition.y == p.GetPosition().y p.getSize())) /*if y-cord touches the top or bottom*/
     Bounce(1,-1); /*Bounce, change y velocity*/

Надеюсь, это работает, и я ответил на ваш вопрос.

person codingbash    schedule 26.12.2014
comment
Спасибо за ваши усилия, но, похоже, это не работает - person Athomield; 26.12.2014

Когда столкновение происходит в направлении y, мяч должен отскакивать обратно в направлении y, но вы делаете Bounce(-1,1), которое фактически отскакивает в направлении x, изменяя скорость в направлении x, и аналогично для других трех случаев. Ты должен сделать

 if((GetPosition().y <= p.GetPosition().y + p.GetSize().y )&& (GetPosition().y >= p.GetPosition().y))
 Bounce(1,-1);
person RE60K    schedule 31.12.2014