読者です 読者をやめる 読者になる 読者になる

nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

cocos2d-x でステージごとの設定をシングルトンオブジェクトで保持する

はじめに

  • ゲームを作っていて、一つのシーンで複数のレイヤーを扱っているとき、ステージごとの設定などレイヤーをまたがって同じ値を参照できるようにしたかった
  • ので、cocos2d::CCDirector を参考に設定用のシングルトンオブジェクトを作ってみた

設定用オブジェクトのヘッダー

  • GameConfig.h として作成
#include <iostream>

class GameConfig
{
private:
    // 何かの値
    int someValue;
    
public:
    // コンストラクタでレベルごとに値を設定
    GameConfig(int level);
    // オブジェクト初期化メソッド
    static void initObject(int level);
    // オブジェクト取得メソッド
    static GameConfig* getObject();
    
    // 何かの値のゲッター
    int getSomeValue()     { return someValue; };
};

設定用オブジェクトの実装

  • GameConfig.cpp として作成
#include "GameConfig.h"

// シングルトンオブジェクトを保持する変数
static GameConfig* s_Object = NULL;

// オブジェクト初期化
void GameConfig::initObject(int level)
{
	if (!s_Object) {
	    s_Object = new GameConfig(level);
	}
}

// オブジェクト取得
GameConfig* LevelConfig::getObject()
{
    return s_Object;
}

// レベルごとの値の設定などを実行
GameConfig::GameConfig(int level)
{
    switch (level) {
        case LEVEL_EASY:
        {
        	someValue = 1;
        	break;
      	}
      	case LEVEL_HARD:
      	{
      		someValue = 2;
      		break;
      	}
      	default:
      	{
      		break;
      	} 
    }

使い方

  • ルートのレイヤーの init() などで初期化を実行
  • ルートのレイヤーや子供のレイヤーで、GameConfig::getObject() で参照