【Cocos2d-x 3.0】 シーンとレイヤーの作成

ども、s0_maです。

今日は、シーンとレイヤーのサンプルを作ってみました。…と言っても、すでにHelloWorldの中にあるじゃん!とお思いの方も多いでしょうが、なんとなくあの書き方が個人的に気持ち悪かったので。(だってHelloWorldSceneクラスなのにLayerを継承していて、実際には内部でScene::create()して自分自身をそれにaddChildして返すって、なんかパッと理解しにくかったもので。。。)

f:id:tenclaps:20140601172244j:plain

あまり(に初歩的なためか)他のサイトでは見かけなかったのですが、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の方が洗練されて読みやすいものなのでしょうか。または意味合いが全く変わってしまうのでしょうか?どなたか詳しい方、背景やアドバイス等いただければ幸いです。