使用 c++(SDL2) 的突破游戏 - 试图让球改变轨迹但有一些问题
Breakout game with c++(SDL2) - Trying to get ball to change trajectory with some issues
我试图让球以一种非常基本的方式改变轨迹。基本上我尝试编码的是;如果球在 x 或 right axis
上击中屏幕边缘 x 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;
我试图让球以一种非常基本的方式改变轨迹。基本上我尝试编码的是;如果球在 x 或 right axis
上击中屏幕边缘 x 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;