Как избежать ожидания завершения метода в c #? - PullRequest
0 голосов
/ 26 июня 2019

Я пишу код на 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 ]

1 голос
/ 26 июня 2019

Похоже, вы пишете игру.

При написании игры (или любого другого приложения, управляемого событиями), вам нужно будет делать определенные вещи в определенное время. Например, графика должна быть прорисована (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
     }
}

Очевидно, это очень упрощенно, но, надеюсь, вы поняли идею.

0 голосов
/ 26 июня 2019

Многие игры не используют многопоточность.Они используют игровой цикл, который выглядит следующим образом

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 в зависимости от типа игры).

Ускорение определяется гравитацией,сопротивление, тяга, газ, разрывы и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...