我试图让球以一种非常基本的方式改变轨迹。基本上我尝试编码的是;如果球击中屏幕边缘x axis
X或right axis
,direction
将相应地reverse
。这可以从这个function
中看到。一个struct
包含球的pos_
、speed_
和dir_
,枚举包含directionx
。但是,球只是移动到屏幕边缘并且不会移动。我将不胜感激任何关于这如何不起作用的光线。
void MoveBall()
{
for (auto &p : ball)
{
if (p.dir == Direction::Directionx)
{
p.pos.x += p.speed;
p.pos.y -= p.speed;
if ((p.pos.x >= sizeX) || (p.pos.x <= 20))
{
p.pos.x -= p.speed;
p.pos.y += p.speed;
}
if ((p.pos.y >= sizeY) || (p.pos.y <= 20))
{
p.pos.y += p.speed;
p.pos.x -= p.speed;
}
}
}
我不确定if (p.dir == Direction::Directionx) {...}
的目的是什么,但似乎问题出在代码的这一部分
p.pos.x += p.speed;
p.pos.y -= p.speed;
if ((p.pos.x >= sizeX) || (p.pos.x <= 20))
{
p.pos.x -= p.speed;
p.pos.y += p.speed;
}
if ((p.pos.y >= sizeY) || (p.pos.y <= 20))
{
p.pos.y += p.speed;
p.pos.x -= p.speed;
}
当这两个 if 语句之一为真时,您的函数实际上什么都不做,因为 if 语句中的代码会使前面的语句无效
p.pos.x += p.speed;
p.pos.y -= p.speed;
所以当你点击屏幕边缘时,你实际上设置了
p.pos.x += 0;
p.pos.y -= 0;
因此,请确保在其中一个 if 语句为真时不执行前两个更新语句。编辑:设置反向速度的更好方法是
p.speed *= -1;