ゲームフレームワーク的なものを作る。(1)〜Gameクラス〜
前回「windowsでゲームループを作る。(2)〜Windowクラス〜 - while( c++ );」のゲームループをさらに発展させて、ゲームフレームワーク的なものを適当に作っていきます。
Gameクラスを作る
ゲームを起動するためには、事前に様々なオブジェクトの初期化が必要で、また初期化は失敗する可能性があります。つまり、初期化成功後にゲームループを回すことになります。
int main() { ウィンドウ生成; if( ゲームの初期化処理 ) { //ゲームループ while( ... ) { 1フレームの処理; } } ゲームの解放処理; return 0; }
- コンストラクタ
- 既存ウィンドウのweak_ptrを渡す
- 初期化
- 解放
- 1フレームの処理
Gameクラス
ゲーム用ウィンドウはGameクラス外部で生成済みなので、GameクラスからWindowクラスの機能を利用するために、Windowクラスのポインタ(weak_ptr)をメンバとして持たせています。
#include <memory> class Window; typedef std::weak_ptr< Window > WindowWeakPtr; /** * Gameクラス */ class Game { // ------------------------------------------------------------------------------- // 生成と破棄 // ------------------------------------------------------------------------------- public: /** * コンストラクタ */ Game( const WindowWeakPtr& window ); // ------------------------------------------------------------------------------- // 基本機能 // ------------------------------------------------------------------------------- public: /** * ゲームの初期化処理を行う */ bool Initialize(); /** * ゲームの解放処理を行う */ void Finalize(); /** * ゲーム1フレームの処理を行う */ void Run(); private: WindowWeakPtr window; ///< 既存ウィンドウを指すポインタ };
以下、Gameクラスの実装。今回は特に何もしない。
#include "Game.h" /** * コンストラクタ * * @param window 既存ウィンドウのweak_ptr */ Game::Game( const WindowWeakPtr& window ) : window( window ) { } /** * ゲームの初期化処理を行う * * @param 初期化成功時trueを、失敗時falseを返す */ bool Game::Initialize() { return true; //初期化成功 } /** * ゲームの解放処理を行う */ void Game::Release() { } /** * ゲーム1フレームの処理を行う */ void Game::Run() { }
使い方
/** * エントリーポイント */ int main() { //メモリリークの検出を有効化 // アウトプットウィンドウにメモリリーク時の情報が出力される ::_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); //ゲーム用ウィンドウを生成 WindowPtr window = Application::CreateGameWindow( "hoge", 720, 480 ); if( !window )return 0; Game game( window ); //ゲームを初期化して、ゲームループを開始する if( game.Initialize() ) { //ゲームループ // ウィンドウが閉じられるまで1フレームの処理を繰り返す while( !window->IsClosed() ) { //1フレームの処理 game.Run(); //メッセージキューにある全てのwindowsイベントを処理する Application::DoEvents(); } } game.Release(); return 0; }