Я написал простую игру и хочу интегрировать в нее достижения GameCenter.
Я хотел бы попытаться сделать это чистым и аккуратным способом, к которому легко добавить дополнительные достижения.
Как я вижу, достижение имеет следующие вещи:
- «Группа» триггеров (например, в конце игры, при столкновении и т. д.)
- Зависимость (например, вы не можете получить «10 золотых звезд», пока не получите «5 золотых звезд»).
Основываясь на этом, я попытался написать одноэлементный класс, который читал бы полный список (из plist) достижений, каждое из которых сгруппировано по классу триггера и его зависимостям. Этот синглтон позволял другим классам регистрировать @selector()
-подобные обратные вызовы для групп триггеров (например, «при триггере 'game_end' вызвать эту функцию"). Затем эти триггеры можно было бы аккуратно активировать в определенных точках моей игры. Получилась аккуратная, почти «абстрактная» система, которую я мог использовать в будущих играх.
Затем катастрофа; Я получаю EXC_BAD_ACCESS
ошибок, которые я могу только предположить, потому что я связываю @selector
обратных вызовов из нестатического класса в статический одноэлементный класс. Ошибка появляется в этой строке:
GCAchievementsHelper *h = [GCAchievementsHelper sharedInstance];
[h addEventListener:@"game_end" target:self selector:@selector(achievementHandlerGameEnd:)];
Я предполагаю, что это потому, что «я» (игровой слой) не может быть передано в статический синглтон?!
Я действительно не хочу разбрасывать тонны повторяющихся операторов IF по своему коду, чтобы проверить все условия, которые мне нужны для достижения... Если это вообще возможно!
Подводя итог, мой вопрос:
Кто-нибудь знает о системе достижений? Он не обязательно должен быть совместим с GC/OpenFeint или даже с ObjC — даже псевдокод был бы великолепен.