を作ったりしかしてないので、基礎をもっとしっかりしてから
取り組んだ方が良いと考えてたのですが、どうしても3Dゲームを作ってみたい
という一心でダイレクトXの参考書を買って自分用の3D関数ライブラリを作ろう
まで進んだのですが、途中で詰んでしまい困っています!
初めて質問するので、至らない点があるかもしれませんが、どなたかご教授願いします!
□質問内容□
関数ポインタ?msg という識別子を取り込めない原因
□実行結果□
ウィンドウの枠だけが表示される
□環境□
OS:Windows XP コンパイラ名:visual studio 2008 PE Microsoft DirectX SDK (November 2008)
リンカ入力の依存ファイル:d3d9.lib d3dx9.lib winmm.lib
□エラーの内容□
error C2065: 'msg' : 定義されていない識別子です。
error C2228: '.message' の左側はクラス、構造体、共用体でなければなりません。
型は ''unknown-type'' です。
fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
□プログラムコード□
main.cpp
#include "my3dlib.h" //----------------------------------------------------------------------------- //WinMain関数 //----------------------------------------------------------------------------- INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT ) { if( SUCCEEDED( InitD3DWindow(_T("My3DLibTest"), 640, 480) ) ) // メッセージループ MSG msg = {0}; while( msg.message != WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } } } UnregisterClass( _T("D3D Window Class"), wc.hInstance ); return 0; }my3dlib.cpp
#include "my3dlib.h" //グローバル変数 LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; float g_aspect = 1.0f; //リソースの解放 VOID Cleanup() { if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); if( g_pD3D != NULL ) g_pD3D->Release(); } //ウィンドウプロシージャ LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } //ウィンドウモードでD3D初期化 HRESULT InitD3DWindow(LPCTSTR wintitle, int w, int h){ //ウィンドウクラス作成 WNDCLASSEX wc = { sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle( NULL ), NULL, NULL, NULL, NULL, _T("D3D Window Class"), NULL }; RegisterClassEx( &wc ); //ウィンドウ作成 HWND hWnd = CreateWindow( _T("D3D Window Class"), wintitle, WS_OVERLAPPED | WS_SYSMENU, 100, 100, w, h, NULL, NULL, wc.hInstance, NULL ); //ビューポートアスペクトの記録 g_aspect = (float)w / (float)h; //D3D9の作成 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; //D3Dデバイスの作成(可能ならハードウェアT&Lを使用) D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof( d3dpp ) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } } //Zバッファをオン g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); ShowWindow( hWnd, SW_SHOWDEFAULT ); return S_OK; }my3dlib.h
#include <Windows.h> #include <mmsystem.h> #include <d3dx9.h> #include <tchar.h> //グローバル変数 extern LPDIRECT3D9 g_pD3D; extern LPDIRECT3DDEVICE9 g_pd3dDevice; extern float g_aspect; //関数プロトタイプ宣言 HRESULT InitD3DWindow(LPCTSTR wintitle, int w, int h);長くなって申し訳ありませんが、よろしくお願いします!