森クマblog

スマートフォン向けアプリ開発者の奮闘記

【cocos2d-x】TargetedActionで親ノードと子ノードを別々に動かすクマ

 ここは森のゲーム開発室・・・

新作アプリをマ夏にリリースとか言って、8月中旬くらいかなーと思ってたら、7月上旬から猛暑になってしまい、公約違反が囁かれる・・・ 

 

 

f:id:shakeflower93:20170803215754j:plain

(激烈な猛暑の中、デスマーチは続く) 

 

OL「森クマ!前に指摘したバグが残ったままじゃない!」

 

森クマ「えぇっこの完璧なコーディングにバグがあると、そう申すクマ!?そう申すクマ!!??

 

OL「ほら!あんた(プレイヤーキャラ)や敵キャラが回転して攻撃するときに、HPゲージやパーティクルまで一緒に回ってる!!」

 

 

f:id:shakeflower93:20170804083533p:plain

(キャラの回転に合わせて一緒に回転するHPゲージ。もはやライトサーベルである)

 

森クマ「ぐぅっ・・・良いじゃないですか、回転していることがより鮮明にわかって。」

OL「直せ!!ただでさえごちゃごちゃする戦闘画面なんだから!!」

f:id:shakeflower93:20170730202536j:plain

森クマ「ぎぃー!!」

 

 

f:id:shakeflower93:20161029104634j:plain

夜(25℃超え)

 

f:id:shakeflower93:20170803215927j:plain

森クマ「ぐぎぎぎ・・・だめだぁ、どうしてもHPゲージが一緒に回転してしまうクマ」

 

戦闘画面におけるキャラ表示の仕組みは、ベースとなる透明のSpriteに、キャラ画像のSpriteやステータス情報を表示するSpriteを子供として追加しているクマ。

 

f:id:shakeflower93:20170803223820p:plain

 (これが良いやりかたなのかは謎)

ベースのSpriteをActionで動かすと、子SpriteのHPゲージとかも追随して動いてくれる。 しかし、「回転しながら移動して攻撃」を実現しようとすると、HPゲージも一緒に回ってしまうのだ。

 

     baseSprite->addChild(charaSprite);

     baseSprite->addChild(statusSprite);

     baseSprite->runAction(Spawn::create( 

                                MoveBy::create(0.5, Vec2(0, 500)), // 移動しつつ

                                RotateBy::create(0.5, 360*3), // 回転だー!

                                NULL)

                            );

 

 

HPゲージは、「座標の移動」には追随してほしいけど、「回転」には追随してほしくない・・・

MoveActionはベースSpriteに、RotateActionはステータスSpriteにだけ効かせるように、それぞれActionを設定すれば良いのか・・・しかし実際には、Sequenceを利用して、「回転移動→垂直ジャンプ(回転しない)→元の位置に回転して移動・・・」みたいに複数のアクションを順次実行したいクマ・・・その場合、SpriteごとにActionを分離して動作を無理やり同期させるのは難しすぎる・・・

 

他の対策として考えられるのは、HPゲージを親ノードに追加せずに、毎フレーム座標を書き換えながら追随させるとか・・・しかし今からそんなふうに作り変えるのは面倒クマ・・・もう知らん・・・

 

 ?「げひひ・・・お困りのようだな」

 

そ、その声は・・・

f:id:shakeflower93:20170106004842j:plain

ビスクアット先生!!

(ビスクアット先生は、森の開発室のPGリーダークマ!少女さんの絵に囚われて、永遠のデスマーチを強いられ、厳しいソースレビューを続けているうちにプログラマたちからの反感を買い、心を壊してしまったクマ!)

 

shakeflower.hatenablog.com

 

森クマ「結構ですクマ!!お帰りください!!」 

 

ビスクアット「ぐへへへ・・・まぁそう言うな。少女様から早くおまえのタスクを終わらせてこっちの開発チームに連れてこいって言われてんだ・・・」

 

森クマ「えぇっ・・・いやクマ・・・」

 

「今日紹介する関数はTargetedActionだ!これを利用すれば、親ノードの一連の動作を定義したSequenceActionの中に、別のNode(子ノードも可)を個別に動かすActionを含めることもできるんだぜ・・・最高だろう」

 

f:id:shakeflower93:20170730200137p:plain

森クマ「えぇっ!?子ノードを個別に!?」 

    baseSprite->addChild(charaSprite);

    baseSprite->addChild(statusSprite);

    baseSprite->runAction(Spawn::create(

                MoveBy::create(0.5, Vec2(0, 500)), 

                TargetedAction::create(charaSprite, RotateBy::create(0.5, 360*3)), // キャラの画像だけ回転させる

                NULL)

    );

 

f:id:shakeflower93:20170804083351p:plain

 森クマ「できたー!!!!ありがとうございますビスクアット先生!お帰りはこちらですクマ!!」

 

ビスクアット「それにしても汚いコードだな・・・どれ、俺様が少しレビューしてやろう・・・」 

 

森クマ「あぁーっ!!!」

 

f:id:shakeflower93:20170610223530j:plain

 

Android/iOS合わせて予約500人突破!あと少しで伝説のあのスタンプが解禁クマ!

(これ以上解禁しちゃうと序盤のゲームバランスが死ぬクマ)

f:id:shakeflower93:20170615090448j:plain

 

f:id:shakeflower93:20170803222529j:plain

(はやく絵の中に帰っておくれクマ・・・)