ゲームに新しくシーンを追加する場合は、次のようなクラスを作成する。
<ヘッダーファイル> (●●の部分はシーン名。Ctrl+Hで簡単に置換できる。)
#pragma once#include "Engine/GameObject.h"//■■シーンを管理するクラスclass ●●●Scene : public GameObject{public: //コンストラクタ //引数:parent 親オブジェクト(SceneManager) ●●●Scene(GameObject* parent); //初期化 void Initialize() override; //更新 void Update() override; //描画 void Draw() override; //開放 void Release() override;};<ソースファイル> (●●の部分はシーン名)
#include "●●●Scene.h"//コンストラクタ●●●Scene::●●●Scene(GameObject * parent) : GameObject(parent, "●●●Scene"){}//初期化void ●●●Scene::Initialize(){}//更新void ●●●Scene::Update(){}//描画void ●●●Scene::Draw(){}//開放void ●●●Scene::Release(){}クラスを作ったら、そのシーンに切り替えられるように準備する。
<SceneManager.h> (太字部分を追加。◆◆◆は好きな名前)
#pragma once//ゲームに登場するシーンenum SCENE_ID { SCENE_ID_TEST = 0, SCENE_ID_◆◆◆,};<SceneManager.cpp> (太字部分を追加)
#include "../TestScene.h"#include "../●●●Scene.h" : : ://更新void SceneManager::Update(){ //次のシーンが現在のシーンと違う = シーンを切り替えなければならない if (currentSceneID_ != nextSceneID_) { //そのシーンのオブジェクトを全削除 KillAllChildren(); //ロードしたデータを全削除 Model::AllRelease(); Image::AllRelease(); //次のシーンを作成 switch (nextSceneID_) { case SCENE_ID_TEST: Instantiate<TestScene>(this); break; case SCENE_ID_◆◆◆: Instantiate<●●●Scene>(this); break; } currentSceneID_ = nextSceneID_; }}上記の準備ができれば、いつでもシーンを切り替えられる。
まず、切り替え処理を書きたいソースの上部に次のインクルードを追加。
#include "Engine/SceneManager.h"そして、シーンを切り替えたいタイミングで次のように書く。
SceneManager* pSceneManager = (SceneManager*)FindObject("SceneManager");pSceneManager->ChangeScene(SCENE_ID_◆◆◆);FindObject関数は引数に書いた名前のゲームオブジェクトを探してくる関数。
それを使ってシーンマネージャーを探し、ChangeScene関数で次のシーンを指定。
実際にシーンが切り替わるのは、現在のシーンのすべての処理が終わってからになる。
最初のシーン(通常はタイトルシーン)は次のように設定する。
<SceneManager.cpp> (太字部分のみ変更)
//初期化void SceneManager::Initialize(){ //最初のシーンを準備 currentSceneID_ = SCENE_ID_◆◆◆; nextSceneID_ = currentSceneID_; Instantiate<●●●Scene>(this);}デフォルトでは「TestScene」というのが最初のステージに設定されている。
ここを変更した時点でTestSceneは必要ないので削除しても構わない。