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

标签 c++ sdl-2

我试图让球以一种非常基本的方式改变轨迹。基本上我尝试编码的是;如果球在 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/

相关文章:

C++ 内联程序集运行时检查失败 #0

c++ - 尝试将 SDL 2 与 Visual Studio c++ 一起使用

sdl - SDL_RenderClear 的作用是什么?

c++ - 为什么我在所有像素的双 for 循环中使用 SDL2 和 SDL_RenderCopy 时性能不佳?

c - 为什么链接 sdl2 和 udev 会导致段错误?

c++ - 如何使GCC(C++)停止简化算术表达式?

c++ - 假设每个静态库都定义了导出的功能 (vc++ 2008),如何将多个静态链接库合并到一个 dll 中?

c++ - 如何在 C++ 中的 .so 文件中包含一个库

c++ cin only boolean(0,1)

C SDL2 Mixer 从指针播放 Wav