На iPhone, как лучше всего переместить UIImageView с помощью экранных элементов управления? - PullRequest
0 голосов
/ 18 июня 2009

Я разрабатываю версию этой игры для iPhone. http://www.students.uni -mainz.de / rathb000 / Fillit / Game.html

Я использую NSTimer для изменения положения корабля на 1 пиксель, а временной интервал для таймера составляет 0,002.

Однако я заметил, что корабль не будет двигаться быстрее, если я уменьшу временной интервал в дальнейшем. Infact, нет никакой разницы между 0,05 и 0,002. Есть ли ограничение на минимальное время, которое вы должны предоставить как NSTimeInterval?

Корабль в настоящее время движется слишком медленно, чтобы игра была захватывающей.

Кроме того, движение птиц (что также достигается с помощью NSTimer) становится медленным, когда я нажимаю любую кнопку для перемещения корабля.

Есть идеи о том, как это можно решить?

Ответы [ 6 ]

3 голосов
/ 18 июня 2009

NSTimer не является механизмом реального времени; он запускается как часть цикла выполнения и не идеален для создания плавных, плавных анимаций. Тем не менее, есть SDK, который является частью iPhone OS и называется Core Animation - он предоставляет библиотеку функций для выполнения плавной анимации слоев и видов. Вот довольно хорошая серия видеоуроков , которые могут оказаться полезными. Также есть отличная книга под названием Core Animation для Mac OS X и iPhone , которая может оказаться вам полезной.

Существует также базовая документация по анимации от Apple , в которой описано, как использовать класс CABasicAnimation для анимации свойств любого слоя или вида. Вот пример явной анимации слоя из документов:

CABasicAnimation *theAnimation; 

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=3.0;
theAnimation.repeatCount=1;
theAnimation.autoreverses=NO;
theAnimation.fromValue=CATransform3DTranslate(0,0,0);
theAnimation.toValue=CATransform3DTranslate(20,20,0);

[theLayer addAnimation:theAnimation forKey:@"animateTransform"];
0 голосов
/ 07 августа 2009

понял это.

Пришлось использовать Core Animation для перемещения корабля и заставить птиц двигаться с помощью NSTimer. Работает нормально таким образом, но только до определенного предела. Птицы снова замедляются, когда скорость корабля увеличивается больше определенного предела.

0 голосов
/ 18 июня 2009

Мало того, что NSTimer не является подходящим инструментом для этого типа анимации, ваш дизайн не так.

Таймер с интервалом 0002 срабатывает 500 раз в секунду. Это безумный способ оживить эту игру.

Я предлагаю вам ознакомиться с дизайном 2D-игр и найти лучший способ обнаружения столкновений - как, например, аноним, предлагает вам иметь прямоугольник столкновения вокруг корабля, а не полагаться на фактические пиксели.

Вы также должны проверить Cocos-2D для iPhone

0 голосов
/ 18 июня 2009

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

Действительно, вы должны думать о перемещении корабля вашего игрока в пикселях / секунду. Когда происходит событие NSTimer, получите истекшее время с момента последнего обновления. Используйте это прошедшее время для перемещения ваших игровых объектов. Например, если ваш временной интервал обновления составляет 0,05 секунды, и вы хотите переместить корабль игрока на 100 пикселей в секунду, то вы должны переместить его на 100 * 0,05 = 5 пикселей в этом обновлении. Этот метод учитывает временные шаги различного размера, и ваши игровые сущности всегда будут двигаться с постоянной скоростью, даже если ваш механизм таймера не такой последовательный.

0 голосов
/ 18 июня 2009

Можно рассмотреть вопрос об увеличении размера расстояния: перемещайте корабль на 3 или 4 пикселя каждые 0,05 секунды, а не на 1 пиксель каждые 0,002 секунды.

0 голосов
/ 18 июня 2009

Из NSTimer документов:

Таймер не является механизмом реального времени; он срабатывает только тогда, когда работает один из режимов цикла выполнения, к которому был добавлен таймер, и может проверить, прошло ли время срабатывания таймера. Из-за различных входных источников, которыми управляет типичный цикл выполнения, эффективное разрешение временного интервала для таймера ограничено порядка 50-100 миллисекунд. Если время срабатывания таймера происходит, когда цикл выполнения находится в режиме, который не контролирует таймер, или во время длительного вызова, таймер не срабатывает до следующей проверки цикла таймером. Следовательно, фактическое время срабатывания таймера потенциально может быть значительным периодом времени после запланированного времени срабатывания.

Возможно, вы можете попробовать переместить UIView, используя UIView анимацию вместо таймера.

...