Переместить несколько CCSprite по экрану Cocos2dx

У меня есть метод Init и метод spawn (), который вызывается CCAction каждые 2 секунды!
Я хочу двигаться pipePair перемещайтесь по экрану каждые 2 секунды, что-то похожее на игру с птичками! Но в моем случае я не могу добавить несколько пар узлов на экране плюс скорость 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);`
}

Это мой метод вызова, который вызывается каждые 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);

}

0

Решение

Во-первых, вам не нужно делать это:

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

CCLayerColor наследуется от CCLayer (ссылка: документы) и я, конечно, надеюсь, что вы не наследуете от них обоих! 🙂

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

  1. Много узлов. У вас есть ваш слой, на котором вы добавляете _moving узел, на котором вы добавляете _pipes узел, на котором вы добавляете pipePair узел. Если они не важны для других вещей в вашей игре, я не вижу причины, по которой вы не добавляете pipePair прямо на вашем слое.

  2. Вы не установили позицию _moving а также _pipes — хотя это может показаться неважным, хорошо расположить все ваши узлы, чтобы потом не удивляться. Полезная вещь здесь `CCPointZero,

  3. У меня никогда не было никакого успеха с повторным использованием CCSequences как ты. Всегда лучше всего создавать их, когда они будут использоваться, и не беспокоиться о них позже.

Надеюсь, что некоторые из них помогут!

0

Другие решения

Попробуйте увеличить задержку с 2.0f до 3.0f

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