【Cocos2d-x 3.0】 シーンとレイヤーの作成
ども、s0_maです。
今日は、シーンとレイヤーのサンプルを作ってみました。…と言っても、すでにHelloWorldの中にあるじゃん!とお思いの方も多いでしょうが、なんとなくあの書き方が個人的に気持ち悪かったので。(だってHelloWorldSceneクラスなのにLayerを継承していて、実際には内部でScene::create()して自分自身をそれにaddChildして返すって、なんかパッと理解しにくかったもので。。。)
あまり(に初歩的なためか)他のサイトでは見かけなかったのですが、SceneとLayerをきちんと分離してHelloWorldを書きなおしてみました。この方が私のような素人的に拡張しやすいと思ったので。
まずはヘッダファイル。
HelloWorldScene.h
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" class HelloWorld : public cocos2d::Scene { public: virtual bool init(); CREATE_FUNC(HelloWorld); }; class HelloWorldLayer : public cocos2d::Layer { public: virtual bool init(); CREATE_FUNC(HelloWorldLayer); void menuCloseCallback(cocos2d::Ref* pSender); }; #endif // __HELLOWORLD_SCENE_H__
Sceneとその中にあるLayerを別々にクラスとして宣言しました。"Cocosのクラス"::create()を使うためのCREATE_FUNCマクロとcreate()された時に呼び出されるinit()関数がそれぞれに宣言してあります。
そして、本体のcppファイル。ヘッダで宣言したinit()関数が主な内容です。
HelloWorldScene.cpp
#include "HelloWorldScene.h" USING_NS_CC; bool HelloWorld::init() { if ( !Scene::init() ){ return false; } auto layer = HelloWorldLayer::create(); this->addChild(layer); return true; } bool HelloWorldLayer::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin(); //以下、CloseItem, Label, Spriteの追加部分は全く同じなので省略 return true; } void HelloWorldLayer::menuCloseCallback(Ref* pSender) { //HelloWorldLayerの関数になっているというだけで、中身の処理は同じ }
Layerを独立したクラスとしたため、HelloWorldScene::init()の中でレイヤーをcreateし、addChild()しています。 ちなみに、init()関数はcocos2d-xにおけるコンストラクタ的なもので、create()でインスタンスを作った時に内部的に呼び出されているようです。
あとは、HelloWorldScene::createScene()の代わりに、HelloWorldScene::create()を使うだけ。
とまぁ、こんなふうに書きなおしてみたわけなのですが、どうなんでしょう。やはり玄人目には元のHelloWorldの方が洗練されて読みやすいものなのでしょうか。または意味合いが全く変わってしまうのでしょうか?どなたか詳しい方、背景やアドバイス等いただければ幸いです。