我有能力为玩家。我只希望玩家能够每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()相反),我想要比这个野蛮人代码更优雅的东西。有什么建议?谢谢!
答案 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
更精确,可以使用Stopwatch
或DateTime.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;
}
我在任何地方都使用静电,所以你不必担心你在哪里打电话,享受并制作出色的游戏