【问题标题】:Smooth momentum slowdown in C++/SFML?C++/SFML 中的平滑动量减速?
【发布时间】:2012-10-15 21:47:15
【问题描述】:

我正在用 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 和 .y,在 .move 的 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);

【问题讨论】:

  • 重新编辑:我认为你当前的左/上漂移是基于你的“地板”操作——想想如果xSlowdown 从+0.05f 开始,并经历你的多次迭代会发生什么代码。如果你想让你的 sprite 完全停止,你应该在每个 if(){} 语句中添加一个测试:例如,如果减速将值从 &lt;0.f 更改为 &gt;0.f,它应该设置为完全 @987654339而是@。

标签: c++ math vector sfml


【解决方案1】:

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

Drag 根据速度施加力:最简单的方法是使用F = -K v 获得阻力系数K。因此,如果您的船的动量存储在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);

阻力和推力的结合有效地限制了您可以达到的速度(至少在没有重力辅助或其他东西的情况下......)。

【讨论】:

    【解决方案2】:

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

    您需要对加速度、速度和位置有一些概念。用户输入指示加速度。加速度改变速度,速度改变位置。

    顺便说一句:减速和加速之间没有区别。他们都是加速。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多