我的游戏有问题。它分为两种状态:GameState.MainMenu
和GameState.Playing
。
我想在我玩的时候在屏幕上绘制计时器。我使用gameTime.TotalGameTime.Minutes
和
gameTime.TotalGameTime.Seconds
变量。但当我点击按钮立即播放,我的游戏从GameState.MainMenu
切换到GameState.Playing
时,定时器从0开始。它从我在MainMenu度过的时间开始。我尝试创建下一个变量来计算时间,这是我在MainMenu中花费的时间,我尝试从第一个变量中减去,但显示时间不正确。
我的减法时间:
minutesPlaying = gameTime.TotalGameTime.Minutes; ;
secondsPlaying = gameTime.TotalGameTime.Seconds;
switch (currentGameState)
{
case GameState.MainMenu:
minutesMenu = gameTime.TotalGameTime.Minutes;
secondsMenu = gameTime.TotalGameTime.Seconds;
if (btnPlay.isTapped == true)
{
currentGameState = GameState.Playing;
soundEffectInstance.Stop();
}
btnPlay.Update(collection);
break;
case GameState.Playing:
minutesTotal = minutesPlaying - minutesMenu;
secondsTotal = secondsPlaying - secondsMenu;
break;
}
调用我的方法:
timer.Update(minutesTotal, secondsTotal);
更新方法:
public void Update(int min, int sec)
{
string seconds, minutes;
seconds = sec.ToString();
minutes = min.ToString();
if (sec <= 9) seconds = "0" + seconds;
if (min <= 9) minutes = "0" + minutes;
nowString = minutes + ":" + seconds;
}
感谢您的回答:)
答案 0 :(得分:0)
我会使用'StopWatch'来'开始'和'暂停'跟踪你在游戏状态下花费的时间。进入播放状态后,启动“StopWatch”,然后在离开该状态时暂停。
答案 1 :(得分:0)
你在正确的轨道上,但我认为你应该有一个时间传递变量而不必从原始gameTime
中减去它,这样如果你回到菜单,然后回到游戏中,你的方法不会被打破。基本上它只需要TimeSpan
为0并随着时间的推移添加gameTime
,为您提供在关卡中花费的时间。
首先添加新的TimeSpan
public TimeSpan TimePassed;
现在在Update()
内的case GameState.Playing:
方法中,您需要启用计时器。
TimePassed -= gameTime.ElapsedGameTime;
如果需要设置新级别,也可以将计时器重置为零(如果适用,例如:重放级别需要重置计时器)
现在用Draw()
方法渲染时间。
string timeString = TimePassed.Minutes.ToString("00") + ":" + TimePassed.Seconds.ToString("00");
spriteBatch.DrawString(FONT,timeString,POSITION,Color.White);
你去了!
答案 2 :(得分:0)
你应该只在播放状态下修改时间,我修改了代码来实现它,没有太多变化...... PlayTime保持在播放状态下经过的总时间。
TimeSpan Elapsed ;
switch (currentGameState)
{
case GameState.MainMenu:
if (btnPlay.isTapped == true)
{
currentGameState = GameState.Playing;
soundEffectInstance.Stop();
}
btnPlay.Update(collection);
Elapsed = TimeSpan.Zero;
break;
case GameState.Playing:
Elapsed = gametime.ElapsedGameTime;
break;
}
调用我的方法:
timer.Update(Elapsed);
更新方法:
TimeSpan PlayTime = TimeSpan.Zero;
public void Update(TimeSpan Elapsed)
{
PlayTime.Add(Elapsed);
string seconds, minutes;
seconds = PlayTime.Seconds.ToString();
minutes = PlayTime.Minutes.ToString();
if (sec <= 9) seconds = "0" + seconds;
if (min <= 9) minutes = "0" + minutes;
nowString = minutes + ":" + seconds;
}
答案 3 :(得分:0)
试试这个:
在游戏开始之前,您无需跟踪时间,因此我在minutesPlaying
中将secondsPlaying
和GameState.MainMenu
设置为0。不要在主minutesPlaying
函数中初始化secondsPlaying
和Update()
。
minutesPlaying = 0;
secondsPlaying = 0;
switch (currentGameState)
{
case GameState.MainMenu:
if (btnPlay.isTapped == true)
{
currentGameState = GameState.Playing;
soundEffectInstance.Stop();
}
btnPlay.Update(collection);
break;
case GameState.Playing:
secondsPlaying += gameTime.ElapsedGameTime.Seconds;
if (secondsPlaying >= 60)
{
minutesPlaying++;
secondsPlaying = 0;
}
break;
}
当您显示时间时,只需显示minutesPlaying
和secondsPlaying
。您不需要任何额外的变量。
如果这不起作用,您可以随时跟踪游戏开始时经过的毫秒数(secondsPlaying += gameTime.ElapsedGameTime.Milliseconds
)并将值除以1000以显示秒数。