忍者ブログ
個人的な情報蓄積 時系列にノージャンルで
[65] [64] [63] [62] [61] [60] [59] [58] [57] [56] [55]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

DirextXを用いて、ゲームを作成する場合、
イベント駆動型のプログラミングではなく、バックグラウンドでループ処理を使う必要がある。

■サンプルソース1
#include <windows.h>

LRESULT CALLBACK
proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return(DefWindowProc(hWnd, msg, wp, lp));
    }

    return 0;
}

HWND
init(HINSTANCE hInst)
{
    HWND hWnd;
    WNDCLASSEX wc;

    // ウィンドウクラス登録
    memset(&wc, 0, sizeof(wc));
    wc.hInstance     = hInst;
    wc.lpszClassName = TEXT("mainwin");
    wc.lpfnWndProc   = proc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm       = LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    if(!RegisterClassEx(&wc)) return 0;

    // ウィンドウ作成
    hWnd = CreateWindow(
        TEXT("mainwin"),        // ウィンドウクラス名
        TEXT("test"),           // ウィンドウ名
        WS_OVERLAPPEDWINDOW,    // ウィンドウスタイル
        CW_USEDEFAULT,          // ウィンドウ表示位置(X)
        CW_USEDEFAULT,          // ウィンドウ表示位置(Y)
        CW_USEDEFAULT,          // ウィンドウサイズ(X)
        CW_USEDEFAULT,          // ウィンドウサイズ(Y)
        NULL,                   // 親ウィンドウハンドル
        NULL,                   // メニューハンドル
        hInst,                  // インスタンスハンドル
        NULL                    // 引数データ
    );

    // ウィンドウ表示
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    return hWnd;
}

int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPSTR args, int dummy)
{
    init(hInst);

    MSG msg;
    do{
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            // ここにループ処理を記載する。
        }
    }while(msg.message != WM_QUIT);
}
■サンプルソース2
サンプルソース1からWinMainだけを差し替えてください。
int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPSTR args, int dummy)
{
    init(hInst);

    MSG msg;
    do{
        if(PeekMessage(&msg , NULL , 0 , 0 , PM_NOREMOVE))
        {
            if(!GetMessage(&msg , NULL , 0 , 0))
                break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            // ここにループ処理を記載する。
        }
    }while(msg.message != WM_QUIT);
}
PM_REMOVE→ PM_NOREMOVEに変更してGetMessageを追加
一見無意味な気もしますがこちらの方が処理が早いという噂があります。
プログラムカウンタの計測をして処理が早いかどうかを調べたことないので噂です。
個人的にはサンプルソース2は不必要と思っています。
PeekMessage説明
PR

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カウンター
ブログ内検索
カレンダー
06 2025/07 08
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
忍者アド
アクセス解析
フリーエリア