Привет, я написал этот простой алгоритм обнаружения и отражения столкновений, но столкновение обнаруживает у, как если бы это была ось х
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);
}
сначала он работает, я обнаружил, что он работает только по одной оси (если мяч падает на лопасть снизу или сверху, он не отскакивает должным образом, а движется так, как если бы он ударялся о переднюю поверхность весло -> ^ |)
Мне кажется, что линия
else if(GetPosition().y + GetSize().x >= p.GetPosition().y)
должно быть
else if(GetPosition().y + GetSize().y >= p.GetPosition().y)
Обратите внимание на изменение с GetSize (). X на GetSize (). Y
Посмотрим, решит ли это это. Ура!
Чтобы добавить обнаружение столкновений к верхней или нижней части весла (при условии, что вы имеете в виду самый верх или низ, а не переднюю поверхность), попробуйте немного изменить свои условия в начале и добавить новый в конце.
Во-первых, избавьтесь от знаков равенства в вашем начальном состоянии.
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*/
Надеюсь, это работает, и я ответил на ваш вопрос.
Когда столкновение происходит в y dir, мяч должен отскочить назад в y, но вы делаете Bounce(-1,1)
который фактически отскакивает от него в направлении x, изменяя скорость в направлении x и аналогично для других трех случаев.
Ты должен сделать
if((GetPosition().y <= p.GetPosition().y + p.GetSize().y )&& (GetPosition().y >= p.GetPosition().y))
Bounce(1,-1);