2011-06-29 1 views
1

В настоящее время я строю простую игру, используя чистый UIKit. В моем игровом контенте MVC у меня есть объект таймера CADisplayLink, который активируется в игре и неоднократно вызывает метод gameLogic для отображения новых объектов. Метод вычисляет и обновляет позиции объекта на экране. FrameInterval моих таймеров - 2 кадра. Теперь мне нужно как-то установить интервал повторного появления новых объектов на экране. Решением, которое я использовал до сих пор, является использование статического счетчика в методе gameLogic. Вот фрагмент метода:Простая игра UIKit: что такое хороший подход для многократного ввода новых объектов на экран?

-(void)gameLogic{ 
    static int timeCounter = 0; 
    if ((timeCounter % 50)==0){ 
    [self addItemToScreen]; 
    } 
    ... 
    timeCounter++; 

На каждом 50-м цикле выполнения метода GameLogic, я ставлю новый объект на экране. Остальный код метода gameLogic репозиционирует существующие объекты. В настоящее время все управляется только одним таймером. Другим решением, которое IMHO должно работать, является наличие отдельного таймера для добавления новых объектов на экран. Но я не уверен, это лучшее решение, и они будут успешно работать одновременно. Каково ваше мнение об этих подходах? Какие другие решения вы планируете использовать?

ответ

1

Я думаю, что это прекрасно, чтобы все ваши объекты реагировали на счетчик кадров. Однако я скорее всего отправлю уведомление через ваше приложение, вместо того, чтобы иметь одну функцию, в которой есть тонна кода, делая всевозможные вещи. Я думаю, вам действительно стоит рассмотреть возможность разбить всю эту логику на отдельные классы, т. Е. Иметь класс GameObjectCreator, который отвечает на уведомление, отправленное при запуске вашего таймера, и только этот класс добавляет объекты в представление. Для вашего кода, который переупорядочивает объекты на экране, они также могут отвечать на одно и то же уведомление и обрабатываться родительским контроллером для управления всеми объектами, или каждый отдельный объект может также ответить на уведомление. Производительность мудрый Я не уверен, что использование уведомлений плохое с множеством объектов, отвечающих сразу, но что-то вроде этого больше подходит для меня, поэтому у вас нет всего этого кода спагетти в одной функции таймера.

+0

Большое спасибо. Я слышал об уведомлениях, но пока не использую их. Звучит многообещающе, чтобы объекты экрана прослушивали передаваемые уведомления. В этом случае нужно ли регистрировать каждый объект в качестве наблюдателя (addObserver: selector: name: object :) в центр уведомлений по умолчанию? А затем в моем методе GameLogic неоднократно публикуйте уведомления? – Centurion

+0

Также очень интересно, как широковещательные сообщения распространяются между объектами/наблюдателями. Есть ли параллелизм? Для моей игры очень важно, чтобы каждый объект/наблюдатель получал сообщение и только одно сообщение в одном цикле таймера из NSNotificationCenter. Например, если на экране будет 10 объектов, то это будет неприемлемо, если какой-либо объект будет замедлен или начнет двигаться быстрее, чем другие :) – Centurion

+0

Отправленное уведомление происходит в одном и том же цикле цикла, поэтому все объекты, зарегистрированные в центре уведомлений, получат уведомление по существу в одно и то же время (или, по крайней мере, в одном и том же цикле). И да, вам нужно будет иметь каждый объект, который вы хотите отреагировать на регистр уведомлений с помощью addObserver: selector: name: object. Также убедитесь, что вы сделали '[[NSNotificationCenter defaultCenter] removeObserver: self]' при освобождении объектов, зарегистрированных в NSNotificationCenter. В противном случае вы получите утечки памяти и другие плохие вещи. – gdavis

Смежные вопросы