2009-06-18 2 views
0

Я разрабатываю версию для iPhone этой игры. http://www.students.uni-mainz.de/rathb000/Fillit/Game.htmlНа iPhone, какой лучший способ переместить UIImageView с помощью экранных элементов управления?

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

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

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

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

Любая идея о том, как это можно решить?

ответ

-1

Фигурные это.

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

0

NSTimer От Docs:

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

Может быть, вы можете попробовать переместить UIView с помощью UIView анимации вместо таймера.

0

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

+0

Это приведет к неправильной логике обнаружения столкновений. Я должен буду отмечать все точки, на которых проходит корабль. Может быть, я могу взять массив и обозначить промежуточные точки, но не уверен, что это хорошая идея. –

0

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

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

+0

Да, это звучит неплохо, но я должен поддерживать движение корабля только по 1 пикселю за раз. Это необходимо для логики игры. В противном случае птица может не обнаружить линию и пройти через заполненную область или не может убить корабль, когда путь будет неполным. Поэтому я хочу знать, есть ли какие-либо такие функции перевода в кварце, которые ускоряют движение. –

+0

Я предполагаю, что обнаружение столкновения использует прямоугольник вокруг корабля игрока. Вы можете увеличить этот прямоугольник, чтобы охватить корабль игрока и его скорость. Например, если судно вашего игрока перемещено на 10 пикселей по оси Y, вы можете использовать прямоугольник, который включает в себя границы корабля игрока, но также распространяется на 10 пикселей мимо корабля по оси Y, чтобы включить расстояние до корабль отправился в последний кадр. –

+0

Нет, нет столкновения для корабля и птиц. Только линия, сделанная кораблем и птицами. Таким образом, все точки на линии должны быть помечены как 3, чтобы мы знали, когда птица пересекла линию. Если он помечен 4, птица должна отклоняться. Так что я должен сделать каждую точку на пути кораблей конкретным значением, и поэтому корабль не может перемещаться более чем на 1 пиксель за раз. –

3

NSTimer не является механизмом реального времени; он срабатывает как часть цикла запуска и не идеален для создания плавных, жидких анимаций. Тем не менее, есть SDK, который является частью ОС iPhone под названием Core Animation - он предоставляет библиотеку функций для плавной анимации слоев и представлений. Here is a reasonably good series of video tutorials, что может оказаться полезным. Существует также отличная книга под названием Core Animation for Mac OS X and iPhone, которая может оказаться вам полезна.

Существует также core animation documentation from 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

Большое спасибо за ссылку. В теме. –

+0

Нет проблем, вы также можете принять мой ответ в качестве принятого ответа с отметкой галочки, если вы сочтете это полезным. – LBushkin

+0

Этого еще не найдено. Я все еще застрял .. :( –

0

не только NSTimer не правильный инструмент для этого типа анимации ваш дизайн является неправильным.

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

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

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

+0

Yaa, я знаю, что я ошибаюсь. Но, как я сказал в комментарии выше, мне не нужно обнаруживать столкновение между кораблем и птицей. Yaa, я попробовал cocos2d около в неделю, но обнаружил, что моя игра достаточно проста, чтобы ее можно было сделать в кварце. Кроме того, я не мог узнать ее так же быстро, как пользователи часто заявляют о cocos2d. Спасибо, в любом случае. –

+0

Итак, у вас есть решение, и вам не нужен совет из Stack Overflow. Зачем даже задавать вопрос? –

+0

Где я упоминал, что у меня есть решение, и что я не хочу совета? Возможно, вы должны прочитать мои комментарии выше, прежде чем сформировать мнение. Поверьте мне, это поможет многим избежать некоторых обменов. –

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