Cocos2d-xにて画面間で共有できるレイヤーを活用する方法
Cocos2d-xを触っていて
- 通知系のポップアップを表示させた後に消えるような処理をやりたいけど、画面遷移後も一定時間は必ず表示し続けるようにしたい(PS3のゲームでトロフィー獲得時に出現する通知みたいな感じのやつ)
- 画面の左上に常にデバッグ用に各種パラメータを表示するようにしたい
これをやろうとしてハマった内容をメモしておきます。
これらの処理を正攻法で実現しようとすることを考える。
replaceScene()、pushScene()で画面遷移すると、当然ながら画面遷移先で前画面の内容が消えてしまいます。pushScene()の場合は、前画面の内容は消えませんが、遷移先の画面が被さる形になるため、表示内容的には画面から消えてしまいますね。
通知のポップアップとデバッグ出力系のレイアウトは、画面遷移時に消えてもらっては困るのです。
画面遷移直前に共有したい画面を取り出して次画面に引き渡す案も考えましたが、影響範囲が大きくなってしまうので断念しました。
試行錯誤した結果、こんな感じで実現できました。
// AppDelegate.cpp
bool AppDelegate::applicationDidFinishLaunching() {
/**
省略
*/ // 共有レイヤー追加 CCDirector::sharedDirector()->setNotificationNode(CCNode::create());
// 共有レイヤー内にデバッグ用レイヤー追加 DebugLayer *debugLayer = DebugLayer::create(); debugLayer->setTag(999); CCDirector::sharedDirector()->getNotificationNode()->addChild((CCNode*)debugLayer); debugLayer->onEnter();
}
各画面からデバッグ用レイヤーへアクセスする方法。
CCDirector::sharedDirector()->getNotificationNode()->getChildByTag(999); // 予め指定したタグ番号で参照してみる
本来の想定される使われ方とは違うのかもしれませんが、CCDirectorクラス内のm_pNotificationNodeというCCLayer*型のメンバを利用することで実現できました。