Например, нам поставлена задача реализовать в игре симуляцию толчка объекта пальцем. Надо пихнуть объект и что б он котился до точки назначения со скоростью толчка пальца. Я буду это описывать на примере движка cocos2d.
Для этого нам надо узнать промежуток времени от начала движения пальца до конца движения.
Засекать начало движения надо в методе ccTouchMoved, а не в ccTouchBegan, потому, что пользователь может коснуться экрана и держать палец на месте, а таймер уже запустится, что нам не надо. Что б таймер сработал только один раз при старте движения, я предлагаю создать переменную movingStarted и использовать ее следующим образом.
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
//Some code
movingStarted = YES;
//Some code
}
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
if(movingStarted)
{
movingStarted = NO;
startTime = CFAbsoluteTimeGetCurrent();//Получаем время, когда палец начал движение по дисплею.
}
//Some code
}
Дальше создаем метод, который будет возвращать скорось движения пальца.
-(float) calculateTouchSpeed
{
endTime = CFAbsoluteTimeGetCurrent();//Засекаем время, когда пелец остановился
//Из школьного курса известно, что б узнать скорость, надо пройденую дистанцию поделить на промежуток
//затраченного времени. В нашем случае мы делим сдвиг по оси Х на промежуток времени между началом и
//концом движения и получем скорость.
//Я беру скорость по абсолютному значению, что она у меня никогда не была отрицательной.
float speed = abs(movedFromX - movedToX)/(endTime-startTime);
return speed;
}
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
float speed = [self calculateTouchSpeed];
//Some code
}
и так, у нас есть скорость движения, текущая позиция объекта и его точка назначения, в которую он должен «по инерции» двигаться.
В cocos2d мы можем задать, сколько времени объект из одной точки будет перемещаться в другую. Очевидно, что чем меньше значение этого времени, тем быстрее будет объект двигаться.
Со школы известно, что б найти время, надо дистанцию делить на скорость. Скорость мы нашли выше. Так как у нас есть значение текущей позиции и позиции, в которую объект должен попасть, можем легко посчитать время, которое надо потратить на перемещение со скоростью движения пальца по экране.
float duration = abs(currentX - destinationX)/speed;
Все, теперь можно вызывать действие:
[MoveTo actionWithDuration:duration position:destinationPoint]
Комментарии (0)
RSS свернуть / развернутьТолько зарегистрированные и авторизованные пользователи могут оставлять комментарии.