На iPhone, каков наилучший способ перемещения UIImageView с помощью экранных элементов управления?

StackOverflow https://stackoverflow.com/questions/1012606

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение 6

понял это.

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

Другие советы

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"];

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

  

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top