A-tit indd


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



Download 3,35 Mb.
Pdf ko'rish
bet190/313
Sana05.06.2022
Hajmi3,35 Mb.
#638392
1   ...   186   187   188   189   190   191   192   193   ...   313
Bog'liq
Nistrem R. Patterni programmirovaniya igr-1

Паттерны программирования игр
— Паттерны поведения
257
Сделаем объекты типа больше похожими на типы: 
конструкторы
Наша текущая реализация позволяет нам конструиро-
вать монстра напрямую и передавать ему его род. По-
рядок действий в этом методе обратный по сравнению 
с тем, как объекты инстанцируются в большинстве объ-
ектно-ориентированных языков: обычно мы не выделя-
ем пустую память, чтобы затем 
присвоить
ей класс. На-
оборот, мы вызываем функцию конструктора в самом 
классе, а она уже отвечает за получение нами нового 
экземпляра.
Этот же самый паттерн мы можем применить для на-
ших объектов типа:
class Breed
{
public:
Monster* newMonster()
{
return new Monster(*this);
}
// 8 6 …
};
А затем классы используют их:
class Monster
{
friend class Breed;
public:
const char* getAttack()
{
return breed_.getAttack();
}
private:
Monster(Breed& breed)
: health_(breed.getHealth()),
«Паттерн» очень подхо-
дящее здесь слово. Речь 
идет об одном из клас-
сических паттернов 
проектирования: Фаб-
ричный Метод (Factory 
Method).
В некоторых языках 
данный паттерн приме-
няется для создания 
всех
объектов. В Ruby, 
Smalltalk, Objective-C 
и других языках, где 
классы являются объек-
тами, вы создаете новые 
экземпляры, вызывая 
метод самого объекта 
класса.


258
Объект типа (Type Object) — 
Паттерны программирования игр
breed_(breed)
{}
int health_; // 9 .
Breed& breed_;
};
Разница заключается в функции 
newMonster()
класса 
Breed
. Это наш фабричный метод «конструктор». 
В нашей первой реализации создание монстра выгляде-
ло так:
Monster* monster = new Monster(someBreed);
После внесения изменений — так:
Monster* monster = someBreed.newMonster();
Итак, зачем это нужно? Сейчас создание объекта со-
стоит из двух шагов: выделение памяти и инициализа-
ция. Конструктор класса 
Monster
позволяет нам делать 
любые инициализации. В нашем примере мы только 
храним род, но в настоящей игре будет еще загружаться 
графика, инициализироваться ИИ, управляющий мон-
стром, и т. д.
Тем не менее все перечисленное будет происходить 
после
выделения памяти. Еще до того, как мы вызовем 
конструктор, у нас уже появится фрагмент памяти, со-
держащий нашего монстра. В играх часто нужен кон-
троль процесса создания объектов, для чего мы исполь-
зуем распределитель памяти или паттерн Пул объектов 
(Object Pool) (с. 388).
Помещения «конструктора» именно в класс 
Breed
дает нам возможность создать такую логику. Вместо вы-
зова простого 
new
функция 
newMonster()
может выде-
лить память из пула или на куче перед тем, как передать 
управление классу 
Monster
для инициализации. По-
мещая эту логику в класс 
Breed
, в 
единственную
функ-
цию, имеющую возможность создавать монстров, мы 
Тут есть еще небольшое 
отличие. Поскольку наш 
пример кода написан 
на С++, мы можем вос-
пользоваться одной его 
приятной возможно-
стью —
дружественные 
классы
.
Мы сделали конструк-
тор класса 
Monster
приватным, запретив 
вызывать его напрямую. 
Дружественные классы 
обходят наложенное 
ограничение, так что 
класс 
Breed
все же смо-
жет это сделать. В итоге 
единственный
способ 
создать монстра —
пройти через 
newMonster()
.



Download 3,35 Mb.

Do'stlaringiz bilan baham:
1   ...   186   187   188   189   190   191   192   193   ...   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