38
Команда (Command) —
Паттерны программирования игр
выбирающих объект команды, мы
передадим
объект для
управления:
class Command
{
public:
virtual ~Command() {}
virtual void execute(GameActor& actor) = 0;
};
Здесь
GameActor
— это класс «игрового объекта»,
который представляет персонажа в игровом мире. Мы
передаем его функции
execute()
, чтобы производные
классы команд вызывали методы для выбранного персо-
нажа, например:
class JumpCommand : public Command
{
public:
virtual void execute(GameActor& actor)
{
actor.jump();
}
};
Теперь мы можем использовать один-единствен-
ный класс, чтобы заставить прыгать любого персонажа
в игре. Правда, нам пока недостает кода между обработ-
чиком ввода и командой: он должен принять команду
на вход и вызвать ее для нужного объекта. Первым де-
лом мы изменим функцию
handleInput()
так, чтобы
она
возвращала
команды:
Command* InputHandler::handleInput()
{
if (isPressed(BUTTON_X)) return buttonX_;
if (isPressed(BUTTON_Y)) return buttonY_;
if (isPressed(BUTTON_A)) return buttonA_;
if (isPressed(BUTTON_B)) return buttonB_;
// ,
.
Паттерны программирования игр
— Другой взгляд на паттерны проектирования
39
return NULL;
}
Она не может исполнить команду сразу, поскольку
не знает, какого актора в нее передать. Вот где мы ис-
пользуем тот факт, что команда является реифициро-
ванным вызовом (
rei ed call
), — мы можем
отло-
жить
выполнение вызываемого метода.
Теперь нам нужен код, который берет эту команду
и выполняет ее для актора, соответствущего игроку. На-
пример:
Command* command = inputHandler.handleInput();
if (command)
{
command->execute(actor);
}
Подразумевая под переменной
actor
ссылку на пер-
сонажа игрока, который таким образом корректно от-
реагирует на пользовательский ввод, мы получим, по
сути, ровно то же самое, что и в первом примере. Но до-
бавление уровня косвенности между командой и акто-
ром, который ее выполняет, дало нам изящную допол-
нительную возможность:
теперь мы можем позволить
игроку управлять любым актором в игре, меняя актора,
для которого исполняются команды
.
На практике это не особо распространенная функция,
но у нее есть другой, довольно часто встречающийся ва-
риант. До сих пор мы рассматривали только персонажа,
управляемого игроком, но как насчет других акторов
в игре? Они управляются ИИ. Мы можем использовать
тот же паттерн Команды в качестве интерфейса между
движком ИИ и акторами; код ИИ будет просто генери-
ровать объекты типа
Command
.
Уменьшение связанности между ИИ, выбирающим
команды, и кодом акторов, выполняющих эти команды,
дает нам бо льшую гибкость. Мы можем использовать раз-
ные модули ИИ для разных акторов. Или комбинировать
их и выбирать ИИ для разных видов поведения. Хотите
Do'stlaringiz bilan baham: |