以下でシーンごとのソース管理について
お尋ねしたものです。
http://www.play21.jp/board/formz.cgi?ac ... &rln=38727
現在、皆様のアドバイスで分割することができております。
ただシーンが増えてきていて今度はメイン処理のインクルードの長さに困っております。
そこでシーンのみを管理できるシート(SceneTbl.cpp)を作って
それをメイン処理のソースにインクルードするだけでいいようなロジックにしたいです。
どのようにすればよいのしょうか・・・?
シーンごとのソース管理
Re:シーンごとのソース管理
>それをメイン処理のソースにインクルードするだけでいいようなロジックにしたいです
単純に前のスレでいうところの GetSceneFunc()をその SceneTbl.cppに移動して、
コンパイルが通るように整えていく、でいいと思いますが。
まぁインクルードが mainから SceneTbl.cpp側に移っただけで、インクルードの長さは
変わらないですけど……。
では、ちょっといろいろアレな感じなソースですが、こんなのはどーでしょ。
添付の scene_tbl.hにこんな関数があります。
・ [color=#d0d0ff" face="sans-serif]bool SetCurrenScene(SceneID id)[/color]
カレントシーン IDを指定します。
・ [color=#d0d0ff" face="sans-serif]SceneID GetCurrentScene()[/color]
カレントシーン ID(SetCurrenScene()で指定した ID)を取得します。
・ [color=#d0d0ff" face="sans-serif]bool SetSceneFunction(SceneID id, const SceneFunc *sceneFunc);[/color]
シーン IDと対になるシーン毎の関数情報を登録します。
sceneFuncに NULLを入れると登録が解除されます。
・ [color=#d0d0ff" face="sans-serif]const SceneFunc* GetSceneFunction()[/color]
カレントシーンの関数情報を取得します。
・ [color=#d0d0ff" face="sans-serif]const SceneFunc* GetSceneFunction(SceneID id)[/color]
指定したシーン IDの関数情報を取得します。
事前に SetSceneFunction() を使って、IDと対になる関数構造体の情報を
指定しておきます。
例えば、
[color=#d0d0ff" face="monospace]
SetSceneFunction(SCENE_START, GetSceneFunc_Game());
SetSceneFunction(SCENE_GAME, GetSceneFunc_Game());
[/color]
というような感じで。
どこかのイニシャライズのところでも書いておけばいいかと思います。
次に現在のシーン IDを SetCurrenScene() で指定します。
そーすると、 GetSceneFunction() で先に指定したシーン IDに対応した
関数構造体情報が返ってきます(なければ NULLになることもあるので注意)ので、
その情報を元に、関数コールすればOKです。
つまり main関数側では GetSceneFunction() を使って呼び出す関数を取得し、
各シーンの finishとかで次のシーンを指定してあげればいい、というわけです。
この方法の利点は SetCurrenScene() によって、
同じ SCENE_GAMEでも途中で呼び出す関数構造体を動的に変更できるところです。
(多分いろいろ使い道はあると思います)
で、このままでもいいのですが、ついでなのでわざわざ SetSceneFunction() するのが面倒だ!
という場合は、構造が先のスレで紹介したような方法であれば少し便利(?)なマクロを用意してみました。
[color=#d0d0ff" face="monospace]
// -----start_scene.cpp
#include "scene_tbl.h"
static void Init() {}
static void Draw() {}
static void Finish() {}
const SceneFunc *GetSceneFunc_Start()
{
static const SceneFunc func = { &Init, NULL, &Draw, &Finish
return &func;
}
AUTO_SET_SCENE_FUNC(SCENE_START, GetSceneFunc_Start());
// -----game_scene.cpp
#include "scene_tbl.h"
static void Init() {}
static void Loop() {}
static void Draw() {}
static void Finish() {}
const SceneFunc *GetSceneFunc_Game()
{
static const SceneFunc func = { &Init, &Loop, &Draw, &Finish
return &func;
}
AUTO_SET_SCENE_FUNC(SCENE_GAME, GetSceneFunc_Game());<hr width="40%" align="left" color="#101010][/color]
この AUTO_SET_SCENE_FUNC のマクロで自動的に SetSceneFunction()してくれますので、
後はカレントとなるシーン IDを指定して、対応する関数構造体を取得するだけ
になります(ヘッダでは使わないで下さい)。
ただ、欠点としてはこれを使った上で SceneIDを変更したとき、
必然的に各シーンファイルの再コンパイルが必要になることですね……。