やりたい事は任意の構造体をシーンの初期化時に渡したいという事ですよね。
シーンに渡すパラメータをChosen構造体とします。
ヘッダファイル名とかそちらの環境とは異なると思いますが、
私はクラス名とヘッダファイル、ソースファイルの名前は一致させる派なのでご了承ください。
ざっくり流れが分かれば十分だと思います。
まず、構造体をヘッダファイルとして定義します。
これを各シーンでインクルードします。
cpp
1#ifndef __Chosen__
2#define __Chosen__
3
4#include "cocos2d.h"
5
6struct Chosen {
7 // 任意のパラメータ
8}
9
10#endif
- HomeScene任意の場所(GameButtleSceneに遷移する処理)
#include "Chosen.h"
#include "GameButtleScene.h"
...
// パラメータ設定
Chosen chosen;
chosen.xxx = xxx;
...
// パラメータを渡してシーンを遷移
auto scene = GameButtleScene::createScene(chosen);
auto transition = TransitionFade::create(1.0f, scene);
Director::getInstance()->replaceScene(transition);
本題ですが、CREATE_FUNCは引数なしのinit()を前提としたものですので、
今回のようにパラメータ(構造体やクラスなど)を渡したい場合は使えませんので、
CREATE_FUNCやinit()自体も不要です。
createScene()については、引数を追加しておきます。
#include "Chosen.h"
class GameButtleScene : public Scene
{
public:
static Scene* createScene(const Chosen& chosen);
virtual bool initWithChosen(const Chosen& chosen);
private:
// とりあえずメンバ変数にしておきますが
// initWithChosen()の中だけでしか使わない場合はメンバ変数にする必要はなし
Chosen mChosen;
};
Scene* GameButtleScene::createScene(const Chosen& chosen) {
auto scene = new GameButtleScene();
if(scene && scene->initWithChosen(chosen)) {
scene->autorelease();
return scene;
}
CC_SAFE_DELETE(scene);
return nullptr;
}
bool GameButtleScene::initWithChosen(const Chosen& chosen) {
if(!Scene::init()) {
return false;
}
mChosen = chosen;
// 初期化処理
return true;
}
【追記】
物理エンジンを使用する場合の初期化
物理エンジンを使用する際に使用する、引数なしのScene::createWithPhysics()のソースを見ると、
Scene::initWithPhysics()を呼び出していますので、それを真似すればOKです。
つまり、GameButtleScene::initWithChosen()の中でScene::init()の代わりに、
Scene::initWithPhysics()を使うだけで物理エンジンに対応したシーンになります。
cpp
1bool GameButtleScene::initWithChosen(const Chosen& chosen) {
2/*
3 // 物理エンジンを使わない場合
4 if(!Scene::init()) {
5 return false;
6 }
7*/
8
9 // 物理エンジンを使用する場合
10 if(!Scene::initWithPhysics()) {
11 return false;
12 }
13
14 ...
15
16 return true;
17}
ScheduleUpdate
initWithChosen()の中に書くだけです。
もちろん、void update(float dt)も用意しなければいけません。
cpp
1class GameButtleScene : public Scene {
2public:
3 void update(float dt);
4}
5
6bool GameButtleScene::initWithChosen(const Chosen& chosen) {
7 if(!Scene::init()) {
8 return false;
9 }
10 mChosen = chosen;
11
12 // 初期化処理
13 scheduleUpdate();
14
15 return true;
16}
17
18void GameButtleScene::update(float dt) {
19
20}