Cocos2d-x перетащить палец и спрайт следует неуклонно

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

У меня есть код для этой работы, моя проблема в том, что я хочу, чтобы он был в постоянном темпе, как в играх, когда мой спрайт движется, он меняется по скорости, насколько быстро вы двигаете пальцем.

любая помощь будет оценена по достоинству.

im довольно уверен, что это связано с моим действием CCMoveTo, но я не могу думать о другом способе этого.

void WavePrototypeInterface::ccTouchesBegan(CCSet* touches, CCEvent* event)
{
 while (movementPath->count() != 0)
 {
 movementPath->removeControlPointAtIndex(0);
 }
 index=0;
 this->stopAllActions();
 } 

void WavePrototypeInterface::ccTouchesMoved(CCSet* touches, CCEvent* event)
{
 CCTouch* touch = (CCTouch*)( touches->anyObject() );
 CCPoint location = touch->getLocationInView();
 location = CCDirector::sharedDirector()->convertToGL(location);

 movementPath->addControlPoint(location);

 int xValue = movementPath->count();

}

void WavePrototypeInterface::ccTouchesEnded(CCSet* touches, cocos2d::CCEvent* event)
{
if(!movementPath->count()<=0)
 {
 goToPointWithIndex();

 }
}

void WavePrototypeInterface::goToPointWithIndex()
{
 CCPoint toPoint = movementPath->getControlPointAtIndex(index);

 if(index < movementPath->count())
 {
 index++;
 sprite->setPosition(toPoint);

 CCDelayTime * delay = CCDelayTime::create(0.1);
 CCCallFunc *func = CCCallFunc::create(this, callfunc_selector(WavePrototypeInterface::goToPointWithIndex));
 CCSequence * seq = CCSequence::createWithTwoActions(delay, func);
 this->runAction(seq);
 }
}
2 ответа

ccTouchesMoved вызывается с определенной частотой.

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

и в функции goToPointWithIndex() вы устанавливаете задержку между каждой точкой 1 с, чтобы получить результат.

вы должны учитывать расстояние между каждой точкой.


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

* ПРИМЕР КОДА *

//example code
void update(delta){
float step = delta*MOVESPEED;
while(step>0){
 CGPoint target = getNextPointInPath();
 float distance = ccpDistance(target, item.position);
 if( distance > step ){
 CGPoint dir = ccpSub(target, item.position);
 dir = ccpNormalize(dir);
 CGPoint newpoint = ccpAdd(item.position, ccpMult(dir, step));
 item.position = newpoint;
 step = 0;
 }else{
 item.positon = target;
 step -= distance;
 }
}

licensed under cc by-sa 3.0 with attribution.