MonoGame的冷却能力

时间:2014-02-05 00:10:56

标签: c# xna delay monogame

我有能力为玩家。我只希望玩家能够每5秒钟使用一次此技能。我总是把它放在我的游戏循环中:

Update(GameTime gameTime)
{
    GamePadState controller = GamePad.GetState(PlayerIndex.One);
    cooldown--;
    if(cooldown <= 0 && controller.Buttons.A == ButtonState.Pressed)
    {
        UseAbility();
        cooldown = 5000;
    }
}

但是我正在寻找的东西恰好是5秒(与5000 update()相反),我想要比这个野蛮人代码更优雅的东西。有什么建议?谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用GameTime变量。你可以尝试这样的事情:

float cooldowntime = 0;
Update(GameTime gameTime)
{
    GamePadState controller = GamePad.GetState(PlayerIndex.One);

    cooldowntime += gameTime.ElapsedGameTime.TotalMilliseconds; 
    //if you are using XNA 3.1 or earlier, use GameTime.ElapsedRealTime

    if(cooldowntime >= 5000 && controller.Buttons.A == ButtonState.Pressed)
    {
         UseAbility();
         cooldowntime = 0;
    }
}

使用这个,每个更新方法,cooldowntime都会获得已经过去的游戏时间(以毫秒为单位)(如果你使用的是XNA 3.1,你可以使用ElapsedRealTime,这是“真实的时间”生命“过去了。如果你的生活速度低于60fps,这将非常有用。”然后,如果cooldowntime大于5000毫秒(5秒),则将为一种更新方法启用该功能。如果您想比GameTime.ElapsedGameTime.TotalMilliseconds更精确,可以使用StopwatchDateTime.Now。 HTH

注意:如果每次更新准确得到60fps,ElapsedGameTime应该非常准确。

编辑 要减少使用的行数,请尝试以下操作:

float cooldowntime = 0;
Update(GameTime gameTime)
{
    GamePadState controller = GamePad.GetState(PlayerIndex.One);

    cooldowntime = (cooldowntime >= 5000 && controller.Buttons.A == ButtonState.Pressed) ? 0 : cooldowntime + gameTime.ElapsedGameTime.TotalMilliseconds; 
    if (cooldowntime == 0) UseAbility(); 
    // we know to use the ability if cooldowntime = 0 since it will only equal zero
    // when cooldowntime >= 5000 and the button is pressed.
}

答案 1 :(得分:1)

简单例程,只需要等待你需要等待的毫秒数,在调用方面只需执行if语句: -

if(DelayGame(gameTime, 5000))
{
  // after 5 seconds
  // do this
}

这里是: -

private static bool delayFlag = false;
private static double delayTime = 0;

public static bool DelayGame(GameTime gameTime,int milliSeconds)
{
  if(delayFlag)
  {
    if(gameTime.TotalGameTime.TotalMilliseconds >= delayTime)
    {
      delayFlag = false;
      return true;
    }
  }
  else
  {
    delayFlag = true;
    delayTime = gameTime.TotalGameTime.TotalMilliseconds + milliSeconds;
  }
  return false;
}

我在任何地方都使用静电,所以你不必担心你在哪里打电话,享受并制作出色的游戏