0

我正在尝试获得类似飞行控制游戏的效果。用户在屏幕上拖动手指,它将数据存储在一个数组中,然后项目沿着该路径到达手指被抬起的位置。

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

任何帮助,将不胜感激。

我相当肯定这与我的 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);
    }
}
4

2 回答 2

0

ccTouchesMoved 以一定的频率被调用。

这意味着如果你移动你的手指慢一点,你会得到更多的分数,如果你移动你的手指更快,你会得到更少的分数。

而在函数 goToPointWithIndex() 中,你将每个点之间的延迟设置为 1 秒,这样你就得到了结果。

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

于 2014-04-30T03:56:40.297 回答
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;
    }
}
于 2013-07-04T09:33:14.893 回答