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--; }
如果您不熟悉SFML,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
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);