【问题标题】:How to make a timer that ticks down in c# monogame如何在c#monogame中制作一个计时的计时器
【发布时间】:2020-10-06 21:52:57
【问题描述】:

所以我正在尝试制作一个计时器,它会在单人游戏中从 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;
    }
}

【问题讨论】:

  • “我正在尝试将它放入我的枚举中,因此当计时器达到 0 时,它会将状态从播放更改为游戏结束” - 将什么放入什么枚举中?在上面的代码中,您试图将游戏状态更改回GameOver?您的问题不清楚,并且没有提供您迄今为止尝试过的证据。请改进它。
  • 可能是指 switch 语句,当它被说 * 我试图把它放入我的枚举 * 但是是的,这个问题需要澄清。

标签: c# timer monogame


【解决方案1】:

方法一

我在一个游戏中使用了这种方法,我存储了一个代表世界游戏时间的未来 DateTime 和一个未来的起点,并在我的 Monobehaviour 脚本中的每个 Unity 物理帧上更新。但是,可以在您的场景中使用总体思路。如果您不需要在保存之间存储游戏时间,那么这可能是矫枉过正。在这种情况下阅读方法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);

然后您将在每个物理帧上更新您的参考时间。我使用毫秒而不是秒来获得准确性 (GameTime Documentation),因为在我使用过的大多数游戏引擎中,帧更新往往会在几分之一秒内发生。这将放在 Gamestate.Play 案例分支下

referenceTime.AddMilliseconds(gameTime.ElapsedGameTime.TotalMilliseconds);

那么您还需要在同一个 case 分支中进行检查(可能在最后一个代码 sn-p 之后)。

if (referenceTime > endTime) {
    currentGameState = Gamestate.GameOver;
}

方法二

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

int referenceTime;

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

referenceTime = gameTime.totalGameTime.TotalSeconds;

然后您将在您的 Gamestate.Play 案例语句中添加一个检查。如果您打算重复使用 gameTime.totalGameTime.TotalSeconds,那么您可能希望将其存储在另一个变量中以便于阅读。

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

【讨论】:

    【解决方案2】:

    你看过System.Timer类吗?

    下面是该类的一个示例,因此您可以复制并粘贴到 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);
    }
    

    【讨论】:

    • 请不要发布“仅链接”的答案。突出内容应该在答案本身中,并且您应该只链接以提供该内容的支持证据。在这种情况下,您应该演示 OP 如何使用 System.Timer 来解决他们的问题。
    • 哦,我明白了,好电话。感谢您的澄清,我现在将编辑我的回复!
    • 您在此处发布的代码如何向问题的作者演示如何“将其放入我的枚举中,以便当计时器达到 0 时,它会将状态从播放更改为游戏结束” ?我在枚举的这个答案中没有看到任何提及,计时器达到0,或者游戏状态的变化。您似乎完全没有解决问题的任何具体目标。
    • 嗯,这很公平,我举了一个关于如何使用计时器的例子,但写一个倒计时的例子可能会更好。感谢您的反馈!
    • 这只有在 GameTime 对应于系统时间且没有暂停或其他因素时才有效。将是一个简短的解决方案!应该提到应该在哪里创建计时器(就在 currentGameState * 到 *Gamestate.Play 的转换之前,并使参数与问题相关(例如,不需要 AutoReset)。OnTimedEvent 主体也只是 currentGameState = Gamestate.GameOver;.
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    相关资源
    最近更新 更多