Паттерны программирования игр
— Паттерны очередности
181
Метод Update
(Update method)
«
Симулирует набор независимых объектов,
заставляя каждый обрабатывать один кадр
поведения в момент времени».
Мотивация
Пользователь проходит миссию могущественной валь-
кирией, чья задача — украсть драгоценности, лежащие
на костях давно умершего короля чародеев. Валькирия
с осторожностью приближается к роскошному склепу,
и тут ее атакует…
ничего
. Никаких проклятых статуй,
стреляющих молниями. Никаких восставших из мерт-
вых воинов, охраняющих вход. Она просто входит и за-
бирает награду. Конец игры. Вы победили.
Нет, так не пойдет. Склепу нужны стражи — несколь-
ко врагов, с которыми наша валькирия сможет вступить
в схватку. Прежде всего, нам потребуются скелеты вои-
нов, пусть ходят туда-сюда у склепа, охраняя его. Если
вы проигнорируете всю известную вам информацию
о проектировании игр, то самый простой способ заста-
вить скелеты патрулировать вход будет выглядеть так:
while (true)
{
//
for (double x = 0; x < 100; x++) skeleton.setX(x);
//
for (double x = 100; x > 0; x--) skeleton.setX(x);
}
Глава 10
Если король чародеев
хотел получить охрану
с более разумным пове-
дением, надо было вы-
бирать кого-то, у кого
хотя бы остались мозги.
182
Метод Update (Update method) —
Паттерны программирования игр
В приведенном примере скелеты двигаются вправо
и влево, но пользователь этого не видит. Программа за-
стряла в бесконечном цикле — не лучший игровой опыт,
верно? Мы хотим, чтобы скелеты перемещались на один
шаг за кадр.
Уберем циклы и будем использовать итерации внеш-
него игрового цикла, тогда игра продолжит реагиро-
вать на пользовательский ввод, пока охранники нареза-
ют круги у входа. Примерно так:
Entity skeleton;
bool patrollingLeft = false;
double x = 0;
// 6 $ :
while (true)
{
if (patrollingLeft)
{
x--;
if (x == 0) patrollingLeft = false;
}
else
{
x++;
if (x == 100) patrollingLeft = true;
}
skeleton.setX(x);
// 733 …
}
Я привожу здесь код до и после, чтобы показать вам,
насколько код усложнился. Патрулирование вправо
и влево было реализовано двумя простыми циклами
for
. Направление движения охранника отслеживалось
просто по тому, какой цикл в тот момент выполнялся.
Сейчас мы обращаемся к внешнему циклу игры каждый
кадр, а затем возвращаемся туда, где остановились. От-
слеживать направление перемещения приходится с по-
мощью переменной
patrollingLeft
.
Do'stlaringiz bilan baham: |