如何避免等待方法在C#中完成?

时间:2019-06-26 17:36:50

标签: c# loops methods

我正在用C#编写代码,我想调用其中包含循环的方法,然后再调用另一个方法。问题在于第一种方法中的循环在程序执行期间运行,因此第二种方法无法调用,因为第一种方法从未完成。

示例:


private void Menu()
{
 Game();
 Movement();
}

private void Game()
{
 do
 {
  // some code inside the loop
 } while (x > 9);
}

private void Movement()
{
 // some other code
}

2 个答案:

答案 0 :(得分:1)

您好像在写游戏。

在编写游戏(或任何类型的事件驱动的应用程序)时,您将需要在特定时间做某些事情。例如,应该绘制图形(每秒50或60次),需要处理按键(每秒10次),鼠标移动(每秒20次)等。

一种简单(但可能不是最好)的方法是使用一个每10毫秒滴答一次的计数器,然后您的“计时器事件”可以对此做出反应。

void Loop()
{
     int ticks = 0;
     var stopwatch = new Stopwatch();

     while(true)
     {
        stopwatch.Start();
        if(ticks % 20 == 0) // Once every 20 ticks (or 200 ms)
        {
            DrawGraphics();
        }
        if(ticks % 50 == 0) // Once every 50 ticks (or 500 ms)
        {
            ProcessKeyPresses();
        }

        ticks++;
        stopwatch.Stop();

        Thread.Sleep(10 - stopwatch.TotalMilliseconds); // Wait until at least 10 milliseconds have passed
     }
}

显然,这非常简单,但是希望您能理解。

答案 1 :(得分:0)

许多游戏不使用多线程。他们使用一个看起来像这样的游戏循环

while (gameIsRunning) {
    ProcessInputs();
    UpdateGameWorld();
    GenerateOutputs();
}

您必须存储每个对象(化身,宇宙飞船,炸弹...)的状态。根据用户输入和当前游戏时间UpdateGameWorld更新每个对象的状态。状态包括位置,速度,重要功能,能量,寿命等。

然后GenerateOutputs使用此更新的状态信息来生成输出。


由于执行一次循环所需的时间可能会有所不同,因此最好使用StopWatch来查看自上次循环以来已花费了多少时间。速度和位置是这样计算的

newSpeed = speed + delta_time * acceleration
position = position + delta_time * 0.5 * (speed + newSpeed)
speed = newSpeed

这里的加速度,速度和位置是矢量(取决于游戏类型的2D或3D)。

加速度是由重力,阻力,推力,气体,断裂等决定的。