使用 c++(SDL2) 进行突破游戏 - 试图让球改变轨迹,但存在一些问题



我试图让球以一种非常基本的方式改变轨迹。基本上我尝试编码的是;如果球击中屏幕边缘x axis X或right axisdirection将相应地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;

最新更新