#cocos2dx トランジションを指定したpopSceneをライブラリを魔改造せずに実装する
シーンを移動する時にpushSceneとかpopSceneを使って画面遷移を実装することができるのですが、
pushSceneにはtransitionを指定して遷移できるのにpopSceneにはなぜかtransitionの指定がない!
行くときはアニメーションできるのに戻るときはアニメーションができない!
なんでやねん!!!
ということで探しに探して素晴らしいベストプラクティスを発見したのでその感動を共有。
よく知られてるあまりよくなさそうなやり方
ライブラリを直接魔改造して実装するというやり方
以下のようにやられてる方が多いみたいです。
ただ、これ、cocos2d-xのコード自体を修正しないといけないという恐ろしい手法です。
最底辺にはとても出来ません。結局、全部replaceScene使うのが良いのかねえ。。。
そこで調べてみたところ、CCDirectionに手を加える事でpopSceneにCCTransitionXXをセットすることができた。
本当はCCDirectionなどに手を加えたくはないのだけど、他に方法はなさそうなのでしょうがない。
みなさんしぶしぶ魔改造しているみたいです。
ところが奥さん!
今回発見した新しい方法は魔改造せずに実装できるのでライブラリを更新とかしても問題なくできるんですよ!!
新しいpopSceneの実装方法
では魔改造せずにどんな方法で実装するかというと以下に素晴らしいベストプラクティスが書いてありました。
上記みればまるわかりですが、こちらでも説明すると、まず以下のソースのCustomDirector.hを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
NS_CC_BEGIN class CustomDirector : public Director { public: template<class T> void popSceneWithTransition(float duration) { CCASSERT(_runningScene != NULL, "running scene should not null"); _scenesStack.popBack(); ssize_t c = _scenesStack.size(); if (c == 0) { end(); } else { Scene *scene = (Scene *)T::create(duration, (Scene *)_scenesStack.at(c-1)); _scenesStack.replace(c-1, scene); _sendCleanupToScene = true; _nextScene = (Scene*)_scenesStack.at(c - 1); } } }; NS_CC_END |
そして実際にTransitionを指定して遷移したいときは以下のように呼び出すだけ!!
1 2 |
CustomDirector *director = (CustomDirector *)Director::getInstance(); director->popSceneWithTransition<TransitionSlideInR>(0.5); |
素晴らしい!!!!!!!
わいが探してたのはこの方法だったんですよ!!!!!
objective-cやswiftみたいにカテゴリ的なもので実装できないかなぁとか思って調べてたんですが、いかんせんC++力が足りなくてやりかたがさっぱりわからず挫折しかけていました(多分C++でカテゴリできない気がしますが)
こんなかんじでライブラリを魔改造せずに実装できて非常に感動しました!!
おもわずキタ━━━━(゚∀゚)━━━━!!と叫ぶくらいに!
これ使って素晴らしいTransitionライフをおくってきます!!