Измерение скорости движения пальца по экране

Например, нам поставлена задача реализовать в игре симуляцию толчка объекта пальцем. Надо пихнуть объект и что б он котился до точки назначения со скоростью толчка пальца. Я буду это описывать на примере движка 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 свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.