2016-03-06 34 views
0

我正在试图制作一个太空侵略者克隆。在这样做的时候,我很难将入侵者分组在一起,以便他们同时移动。这是因为CCLayer和CCNode都在cocos2dx的v3.1中被弃用。我将我的精灵保存为一个可以迭代的矢量,但是当我尝试移动它们时,只能一次移动一个。我需要将它们组合在一起,以便我可以一次性移动它们。如何一次移动所有的精灵:Cocos2dx v3 C++

void Gameplay::moveInvaders(){ 
    auto moveLeft = MoveBy::create(2, Vec2(-1, 0)); 
    auto moveRight = MoveBy::create(2, Vec2(1, 0)); 
    auto moveDown = MoveBy::create(2, Vec2(0, 1)); 
    auto stay = MoveBy::create(20, Vec2(0,0)); 

    // create a sequence with the actions and callbacks 
    auto seq = Sequence::create(moveLeft, stay, moveRight, stay, moveDown, stay, nullptr); 

    for (int i = 0; i < invaders.size(); i++) { 
     invaders.at(i)->runAction(seq); 
    } 

更新:我最终弄清楚了这个问题。我没有尝试使用序列,而是用一些控制逻辑和系统定时器来编写脚本。

添加到您的init()函数: this->schedule(schedule_selector(Gameplay::moveInvaders), 1.0);

形式:

this->schedule(schedule_selector(<Class_Name>::<function_To_call>), <number_of_frames_to_run>); 

然后决定你想要在你的函数,将是通常被称为做什么。我使用了几个布尔值和整数值来保留一个计数器。这样我就可以控制入侵者移动的方向。

希望这可以帮助别人!我找不到我需要知道的东西,因为大多数的cocos2dx教程都在Objective-C或Javascript中。

+0

让我猜测,你的'runAction'函数不仅会移动精灵,还会重新显示它?你需要分开移动和显示。 –

+0

噢,还有一点表现提示(性能对游戏很重要,或者我听说过;)):在调用函数之间,moveLeft,moveRight,moveDown和stay等变量不会改变,所以为什么重新为他们打电话?相反,使它们成为'静态'(甚至可能是'const'),它们只会被创建一次,所有对该函数的调用都将使用相同的变量。 –

+0

谢谢!截至目前为止,只有一个个体精灵会移动,然后似乎没有其他任何东西移动。尽管原始精灵永远不会回到它的位置。有没有办法将所有这些精灵分配给单个对象,以便我可以一次移动它们?当他们与玩家的子弹相撞时,我会需要他们。先谢谢了! – Speakeasys

回答

0

如何将所有入侵者添加到一个精灵中,比如说“InvaderGroup”?所有的转换(并且需要引用一次,但最可能的是所有的动作也是),我保证也可以对孩子进行计算,所以不用担心。

许多入侵者个别注意事件听起来像是开销,尤其是结果移动不应该单独决定。如果你愿意,你可以使用你自己的Sprite子类,但只需移动它们就没有必要。

P.S. 你的入侵者仍然可以单独漫游,如果你想要他们,只是坐标将参考父Sprite。