Как легко удалить пользовательские общие экземпляры в cocos2d-x?

Я делаю небольшой проект Cocos2d-x, где меня вдохновил шаблон «синглтон», реализованный CCDirector::sharedDirector() метод и другие общие экземпляры в Cocos2d-x. Например, в CCDirector.cpp у нас есть

static CCDisplayLinkDirector *s_SharedDirector = NULL;

// ...

CCDirector* CCDirector::sharedDirector(void)
{
if (!s_SharedDirector)
{
s_SharedDirector = new CCDisplayLinkDirector();
s_SharedDirector->init();
}

return s_SharedDirector;
}

void CCDirector::purgeDirector()
{
// cleanup scheduler
getScheduler()->unscheduleAll();

// ...

// delete CCDirector
release();
}

purgeDirector() Метод очищает все другие общие экземпляры, такие как общий кэш анимации, общий кэш кадров спрайтов и т. д. — все они приводятся в одной форме. Я бы хотел сделать пару из них сам, как общее игровое лобби.

Я бы предпочел не изменять CCDirector, так как он определенно может быть изменен.

Есть ли какое-нибудь естественное место, где я мог бы поставить свой код очистки? Есть ли возможность для звонка при cocos2d::CCDirector::sharedDirector()->end() называется или похоже? Спасибо!

0

Решение

Ладно, может быть, вы не должны «вдохновляться» паттерном Синглтона?

Да, их, вероятно, легко подобрать и они заманчивы, но они также плохой дизайн в 99% всех случаев (включая большинство синглетонов cocos2d). Тем более, что вы сказали «пару таких».

Синглтон — это, по сути, контейнер для глобальных переменных. Глобальные переменные (например, синглтоны) лучше избегать если они полностью отделены от всех других классов и служат единственной цели. Хороший пример — NSFileManager или синглтон SimpleAudioEngine.

В лучшем проекте используется древовидная структура зависимых и содержащихся объектов, похожая на иерархию узлов в сцене. В одноэлементном дизайне «чистка» объектов становится тривиальной. После очистки самого родительского объекта, обрабатывающего конкретную задачу (т. Е. Сцены), все объекты-потомки автоматически удаляются вместе с ним — при условии, что в коде нет ошибок времени жизни объекта (управление памятью).

Каждый класс должен отвечать за создание и освобождение объекта, который он содержит. Под «содержать» я имею в виду указатели экземпляра как переменные-члены или иногда переменные-члены массива или словаря, содержащие указатели экземпляра.

Эта статья объясняет Жизненные циклы объектов C ++ ну и к делу. Но это только начало.

1

Другие решения

После серьезного «Доу!» момент, когда я понял, что чистка пользовательских синглетонов будет легче всего AppDelegate::~AppDelegate() деструктор, где AppDelegate предоставляется в шаблоне X-кода cocos2d-x. Так я и сделал.

0

По вопросам рекламы [email protected]