【问题标题】:Speed up/Slow down an object once it collides with an object物体与物体碰撞后加速/减速
【发布时间】:2015-04-10 18:40:51
【问题描述】:

我目前正在开发一个 2D 平台游戏,我想知道是否可以得到任何提示,说明如何提高一个对象在与另一个对象碰撞后几秒钟内的移动速度。

【问题讨论】:

  • 我认为关键是命名速度(对不起我不是xna coder),但基本上所有主要的图形引擎都使用这个术语。
  • 我知道速度这个词,不过谢谢。
  • 在碰撞前将物体的速度存储在一个向量中,然后用一个因子增加它(这听起来应该是正确的):))
  • 不是 100% 确定您所说的因素是什么意思。

标签: xna 2d collision


【解决方案1】:

首先你需要一个叫做velocity的变量

Vector2 velocity = new Vector2(0.0f, 0.0f);

每次更新,你都会根据速度改变精灵的矩形。

rectangle.X += (int)velocity.X;
rectangle.Y += (int)velocity.Y;

然后,你可以随心所欲地改变速度,它会改变速度。

//slow down
velocity.X -= 10;
velocity.Y -= 10;
//speed up
velocity.X += 10;
velocity.Y += 10;

您还可以单独更改速度的 X 和 Y 值,如下所示:

velocity.Y += 10;

这将使精灵在输入时向下移动。 希望这有帮助!如果您需要任何说明,请告诉我!

【讨论】:

    【解决方案2】:

    首先你想让它对碰撞做出反应,所以在你用来检测碰撞的方法中,在你的对象中添加一个对新方法的调用。我们称之为 SpeedUp()。它应该看起来像这样:

    public void SpeedUp()
    {
        _speedUpTimer = 0;
        IsSpedUp = true;
        _maxVelocity.X = SpedUpVelocity.X;
    }
    

    其中 _speedUpTimer 是对象类中的变量(或任何处理运动的组件),_maxVelocity 是保持对象最高速度的任何变量,而 SpedUpVelocity 是保持更快速度的常数或变量。 IsSpedUp 应初始化为 false。您还需要一个常量或变量来保存您希望对象更快的时间量,例如 SpeedUpTime。

    然后,在对象的 Update() 中,添加行

    _speedUpTimer += gameTime.ElapsedGameTime.Milliseconds;
    if (IsSpedUp && _speedUpTimer > SpeedUpTime)
    {
        _maxVelocity.X = UsualMaxVelocity.X;
        IsSpedUp = false;
    }
    

    UsualMaxVelocity 将保存您的对象之前的非加速最大速度,您的对象将在计时器结束后返回使用该速度。

    当然,你总是可以增加你的 Y 速度,但我假设你只是想要水平速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多