シーンの実装
シーンはどんどん増えていくものなので実装はなるべく単純かつ手間を減らせる形で対応したいです。
これまでのシステム実装はそのための布石として準備をしてきました。
ただ必要な4種類の基本処理と遷移処理。
シーン側でもこれは必須です。
でも実装するたびに呼び出す場所を増やす必要は無くしています。
ではテスト用のシーンを実装してみましょう。
TestScene.h
#pragma once #include "SceneManager.h" // テストシーンのセットアップ関数 SceneProc SetupTestScene(void);
ヘッダーに必要な記述はこれだけです。
かなり簡単になりましたね!
では次に実装部分を見ていきましょう。
TestScene.cpp
#include "TestScene.h" // 初期化 static bool SceneInit(void) { return true; } // 解放 static void SceneFinal(void) { } // 更新 static void SceneUpdate(void) { } // 描画 static void SceneRender(void) { } // シーン処理の設定 SceneProc SetupTestScene(void) { SceneProc proc = { "Test", SceneInit, SceneFinal, SceneUpdate, SceneRender, }; return proc; }
実装側もこれだけです。
Setup以外の各関数はゲームごとの処理なので今回は空ですが、そこは今まで通りですね。
SetupTestScene関数ではTestSceneで使用する関数とシーン名を設定して戻り値として返しています。
これでもう使い方も想像つきましたよね?
ではDirectX9の『テクスチャーを使った描画』までの記事で実装したWinMainにこのシーンシステムを組み込んでみましょう。
#include "Window.h" #include "DirectX.h" #include "TestScene.h" // エントリーポイント int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int width = 640; int height = 480; if( !CreateSimpleWindow(TEXT("DirectX9"), 0, 0, width, height) ) { return false; } InitializeDirectX(GetWindowHandle(), width, height, false); // シーンシステムの初期化 InitializeSceneManager(); // テストシーンへ遷移する JumpScene(SetupTestScene); // メインループ while( !IsQuitMessage() ) { if( !UpdateWindowMessage() ) { UpdateSceneManager(); RenderSceneManager(); } } // シーンシステムの終了 FinalizeSceneManager(); FinalizeDirectX(); return 0; }
これでWindowの作成とDirectXの初期化が完了した後にシーンシステムの管理下に入りました。
後は各シーンでゲームの更新や描画をしていけばキレイなコードになったんじゃないでしょうか?
時間に余裕のある人は『テクスチャーを使った描画』で実装していたRenderやリソースの初期化をシーン側で実装してみましょう。
意外と簡単にできてしかもコードがスッキリ気持ちよくなりますよ!
今回の記事の実装まで行ったサンプルプロジェクトを下記にアップしてあります。
プロジェクトファイル