我试图让球以一种非常基本的方式改变轨迹。基本上我尝试编码的是;如果球在 x 或 右轴
上击中屏幕 x 轴
的边缘,方向
将反转
因此。这可以在这个 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;
关于c++ - 使用 c++(SDL2) 的突破游戏 - 试图让球改变轨迹但有一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36805929/