個人的な情報蓄積
時系列にノージャンルで
× [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 ![]() ![]() |
カテゴリー
カウンター
ブログ内検索
カレンダー
忍者アド
アクセス解析
|