ゲームフレームワーク的なものを作る。(1)〜Gameクラス〜

前回「windowsでゲームループを作る。(2)〜Windowクラス〜 - while( c++ );」のゲームループをさらに発展させて、ゲームフレームワーク的なものを適当に作っていきます。

Gameクラスを作る

ゲームを起動するためには、事前に様々なオブジェクトの初期化が必要で、また初期化は失敗する可能性があります。つまり、初期化成功後にゲームループを回すことになります。

int main()
{
    ウィンドウ生成;

    if( ゲームの初期化処理 )
    {
        //ゲームループ
        while( ... )
        {
            1フレームの処理;
        }
    }
    ゲームの解放処理;
    return 0;
}

ということで、以下のようなGameクラスを作ります。

  • コンストラク
    • 既存ウィンドウの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;
}

サンプル

次回は、DirectXを使った描画機能を追加します。

6/6追記

某つぶやきでお叱りを頂いたので(名指しはされてないけど、タイミングと内容から自分のことかな)、ちょっと言い訳をすると、前回・今回からのエントリはC++初心者(C言語からC++へ移行中の方)を想定しています。最初は極力C++0x・boost的なコードは避けて、いずれC言語的な記述から、よりC++らしい記述へシフトしていこうと考えていました。が、次回から初期化・解放メソッドは廃止して、コンストラクタでの初期化・例外処理を使った形に書き換えていこうと思います。というか、初心者云々と偉そうなことを言えるほど、C++を理解してるわけじゃないですが…。