我正在用 C++ 和 SFML 制作一个“小行星”游戏,我想知道平滑的动量减速和加速。在最初的游戏中,当你向一个方向移动时,你会建立“动量”,当按钮被按住时它会增加,当你松开按钮时它会减少。我已经开始了我自己的版本。目前我有一个sf::Vector2f
包含船的动力。它可以是消极的或积极的。问题是,我无法正确实现减速(我什至还没有尝试过加速)。我尝试了以下方法;
if (plr.momentum.x < 0) {
plr.momentum.x++;
}
if (plr.momentum.x > 0) {
plr.momentum.x--;
}
if (plr.momentum.y < 0) {
plr.momentum.y++;
}
if (plr.momentum.y > 0) {
plr.momentum.y--;
}
这样,移动后,玩家会慢慢拖到窗口的左上角(坐标0,0)。我认为这是因为浮点数可以是,例如 0.05,满足“超过 0”的 if 语句。从这里,它需要一个,使它成为一个负数。下一个 if 语句向它添加一个,并且不断循环。负x
动量使您向左移动,负y
动量使您向上移动,反之亦然。我想知道平滑减速和加速背后的方法。
如果您想/想知道,我使用以下代码根据其动量移动播放器;
playerSprite.move(plr.momentum);
如果你对 SFML 不熟悉,sf::Vector2f
有一个.x
and .y
,在.move
of中使用sf::Sprite playerSprite
。.move
相对于当前位置移动玩家;因此,如果玩家在 (5,0),而您这样做player.move(sf::Vector2f(-1,0))
,他们的坐标将是 (4,0)。
编辑:作为朋友的建议,我现在有以下减速代码。减速效果很好,但是在减速之后,它又开始向左上方移动。这是什么原因造成的?
if (plr.xSlowdown < 0.f) {
plr.xSlowdown += 0.1f;
}
if (plr.xSlowdown > 0.f) {
plr.xSlowdown -= 0.1f;
}
if (plr.ySlowdown < 0.f) {
plr.ySlowdown += 0.1f;
}
if (plr.ySlowdown > 0.f) {
plr.ySlowdown -= 0.1f;
}
plr.xMomentum = floor(plr.xSlowdown);
plr.yMomentum = floor(plr.ySlowdown);