さてー。ゲーム製作ですが、ちょい時間が開きましたががんばって作業してみます(笑
1.ゲームの各場面をSceneと呼ぶことにして、それらをスケジューリングするシステムを考える。
・各シーンにはそれぞれInit()、Update()、Render()というメソッドがインターフェースとして定義されている。
・メインループからは各Sceneをスケジューリングした結果のCollectionを操作する。1フレームではCollectionループで各シーンのUpdate()全部、各シーンのRender()全部を呼び出す。基本的に各Update()が自らSceneのスケジューリングなどを能動的に行うようにする。
・Init()は新しいSceneがスケジューリングされる際に一度だけ呼び出される。
というのがざっくりした仕様。スケジューリングするCollectionは.NETの既存クラスでもいいけどたとえば弾だったりしたら1秒間にそれこそ100回とか1000回とか生成される気がする。そういうのって果たしてGCで処理落ちしまくるとかしないかなあ??うーん。想像して心配してもしょうがないのでとりあえず作ってみてまずそうなら考え直そう。
とりあえずSceneの雛形になるクラス
class SceneBase
{
/// <summary>
/// スケジューラによって操作されるカウンター
/// ・Init()呼び出しの前に0にされる。
/// ・Update(),Render()を呼び終わったあと+1される。
/// ・PAUSE中は+1されない。
/// </summary>
internal int BaseCounter;
/// <summary>
/// 新しいシーン確認
/// ★Update()呼び出しはシーンの最終フレームを1フレーム
/// 超えて呼び出される。この確認で新しいシーンに割り込ん
/// でいる確認をしたあとはすみやかにfalseを返す。
/// (戻り:新しいシーンならtrue)
/// </summary>
/// <param name="limit">繰り返しLimit回数</param>
protected bool IsNewFrame(int limit)
{
return BaseCounter >= limit;
}
/// <summary>
/// 初期処理
/// ★スケジューリング直後一度だけ呼び出される
/// </summary>
internal virtual void Init()
{
}
/// <summary>
/// シーン更新(戻り:falseならスケジュールから除外)
/// ★Update()でfalseを返したフレームのRender()は呼び出されない。
/// </summary>
internal virtual bool Update()
{
return true;
}
/// <summary>
/// シーン描画
/// Update()がfalseを返すまで毎フレーム呼び出される
/// ★Update()でfalseを返したフレームのRender()は呼び出されない。
/// </summary>
internal virtual void Render()
{
}
}