cocos2d-x シーン・レイヤー・スプライトとは
2017/10/25
一応cocos2d-xの基礎的なところ。
あまり詳しく説明はしていませんが、
自分なりの解釈をしておかないとなかなか作りこみが難しいので。
●シーン(Scene)
ゲームの1つ1つの画面をシーンと言う。
スプラッシュの画面があって、タイトル画面に遷移して、ゲームの画面でゲームをして、ゲームオーバー画面で終わり。
みたいな感じだと、それぞれシーンが作られて、ファイルもその単位に作りました。
SplashScene.cpp
SplashScene.h
TitleScene.cpp
TitleScene.h
GameScene.cpp
GameScene.h
GameOverScene.cpp
GameOverScene.h
といった感じですね。
●レイヤー(layer)
レイアーは、シーン上で利用できるオブジェクト。
たとえば背景を処理するレイヤー、ゲームの処理をするレイヤー、メニューを操作するレイヤーなど、オブジェクト毎にレイヤーが作られるはず。
ですが、自分はそんなことはあまり意識せずに行っているので良いとは言えないかも。。
●スプライト(Sprite)
画像のことですね。画像を表示するときなどに使います。
イメージとしてはスプライトをレイヤーに追加して、レイヤーをシーンに追加する。
という感じでしょうか。
以下、自分のスプラッシュ画面のソースコード
シーン・レイヤー・スプライトがどうやって作られているか意識すると理解が深まると思います。
SplashScene.h です。
// SplashScene.h です。 #ifndef SPLASHSCENE_H_ #define SPLASHSCENE_H_ #include "cocos2d.h" class SplashScene : public cocos2d::LayerColor { public: // 以下はおまじないのようなもので、 // シーンを作成するときにはついてくるものになります。 // init関数は画面の初期化用です virtual bool init(); // シーン作成用です。 static cocos2d::Scene* scene(); CREATE_FUNC(SplashScene); // 以上おまじない。 // init関数から下記を呼び出すのでヘッダーで定義。 void gameLogic_(float dt); }; #endif /* SPLASHSCENE_H_ */
SplashScene.cpp です。
// SplashScene.cpp です。 // SplashScene→TitleSceneと遷移するのでincludeしてます。 #include "SplashScene.h" #include "TitleScene.h" using namespace cocos2d; // シーンを作成します。 // do{・・・} while(0)のくだりは自分のサンプルが // そうなっていたので。。。 // 他のホームページで調べてみるとこの部分はなかったりします。 // 自分の環境ではこれがないと動かないみたいです。。 Scene* SplashScene::scene() { // シーンの作成です。 Scene * scene = NULL; do { scene = Scene::create(); CC_BREAK_IF(! scene); // レイヤーの作成です。 SplashScene *layer = SplashScene::create(); CC_BREAK_IF(! layer); // レイヤーをシーンにaddします。 scene->addChild(layer); } while (0); return scene; } // 画面のイニシャライズです。 bool SplashScene::init() { bool bRet = false; do { // 背景色の設定 CC_BREAK_IF(! LayerColor::initWithColor( Color4B(255,255,255,255) ) ); // 画面解像度取得と0座標取得は良く使いますので先に入れておきましょう。 // 画面解像度を取得 Size visibleSize = Director::getInstance()->getVisibleSize(); // 0座標を取得 Point origin = Director::getInstance()->getVisibleOrigin(); // スプライト(画像)の作成です。ここでは背景画像として設定します。 // Rectは画像を切り取る関数ですが、引数は // (切り取りスタートのx座標,切り取りスタートのy座標,切り取る幅,切り取る高さ)です。 Sprite *stage = Sprite::create("splash.png", Rect(0, 0, 320, 480) ); // どこに配置するかを決めます。 // 切り取った画像のど真ん中をどこに配置するかポジショニングします。 // 下記の場合 // x座標:origin.x + visibleSize.width/2 は原点(画面左下)から画面の半分横にプラスしたところ。 // y座標:origin.y + visibleSize.height/2 は原点(画面左下)から画面の半分上にプラスしたところ。 stage->setPosition(Point(origin.x + visibleSize.width/2, origin.y + visibleSize.height/2)); // レイヤーにスプライトを追加します。 this->addChild(stage); // 1.5秒後に一度だけスケジュール実行します。(スケジュール実行に関しては別記事参照。) this->scheduleOnce( schedule_selector(SplashScene::gameLogic_), 1.5f ); // 画面タッチを有効化します。 this->setTouchEnabled(true); bRet = true; } while (0); return bRet; } void SplashScene::gameLogic_(float dt) { // スケジュール実行で呼び出されます。 // スプラッシュ画面を表示して1.5秒後にこの関数が呼ばれて、 // ここではタイトル画面に遷移するようにしています。 // タイトルシーンを作成。 Scene *scene = TitleScene::scene(); // 遷移の仕方を決めています。ここではフェードインでタイトル画面に遷移。 TransitionFade* fade = TransitionFade::create(0.5f,scene); // 画面遷移の処理。 Director::getInstance()->replaceScene(fade); }