如何并排运行主循环倒计时?

时间:2014-03-18 19:47:42

标签: c# time console

我正在用C#制作一个小型控制台应用程序游戏。问题是,你必须跑来跑去收集黄金。你必须在1分钟内完成,否则你会死。我按照我制作的枚举的方式工作,包括:运行,赢,丢失,结束语句。主循环运行时游戏的游戏状态为:运行。类似的东西:

switch (...) {
    case PlayGame:
        Console.Clear();
        GameWorld gameWorld = new GameWorld();

        gameWorld.Update();
        while (gameWorld.GameState == GameState.Runs) {
          gameWorld.PlayerMovement();
          gameWorld.Update();
        }
        break;
    case ...
}

现在一切正常..最后一件事是,我必须制作这个"计时器",这将计算1到60秒,并在给定坐标的屏幕上打印它。我尝试过很多不同的方式。例如,我在GameWorld类中创建了一个方法(这就是我拥有游戏核心的地方)并称之为Time。我做了一个变量Time并为其赋值60。然后我创建了一个for循环,它将光标设置在给定的坐标处,写下每个循环都会引发的值并设置Thread.Sleep(1000);作为最后一件事..那基本上每秒都加1值,直到它达到59.现在的事情是,当我在主循环(while)运行这个方法时,它首先计入60秒,然后运行它下面的任何东西当我在while循环中的所有命令下面运行时,发生了同样的事情。你们有什么想法我怎么能做到这一点"倒计时"与主循环并行运行?谢谢你的答案和时间!

4 个答案:

答案 0 :(得分:2)

虽然可以启动一个单独的线程来连续运行计时器以使倒计时并排运行,但我只是跟踪开始时间并打印更新的秒作为Update()方法的一部分(或者在最有意义的地方,可能是主游戏循环中的单独方法调用)。

第一次调用Update()时,创建GameWorld时甚至是新的Start()方法,使用DateTime.UtcNow存储当前时间并打印60它需要去。在下一个/后续更新中,获取新的当前时间,找到差异并从60秒减去该时间以获得剩余时间。

编辑,再解释一下:

以下是一些可以帮助您入门的代码,然后您可以插入对Start()的调用  PrintCountdown()在适当的情况下,我想让你尽可能多地完成工作:)。

class GameWorld {
    ...
    DateTime startTime;

    void Start() {
        startTime = DateTime.UtcNow;
    }

    void PrintCountdown() {
        DateTime currentTime = DateTime.UtcNow;
        TimeSpan gameRunTime = currentTime - startTime;
        int timeRemaining = 60 - gameRunTime.TotalSeconds();
        // Whatever code you have to print the countdown time
    }
    ...
}

编辑2:

正如斧头指出的那样,DateTime.UtcNowDateTime.Now快得多。它对你的游戏来说可能并不重要,但是使用DateTime.UtcNow会在你的游戏循环中缩短几个周期。

答案 1 :(得分:0)

您可以在某处检查系统时钟(例如,使用DateTime.Now)并将其与程序的开始时间进行比较,检查60秒后的时间。

答案 2 :(得分:-1)

您可以使用计时器按指定的时间间隔对您进行ping操作,您可以处理该事件以进行更新。示例

case PlayGame:
        Console.Clear();
        GameWorld gameWorld = new GameWorld();
        gameWorld.Update();

        //Timer to ping you every second
        Timer aTimer = new Timer
        {
            Interval = 1000,    //change this to fit your needs
            Enabled = true
        };
         aTimer.Elapsed+=this.OnTimedEvent;


        while (gameWorld.GameState == GameState.Runs)
        {
            gameWorld.PlayerMovement();
            gameWorld.Update();
        }

这是事件处理程序

    private void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        //updates here?
    }

答案 3 :(得分:-1)

编辑:如果范围是每秒运行60秒,那么使用秒表应该是最准确的方法。 (它也会做很多循环...)

        var gameWorld = new GameWorld ();
        var stopwatch = Stopwatch.StartNew ();
        gameWorld.Update();
        for (var n = 0; n < 60;)
        {
            if ((int)(stopwatch.ElapsedMilliseconds / 1000) > n)
            {
                gameWorld.PlayerMovement ();
                gameWorld.Update ();
                ++n;
                Console.WriteLine ("{0}ms elapsed.", stopwatch.ElapsedMilliseconds);
            }
            Thread.Sleep(1);
        }