在屏幕Cocos2dx上移动多个CCSprite

时间:2014-03-14 20:15:05

标签: c++ cocos2d-x game-physics ccaction flappy-bird-clone

我有一个Init方法和spawn()方法,每2秒由CCAction调用一次! 我想要的是每2秒在屏幕上移动pipePair节点,就像在飞扬的鸟类游戏中一样!但在我的情况下,我无法在屏幕中添加多对节点加上MoveBy CCAction的速度定期固定。

所以我想要定期添加节点,它们应该在屏幕上以恒定速度移动。

任何帮助都将不胜感激。

bool HelloWorld::init()
{

//creating the world

b2Vec2 gravity;
gravity.Set(0.0f, -20.0f);
world = new b2World(gravity);

// Do we want to let bodies sleep?
world->SetAllowSleeping(true);

world->SetContinuousPhysics(true);

setAccelerometerEnabled( true );
scheduleUpdate();
setTouchEnabled(true);
//////////////////////////////
// 1. super init first
if( !CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)) ) //RGBA
{
    return false;
}
if ( !CCLayer::init() )
{
    return false;
}

screenSize = CCDirector::sharedDirector()->getWinSize();

//Initializing CCNodes

_moving = CCNode::create();
addChild(_moving);
_pipes = CCNode::create();
_moving->addChild(_pipes);


CCSprite *test = CCSprite::create("goalssss.png");
CCRect rectOfPipe =  test->boundingBox();

float64 distanceToMove = screenSize.width + 2.5*rectOfPipe.size.width;
CCMoveBy* movePipes = CCMoveBy::create(0.01*distanceToMove, CCPointMake(-screenSize.width, 0));
CCRemoveSelf *removePipes = CCRemoveSelf::create();
sequenceActionOfPipes = CCSequence::create(movePipes,removePipes);
sequenceActionOfPipes->retain();

CCCallFunc *spawn = CCCallFunc::create(this, callfunc_selector(HelloWorld::spawnPipes));
CCDelayTime *delayForTwoSecs = CCDelayTime::create(2.0);
CCSequence *sequenceForSpawnAndDelay = CCSequence::create(spawn,delayForTwoSecs);
CCRepeatForever *repeatActionForeverOfSpawnAndDelay =  CCRepeatForever::create(sequenceForSpawnAndDelay);
this->runAction(repeatActionForeverOfSpawnAndDelay);`
}

这是我的spawn方法,每2秒调用一次!

void HelloWorld::spawnPipes(){

CCNode *pipePair = CCNode::create();
pipePair->setPosition(CCPoint(screenSize.width, 0));
//pipePair->setZOrder(-10);

float64 randomVal = arc4random()%(int32)(screenSize.height/3);

CCSprite *_pipeUpReplica = CCSprite::create("goalssss.png");
_pipeUpReplica->setPosition(CCPoint(20, randomVal));

CCSprite *_pipeBelowReplica = CCSprite::create("goalssss.png");
_pipeBelowReplica->setPosition(CCPoint(20, randomVal+100+_pipeUpReplica->boundingBox().size.height));
pipePair->addChild(_pipeUpReplica);
pipePair->addChild(_pipeBelowReplica);

//run actions
pipePair->runAction(sequenceActionOfPipes);
_pipes->addChild(pipePair);

}

2 个答案:

答案 0 :(得分:0)

首先,你不需要这样做:

if( !CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)) ) //RGBA
{
    return false;
}
if ( !CCLayer::init() )
{
    return false;
}

CCLayerColor继承自CCLayer(参考:docs),我当然希望你不要继承他们两个! :)

至于手头的问题,我不能解决问题,但我可以发现一些可能存在的陷阱,这可能会对你的问题产生影响。

  1. 很多节点。您有了Layer,在其上添加了_moving节点,您在该节点上添加了_pipes节点,您添加了pipePair节点。除非它们对游戏中的其他内容至关重要,否则我可以看到您没有直接在图层上添加pipePair的原因。

  2. 你没有设置_moving_pipes的位置 - 尽管它看起来并不重要,但是对于所有节点的明确定位都不会让人感到惊讶。这里有用的是`CCPointZero

  3. 与您一样重复使用CCSequences,我从来没有取得过任何成功。它总是被证明是最好在它们被使用时创建它们,而不是在以后担心它们。

  4. 希望其中一些有用!

答案 1 :(得分:-1)

尝试将延迟从2.0f增加到3.0f

CCDelayTime *delayForTwoSecs = CCDelayTime::create(3.0);