いちばんやさしいゲームの作り方

文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ

Windows アプリケーションのひな形を見つけましたので載せておきます。

かなり昔に書いたソースなのですが稚拙ながらもゲームに応用しようという努力がほほえましいですね。

今後のゲーム開発にも使える部分は使っていこうと思います。

/**
 * @file
 * @brief Windows アプリケーションの雛形
 *
 * Windows アプリケーションを作成する際の雛形ファイル。
 * コンパイルオプション /EHsc が必要。
 * ライブラリ kernel32.lib user32.lib gdi32.lib が必要。
 *
 * @author Byerkut
 * @date 2005-12-16
 * @version $Id: $
 */

#define _UNICODE

#define UNICODE


#include <windows.h>


/*======================================================================
 * プロトタイプ宣言
 *======================================================================*/

/// ウィンドウプロシージャ(コールバック関数)
LRESULT CALLBACK WindowProcedure(HWND hWnd,
                                 UINT msg,
                                 WPARAM wp,
                                 LPARAM lp);

/*======================================================================
 * 定数
 *======================================================================*/

/// クライアントサイズの幅
static const unsigned int iClientWidth = 640;

/// クライアントサイズの高さ
static const unsigned int iClientHeight = 480;

/*======================================================================
 * グローバル変数
 *======================================================================*/

/// ウィンドウクラス名
static LPCTSTR szClassName = TEXT("template");

/// タイトルバーの文字列
static LPCTSTR szTitleBar = TEXT("タイトルバーの文字列");

/// インスタンスハンドル
static HINSTANCE hInstance = NULL;

/*======================================================================
 * 関数
 *======================================================================*/

/**
 * アプリケーションのエントリーポイント
 *
 * @param[in] hInstance 現在のインスタンスハンドル
 * @param[in] hPreviousInstance 過去のインスタンスハンドル
 * @param[in] lpsCommandLine コマンドライン引数
 * @param[in] nCommandShow ウィンドウ状態
 *
 * @return アプリケーションの終了コード
 */
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPreviousInstance,
                   LPSTR lpsCommandLine,
                   int nCommandShow)
{
  // hInstance の格納

  ::hInstance = hInstance;

  // ミューテックスによる多重起動の検出
  HANDLE hMutex;
  hMutex = ::CreateMutex(NULL, TRUE, szClassName);
  if (::GetLastError() == ERROR_ALREADY_EXISTS) {
    return 0;
  }

  // アプリケーション初期化
  {
    // ウィンドウクラスを定義する
    WNDCLASSEX wc;

    // 構造体のサイズ
    wc.cbSize = sizeof(WNDCLASSEX);
    // クラスのスタイル
    wc.style = CS_HREDRAW | CS_VREDRAW;
    // ウィンドウプロシージャ名
    wc.lpfnWndProc = ::WindowProcedure;
    // 補助メモリ
    wc.cbClsExtra = 0;
    // 補助メモリ
    wc.cbWndExtra = 0;
    // インスタンスハンドル
    wc.hInstance = ::hInstance;
    // アイコン
    wc.hIcon = (HICON)::LoadImage(NULL,
                                  MAKEINTRESOURCE(IDI_APPLICATION),
                                  IMAGE_ICON,
                                  0,
                                  0,
                                  LR_DEFAULTSIZE | LR_SHARED);
    // カーソル
    wc.hCursor = (HCURSOR)::LoadImage(NULL,
                                      MAKEINTRESOURCE(IDC_ARROW),
                                      IMAGE_CURSOR,
                                      0,
                                      0,
                                      LR_DEFAULTSIZE | LR_SHARED);
    // 背景ブラシ
    wc.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
    // メニュー名
    wc.lpszMenuName = NULL;
    // クラス名
    wc.lpszClassName = ::szClassName;
    // 小さいアイコン
    wc.hIconSm = (HICON)::LoadImage(NULL,
                                    MAKEINTRESOURCE(IDI_APPLICATION),
                                    IMAGE_ICON,
                                    0,
                                    0,
                                    LR_DEFAULTSIZE | LR_SHARED);

    // ウィンドウクラスを登録する
    if (!::RegisterClassEx(&wc))
      return FALSE;
  }

  // インスタンス初期化
  {
    // ウィンドウサイズを計算する
    unsigned int windowWidth = iClientWidth
      + GetSystemMetrics(SM_CXEDGE)
      + GetSystemMetrics(SM_CXBORDER)
      + GetSystemMetrics(SM_CXDLGFRAME);
    unsigned int windowHeight = iClientHeight
      + GetSystemMetrics(SM_CYEDGE)
      + GetSystemMetrics(SM_CYBORDER)
      + GetSystemMetrics(SM_CYDLGFRAME)
      + GetSystemMetrics(SM_CYCAPTION);

    // ウィンドウを作成する
    HWND hWnd;
    hWnd = ::CreateWindow(// クラス名

                          ::szClassName,
                          // タイトルバーの文字列

                          ::szTitleBar,
                          // ウィンドウの種類
                          WS_OVERLAPPEDWINDOW &
                          ~WS_THICKFRAME &
                          ~WS_MAXIMIZEBOX,
                          // x 座標
                          GetSystemMetrics(SM_CXSCREEN)/2 - windowWidth/2,
                          // y 座標
                          GetSystemMetrics(SM_CYSCREEN)/2 - windowHeight/2,
                          // 幅
                          windowWidth,
                          // 高さ
                          windowHeight,
                          // 親ウィンドウのハンドル
                          // 親を作るときは NULL
                          NULL,
                          // メニューハンドル
                          // クラスメニューを作るときは NULL
                          NULL,
                          // インスタンスハンドル
                          hInstance,
                          // ウィンドウ作成データ
                          NULL);

    if (!hWnd)
      return FALSE;

    // ウィンドウを表示する

    ::ShowWindow(hWnd, nCommandShow);

    // ウィンドウを再描画する

    ::UpdateWindow(hWnd);
  }

  // メッセージループ
  MSG msg;
  ::ZeroMemory(&msg, sizeof(MSG));
  while (msg.message != WM_QUIT) {
    if (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
      ::TranslateMessage(&msg);
      // メッセージをウィンドウプロシージャに送信

      ::DispatchMessage(&msg);
    } else {
      // ゲームシステムのメインループ
    }
  }

  // ミューテックスを閉じる

  ::CloseHandle(hMutex);

  // PostQuitMessage 関数によってポストされた
  // WM_QUIT メッセージの wParam を終了コードとして返す
  return (int)msg.wParam;

}

/**
 * ウィンドウプロシージャ用のコールバック関数
 *
 * @param[in] hWnd ウィンドウハンドル
 * @param[in] msg メッセージ内容
 * @param[in] wp 補助パラメータ
 * @param[in] lp 補助パラメータ
 *
 * @return メッセージ処理の結果
 */
LRESULT CALLBACK WindowProcedure(HWND hWnd,
                                 UINT msg,
                                 WPARAM wp,
                                 LPARAM lp)
{

  switch (msg)
    {
    case WM_CREATE:
      // ゲームシステムの初期化
      {
      }
      break;
    case WM_ACTIVATE:
      if (wp == WA_ACTIVE) {
        // ゲームシステムのアクティブ化
      } else {
        // ゲームシステムの非アクティブ化
      }
      break;
    case WM_CLOSE:
      // 閉じる操作が行われた時 WM_DESTROY をポストする

      ::DestroyWindow(hWnd);
      break;
    case WM_DESTROY:
      // ゲームシステムの終了
      {
      }
      // WM_QUIT をポスト(引数は終了コード)

      ::PostQuitMessage(0);
      break;
    default:
      return ::DefWindowProc(hWnd, msg, wp, lp);
    }

  // 自分で処理した場合は必ず 0 を返す
  return 0;

}

こちらにさらに新しい情報があります!

Contributions




Trackback URL

メルマガ登録・解除
 
挫折不可能!初級ゲームプログラミング完全マニュアル
RSS track feedいちばんやさしいゲームの作り方 カウンター
ブログSEO対策:track word あわせて読みたい SEO STATUS