C+的平稳动量减速+/SFML? 我正在用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--; }

C+的平稳动量减速+/SFML? 我正在用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--; },c++,math,vector,sfml,C++,Math,Vector,Sfml,如果您不熟悉SFML,sf::Vector2f有一个.x和.y,它们在sf::Sprite playerSprite的.move中使用.move相对于玩家当前位置移动玩家;因此,如果一个玩家在(5,0)处,而你做了player.move(sf::Vector2f(-1,0)),他们的坐标将是(4,0) 编辑: 作为一位朋友的建议,我现在有以下关于减速的代码。减速效果很好,但减速后,它又开始向左上方移动。这是什么原因造成的 if (plr.xSlowdown < 0.f) { plr

如果您不熟悉SFML,
sf::Vector2f
有一个
.x
.y
,它们在
sf::Sprite playerSprite
.move
中使用
.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);
if(plr.xSlowdown<0.f){
plr.xSlowdown+=0.1f;
}
如果(plr.xSlowdown>0.f){
plr.xSlowdown-=0.1f;
}
如果(plr.ySlowdown<0.f){
plr.ySlowdown+=0.1f;
}
如果(plr.ySlowdown>0.f){
plr.ySlowdown-=0.1f;
}
plr.xMomentum=地板(plr.xSlowdown);
plr.ymometum=地板(plr.ySlowdown);

你想要的是物理。非常简单的物理:F=ma

你需要对加速度、速度和位置有一些概念。用户输入决定加速度。加速度改变速度,速度改变位置


旁白:减速和加速之间没有区别。它们都是加速度。

如果你想让飞船在推进器关闭时减速,你应该增加阻力

阻力基于速度应用力:最简单的方法是对阻力系数
K
执行
F=-kv
。因此,如果你船的动量存储在
plr.xMomentum
plr.yMomentum
中,你的程序将是:

// note:  "dt" is your timestep;
//   if you don't have one, just choose some small value for "fraction", like 0.005
float fraction = drag_coefficient_K * dt;
plr.xMomentum -= fraction * plr.xMomentum;
plr.yMomentum -= fraction * plr.yMomentum;
加速将基于您的宇宙飞船的方向:

// note: "orientation" is the angle of your spaceship;
//   the units of orientation are determined by "angle_scale",
//   which should be chosen such that "angle_in_radians" is in radians...
float angle_in_radians = angle_scale * orientation;
float thrust_per_timestep = thrust_value * dt;
plr.xMomentum += thrust_per_timestep * cos(angle_in_radians);
plr.yMomentum += thrust_per_timestep * sin(angle_in_radians);

阻力和推力的组合有效地限制了你能达到的速度(至少在没有重力辅助或其他东西的情况下…。

重新编辑:我认为你当前的左/上漂移是基于你的“地板”操作——想想如果
xSlowdown
+0.05f
开始,会发生什么情况,并经历代码的多次迭代。如果您希望您的精灵完全停止,您应该在每个
If(){}
语句中添加一个测试:例如,如果减速将值从
0.f
更改,则应该将其设置为正好
0.f
// note: "orientation" is the angle of your spaceship;
//   the units of orientation are determined by "angle_scale",
//   which should be chosen such that "angle_in_radians" is in radians...
float angle_in_radians = angle_scale * orientation;
float thrust_per_timestep = thrust_value * dt;
plr.xMomentum += thrust_per_timestep * cos(angle_in_radians);
plr.yMomentum += thrust_per_timestep * sin(angle_in_radians);