CCMoveTo: скорость движения - PullRequest
6 голосов
/ 13 мая 2011

У меня есть некоторые проблемы с CCMoveTo:

id actionMove = [CCMoveTo actionWithDuration:3 position:ccp(pointBoard[x][y].x,pointBoard[x][y].y)];

например, мой запуск спрайта переместился с ccp(20,460) и перешел на ccp(20,0), все в порядке.Но когда спрайту нужно перейти на ccp(20,200), скорость движения замедляется.Мне нужно перемещать спрайт с той же скоростью.Как я могу это сделать?

Спасибо.

Ответы [ 5 ]

19 голосов
/ 13 мая 2011

Вам нужно вычислить «расстояние» между вашими [начальными] и [конечными] точками, а затем вы можете вычислить «продолжительность», чтобы ваш спрайт двигался с постоянной скоростью. Что-то вроде

скорость плавания = 1; // здесь вы определяете скорость, которую хотите использовать.

CGPoint start = sprite.position; // here you will get the current position of your sprite.
CGPoint end = ccp(pointBoard[x][y].x,pointBoard[x][y].y);

float distance = ccpDistance(start, end); // now you have the distance

float duration = distance/speed;  // here you find the duration required to cover the distance at constant speed

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

Надеюсь, это поможет .. !!

5 голосов
/ 04 марта 2013

Чтобы поддерживать постоянную скорость движения на всех расстояниях, определите скорость, с которой вам нужно перемещать спрайт, и используйте формулу «скорость-время-расстояние», которую вы когда-то изучали в детстве в своем классе физики, чтобы найти неизвестное из трех.

float speed = 50.0f;
id duration = ccpDistance(sprite.position, pointBoard[x][y]) / speed;
id moveAction = [CCMoveTo actionWithDuration:duration position:pointBoard[x][y]];
0 голосов
/ 08 января 2016

Вы можете переместить манипулятор переменной скорости и положение основной позиции: действие CGPointMake.

скорость плавания = 3,67;

CCMoveTo * moveuserleft; CCMoveTo * moveuserleft2;

    moveuserleft = [CCMoveTo actionWithDuration:speed position:CGPointMake(235*scaleX,200*scaleY)];

    moveuserleft2 = [CCMoveTo actionWithDuration:speed  position:CGPointMake(360*scaleX,200*scaleY)];

    CCSequence *scaleSeqleft = [CCSequence actions:moveuserleft,moveuserleft2, nil];

    [user runAction:scaleSeqleft];
0 голосов
/ 04 июля 2014

Просто используйте простую математику (время = расстояние / скорость), чтобы вычислить время, необходимое для перемещения.

float speed = 13.0;
CGPoint startPoint = ccp(20,300);
CGPoint endPoint   = ccp(20,100);

float time = ccpDistance(startPoint, endPoint) / speed; 
id moveAction = [CCMoveTo actionWithDuration:time position:endPoint];
0 голосов
/ 13 мая 2011

Здесь скорость спрайта изменяется в зависимости от расстояния. Если расстояние от ccp (20 460) до ccp (20,0) такое же, как от ccp (20,0) до ccp (20 200). если расстояние меняется, скорость меняется соответственно (если продолжительность одинакова).

Вы можете сократить время, если хотите увеличить скорость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...