2013-07-03 2 views
6

Я строю простой игровой консоли, есть игрок, который перемещает при нажатии клавиши вниз, и есть враги, которые перемещает автоматически, каждый тип противника движется один раз в X милисекунд ,Использование таймера и игры цикла

Как я понял, я должен использовать timer, но я действительно не знаю, как это сделать в игровом цикле (еще не построен, потому что я не знаю, как это сделать с таймером, но он должен be while loop думаю). игра заканчивается, когда противник «прикасается» к игроку (такие же x и y).

Одна важная вещь: я не могу вас в этом упражнении в Thread, но если у вас есть другие предложения вместо использования Timer, пожалуйста.

спасибо.

+0

С консольной игрой вы имеете в виду приложение, запущенное на консоли видеоигры или в реальном приложении консоли? (командная строка и т. д.) –

+0

консольное приложение. – Luis

ответ

16

Обычно вы не используете обычные таймеры в играх. Игры имеют совсем другой механизм для обработки их логики и времени, прошедшего, они обычно не работают с таймерами или не так, как вы ожидали:

Игры обычно имеют что-то, что называется игровым циклом. Вообще говоря, это три основные функции, которые вызываются один за другим в цикле:

while(running) 
{ 
    HandleUserInput(); 
    ChangeWorld(); 
    Render(); 
} 

Вы получаете пользовательский ввод, изменить игровой мир, соответственно, и вы рисуете его на экран. Теперь, чем быстрее ваш компьютер, тем быстрее работает этот цикл. Это хорошо для графики (думаю, FPS), но плохо для игры. Представьте Тетрис, где каждый кадр движется. Теперь я не хочу покупать более быстрый компьютер, игра будет сложнее.

Так держать скорость игры постоянная, не зависящая от мощности компьютера, петля считает время, прошедшее:

while(running) 
{ 
    var timePassedSinceLastLoop = CalculateTimeDelta(); 

    HandleUserInput(); 
    ChangeWorld(timePassedSinceLastLoop); 
    Render(); 
} 

Теперь представьте кулдаун что-то в игре. Игрок нажал «a», произошло какое-то классное действие, и хотя он может снова нажать «a», ничего не произойдет в течение следующих 5 секунд. Но игра все еще работает и делает все, что может случиться. Это не обычный таймер. Это переменная, назовем ее ActionCooldown, и как только игрок запускает действие, он устанавливается в 5 секунд. Каждый раз, когда мир меняется, timePassed вычитается из этого числа, пока оно не станет равным нулю. Все время игра работает и обрабатывает ввод и рендеринг. Но только однажды ActionCooldown достигнет нуля, другое нажатие кнопки «a» снова запустит это действие.

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

Допустим, у вас есть 30 кадров в секунду, поэтому ваш цикл работает 30 раз в секунду. Теперь вашему врагу нужно перемещать 1/30 квадрата за каждый цикл. Тогда он, в конце концов, переместит один полный квадрат в секунду.

+0

Спасибо, но как рассчитать время? как узнать, когда нужно двигаться врагу? Я пробовал с таймером, но это не кажется хорошим, потому что это не точно. – Luis

+1

Чтобы начать очень просто, вы можете взять каждый цикл «DateTime.Now» и найти промежуток времени между ними. У каждого врага скорость, и вам нужно добавить его скорость в положение каждого кадра. Если скорость измеряется в блоках в секунду, вам нужно убедиться, что вы добавили только часть скорости в текущую позицию, потому что прошло только часть секунды. Какова скорость вашего врага, ваше дизайнерское решение. – nvoigt

+1

Я знаю, что это действительно старый, но я настоятельно рекомендую использовать 'DateTime.UtcNow', поскольку' DateTime.Now' стоит дорого. Поскольку вам нужно всего лишь вычислить пройденное время, вы можете использовать 'UtcNow', который не выполняет математику смещения по часовой стрелке, чтобы определить, в какой временной зоне должен находиться возвращаемый' DateTime'. Бит более эффективен для чего-то в этом направлении , –

0

Общая посылка за таймером - это повторение некоторого кода каждые n.

Чтобы создать использование таймера следующим образом:

System.Timers.Timer aTimer = new System.Timers.Timer(); 
     aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
     // Set the Interval to 1 millisecond. Note: Time is set in Milliseconds 
     aTimer.Interval=1; 
     aTimer.Enabled=true; 

Затем реализовать этот метод:

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     //Whatever you need repeated 
    } 

Полный пример можно найти здесь: http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.71).aspx

Смежные вопросы