如何在c#monogame中制作一个计时键

如何在c#monogame中制作一个计时键,c#,timer,monogame,C#,Timer,Monogame,所以我试着制作一个计时器,在单人游戏中从30秒下降到0秒,但我不知道我怎么做。我对编程很陌生。我正在尝试将其放入我的枚举中,这样当计时器达到0时,它将从“播放”状态更改为“游戏结束” protected override void Update(GameTime gameTime) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || K

所以我试着制作一个计时器,在单人游戏中从30秒下降到0秒,但我不知道我怎么做。我对编程很陌生。我正在尝试将其放入我的枚举中,这样当计时器达到0时,它将从“播放”状态更改为“游戏结束”

protected override void Update(GameTime gameTime)
{
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed ||                
        Keyboard.GetState().IsKeyDown(Keys.Escape))
        Exit();
    
    switch (currentGameState)
    {
        case Gamestate.Start:
            timeSinceLastFrame += gameTime.ElapsedGameTime.TotalSeconds;

            if (timeSinceLastFrame >= timeBetweenFrame)
            {
                timeSinceLastFrame -= timeBetweenFrame;
                currentFrame.X++;
                if(currentFrame.X >= sheetSize.X)
                {
                    currentFrame.X = 0;
                    currentFrame.Y++;
                    if (currentFrame.Y>=sheetSize.Y)
                    {
                        currentFrame.Y = 0;
                    }
                }
            }

            posStone.Y = posStone.Y + 1;

            if (Keyboard.GetState().IsKeyDown(Keys.Enter))
            {
                currentGameState = Gamestate.Play;
            }

            break;
        case Gamestate.Play:

            


            break;
        case Gamestate.GameOver:
            break;
    }
}
你在课堂上看过了吗

下面是该类的一个示例,您可以将其复制并粘贴到LinqPad中以运行并进行实验

void Main()
{
    /* What this does is raise an event every 5 seconds, according to value set in the interval
    */
    var timer = new System.Timers.Timer(5000);
    timer.Elapsed += OnTimedEvent;
    timer.AutoReset = true; // Whether or not the event should be repeated
    timer.Enabled = true; // Starts the timer
}

void OnTimedEvent(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime);
}
方法1 我在一个游戏中使用了这种方法,在这个游戏中,我存储了一个代表世界游戏时间的未来日期时间,该日期时间具有一个未来的起点,并在我的MonoBehavior脚本中的每个Unity physics框架上更新。但是,总体思路可以用于您的场景中。如果你不需要在两次扑救之间储存游戏时间,那么这可能是过火了。在这种情况下,阅读方法2

存储游戏当前时间的结束时间和参考时间(游戏时间)。您可能希望将两者都存储为类属性

DateTime referenceTime;
DateTime endTime;
就在您将currentGameState设置为Gamestate.Play之前,您需要设置这些值

referenceTime = DateTime.Now; //Would be assigned from a global GameTime class object or your own custom game time
endTime = referenceTime.AddSeconds(30);
然后你会在每一个物理框架上更新你的参考时间。我使用毫秒而不是秒来表示准确度(),因为在我使用过的大多数游戏引擎中,帧更新往往在几分之一秒内发生。这将被置于游戏状态。游戏案例分支

referenceTime.AddMilliseconds(gameTime.ElapsedGameTime.TotalMilliseconds);
然后还需要在同一个case分支中执行检查(可能在最后一个代码段之后)

方法2 GameTime类有一个可选成员totalGameTime,它也是System.TimeSpan结构值(,)。因此,这意味着另一个选项是,您可以使用从开始到结束的总秒数作为游戏时间。参考值将再次存储为类成员,因为我们将存储游戏开始后的秒数,所以这次它现在是int

int referenceTime;
您可以在将currentGameState切换到Gamestate.Play之前设置参考时间。有其他方法可以做到这一点,但这可能是最简单的

referenceTime = gameTime.totalGameTime.TotalSeconds;
然后你会在你的游戏状态中添加一个复选框。同样地,你也会在游戏案例中添加一个复选框。如果您计划重复使用gameTime.totalGameTime.TotalSeconds,那么您可能希望将其存储在另一个变量中,以便于识别

if (gameTime.totalGameTime.TotalSeconds > referenceTime + 30) {
    currentGameState = Gamestate.GameOver;
}

“我正试图将其放入我的枚举中,因此当计时器达到0时,它将从“播放”状态更改为“游戏结束”--将什么放入哪个枚举中?在上面的代码中,您试图将游戏状态更改回
GameOver
?你的问题不清楚,也没有提供你迄今为止尝试过的证据。请改进它。可能是指switch语句,当它说*我正试图将其放入我的枚举*但是的,问题需要澄清。请不要发布“仅链接”的答案。突出的内容应该在答案中,您应该只链接以提供该内容的支持证据。在这种情况下,您应该演示OP如何使用用户
System.Timer
解决他们的问题。哦,我明白了,打得好。谢谢你的澄清,我现在就编辑我的回复!您在此处发布的代码如何向问题作者演示如何“将其放入我的枚举中,以便当计时器达到0时,它将从“播放”状态更改为“游戏结束”?我在这个答案中没有看到任何提及枚举、计时器达到
0
、或者游戏状态的变化。你似乎完全没有解决这个问题的任何具体目标。啊,这是公平的,我举了一个如何使用计时器的例子,但写一个倒计时的例子可能会更好。感谢您的反馈!只有当游戏时间与系统时间一致且没有停顿或其他因素时,这才有效。这将是一个简短的解决方案!应该提到应该在何处创建计时器(就在currentGameState*转换为*Gamestate.Play之前),并使参数与问题相关(例如,不需要自动重置)。此外,OnTimedEvent主体只是currentGameState=Gamestate.GameOver;。
if (gameTime.totalGameTime.TotalSeconds > referenceTime + 30) {
    currentGameState = Gamestate.GameOver;
}