A-tit indd


Паттерны программирования игр



Download 3,35 Mb.
Pdf ko'rish
bet29/313
Sana05.06.2022
Hajmi3,35 Mb.
#638392
1   ...   25   26   27   28   29   30   31   32   ...   313
Bog'liq
Nistrem R. Patterni programmirovaniya igr-1

Паттерны программирования игр
— Другой взгляд на паттерны проектирования
41
возможность отменять ходы, чтобы они могли сосредо-
точиться на стратегии и меньше — на догадках.
Мы, к счастью, уже используем команды, чтобы абстра-
гировать обработку ввода, поэтому каждый шаг, который 
делает игрок, уже инкапсулирован. Например, переме-
щение юнита (боевой единицы) может выглядеть так:
class MoveUnitCommand : public Command
{
public:
MoveUnitCommand(Unit* unit, int x, int y)
: unit_(unit),
x_(x),
y_(y)
{}
virtual void execute()
{
unit_->moveTo(x_, y_);
}
private:
Unit* unit_;
int x_;
int y_;
};
Обратите внимание: приведенный пример немного 
отличается от предыдущих команд. В предыдущем при-
мере мы хотели 
абстрагировать
команду от актора, для 
которого она применялась. Сейчас мы специально хо-
тим 
привязать
ее к перемещаемому юниту. Суть этой 
команды не общая операция «переместить что-то», ко-
торую можно использовать в пачке контекстов, а кон-
кретное перемещение в последовательности ходов игры.
Это еще раз подчеркивает все разнообразие примене-
ния паттерна Команда (Command). Иногда, как и в на-
ших первых примерах, команда является объектом 
многократного использования, который представляет 
собой 
нечто

что может быть выполнено
. Наш преды-
дущий обработчик ввода основывался на одном объекте 


42
Команда (Command) — 
Паттерны программирования игр
команды и вызывал его метод 
execute()
каждый раз 
при нажатии нужной кнопки.
Здесь команды более конкретны. Они представляют 
собой действие, которое может быть выполнено в опре-
деленный момент времени. То есть код обработки ввода 
будет 
создавать
экземпляр класса каждый раз, когда иг-
рок делает ход. Что-то вроде:
Command* handleInput()
{
Unit* unit = getSelectedUnit();
if (isPressed(BUTTON_UP)) {
//
int destY = unit->y() -
1;
return new MoveUnitCommand(
unit, unit->x(), destY);
}
if (isPressed(BUTTON_DOWN)) {
//
int destY = unit->y() + 1;
return new MoveUnitCommand(
unit, unit->x(), destY);
}
// …
return NULL;
}
Тот факт, что команды используются один раз, сыгра-
ет нам на руку моментально. Для возможности отме-
нять команды мы определяем другую операцию, кото-
рую должен реализовывать каждый класс команд:
class Command
{
public:
virtual ~Command() {}
virtual void execute() = 0;
virtual void undo() = 0;
};
Конечно, в языке без 
сборки мусора, как C++, 
это означает, что код, от-
ветственный за выпол-
нение команды, также 
будет ответственен 
за освобождение па-
мяти.



Download 3,35 Mb.

Do'stlaringiz bilan baham:
1   ...   25   26   27   28   29   30   31   32   ...   313




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish