Игра UIKit: средний обратный вызов во время анимации движения игрового объекта - PullRequest
2 голосов
/ 08 июля 2011

В настоящее время я создаю игру с чистым UIKit.Это игра, где какой-то персонаж ловит падающие предметы.Все объекты движутся по траектории трех точек: каждый объект появляется в точке A, затем перемещается в точку B, а затем падает в точку C. Для меня важен только один момент - пункт в точке B. Мне нужно проверить,действительно ли персонаж ловит предмет в пункте B. В настоящее время у меня есть таймер в главном игровом контроллере, который постоянно публикует уведомления.Игровые предметы являются наблюдателями, они слушают это уведомление и перемещают себя (они двигаются сами).Теперь, с этим таймером, каждый предмет перемещается маленькими шагами из точки А в точку Б. Когда он находится в точке В, метод предмета проверяет, поймал ли его персонаж.Если нет, то я выполняю анимацию UIView с продолжительностью от точки B до точки C.

Я думаю, что все движение может быть анимировано, возможно, с помощью класса Core Animation CAKeyframeAnimation или чего-то другого.Единственная проблема в том, что я не уверен, как запустить обратный вызов для проверки улова в середине анимации - в точке B. Некоторые говорят, что это невозможно здесь , и если у меня есть целоеанимации и мне нужно получить текущую позицию элемента, тогда мне нужен таймер, который регулярно вытягивает / читает данные модели из presentationLayer.Но я не уверен в этом подходе, потому что теперь я не храню указатель на элементы экрана из моего основного игрового контроллера - игровой контроллер только создает элемент, а игровой таймер отправляет уведомления этим объектам.Но мне нужно было бы иметь такое для реализации предложенного решения.Кроме того, я должен прочитать презентационный слой из целого ряда элементов экрана.

Другой альтернативой может быть разделение одной анимации на две анимации: сначала анимация от А до В, а затем запуск обратного вызова завершения для проверки улова.Затем выполните другую анимацию от B до C.

Ребята, что вы думаете по этому поводу, может быть, у вас есть другие предложения?

1 Ответ

0 голосов
/ 15 ноября 2011

Я думаю, вам нужно разделить его на две анимации.Правильно, что у вас есть только animationDidStart и animationDidStop методы делегатов с CAAnimation.Подход к использованию NSTimer может быть проблематичным.presentationLayer значения будут обновлены в главном потоке.Я предполагаю, что проверка значений presentationLayer в другом потоке, где работает таймер, может дать неправильные значения.

Вы можете обойти это, используя performSelectorOnMainThread.Тогда проблема заключается в надежном планировании вызова этого метода.То есть, когда вы вызываете performSelectorOnMainThread, это время выполнения, чтобы выполнить это по своему усмотрению.

Для протокола, я также пишу игру на чистом UIKit.Самая большая головная боль - это не анимация во время обычной игры.Вместо этого он останавливает и возобновляет их во время прерываний, таких как приостановка игры, прием вызовов, переход в фоновый режим и т. Д. Особенно в процессе очистки памяти, когда игра находится в фоновом режиме.

Я немного об этом написалв ответе на этот вопрос:

Восстановление анимации там, где она остановилась, когда приложение возобновляет работу из фона

Следовательно, в следующей игре у меня будет закрытиепосмотрите на cocos2d , чтобы увидеть, что он предлагает в этом отношении.

...