Cocos2d-x拖动手指和精灵以稳定的速度跟随

时间:2013-07-03 23:25:22

标签: c++ cocos2d-iphone cocos2d-x

我正在尝试像飞行控制游戏那样的效果。用户将手指拖到屏幕上,将数据存储在数组中,然后该项跟随手指抬起的路径。

我有这个工作的代码,我的问题是我希望它在游戏中保持稳定的速度,当我的精灵移动它的速度因你移动手指的速度而变化。

任何帮助将不胜感激。

我相当肯定它与我的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 个答案:

答案 0 :(得分:0)

您可以将每个点作为路径记录到数组中。并在更新循环中执行路径。 在这种情况下,我不建议您使用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;
    }
}

答案 1 :(得分:0)

以某个频率调用

ccTouchesMoved

这意味着如果你的手指移动速度较慢,你会获得更多的分数,如果你的手指移动得更快,你的分数就会减少。

并在函数 goToPointWithIndex()中设置每个点之间的延迟1秒,以便得到结果。

您应该考虑每个点之间的距离