2016-03-06 68 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。