使用 c++(SDL2) 的突破游戏 - 试图让球改变轨迹但有一些问题

Breakout game with c++(SDL2) - Trying to get ball to change trajectory with some issues

我试图让球以一种非常基本的方式改变轨迹。基本上我尝试编码的是;如果球在 x 或 right axis 上击中屏幕边缘 x axis,则 direction 将相应地 reverse。这个可以看这个functionstruct 包含球的 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;