|  | 分類:[C/C++]
 
 
 初めて質問させていただきます。使用言語(C++) ソフト(Visual C++ 2008)
「15歳からはじめるDirectX9 3Dゲームプログラミング教室(C++編)」という本を使っています。
そこで、xファイルを読み込み表示させるため、以下のようにmy3dlib.h my3Dlib.cpp main.cppを書き、いくつものエラーを乗り越えたのですが、エラーが出なくなったと思ったら今度はウィンドウが一瞬表示されてすぐに消えてしまう、という事態になってしまいました。一応すべては見直したのですが、何が間違っているのかわかりません。
何かお気づきの点がありましたら、どんなことでもいいので教えてください。よろしくお願い致します。
---------------------------------------------my3dlib.h--------------------------------
#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#include <tchar.h>
struct Model
{
	LPD3DXMESH				pmesh;
	D3DMATERIAL9*			pmaterials;
	LPDIRECT3DTEXTURE9*		ptextures;
	DWORD					nummaterials;
	BOOL used;
};
//グローバル変数
extern LPDIRECT3D9			g_pD3D;
extern LPDIRECT3DDEVICE9	g_pd3dDevice;
extern float				g_aspect;
extern Model				g_models[];
//関数プロトタイプ宣言
HRESULT InitD3DWindow(LPCTSTR wintitle, int w,int h);
int LoadModel(LPCTSTR filename);
void RenderModel(int idx);
--------------------------------------------my3Dlib.cpp--------------------------------------------
#include "my3dlib.h"
LPDIRECT3D9		    g_pD3D = NULL;
LPDIRECT3DDEVICE9	g_pd3dDevice = NULL;
float				g_aspect = 1.0f;
const int			MAXMODEL = 64; //64のxファイルを配列
Model				g_models[MAXMODEL];
//リソースの解放
void CleanupD3D(){
	for(int i=0; i<MAXMODEL; i=i+1)
	{
		if(g_models[i].used==TRUE)
		{
			if(g_models[i].pmaterials!=NULL)
			{
				delete[] g_models[i].pmaterials;
			}
			if(g_models[i].ptextures!=NULL)
			{
				for(DWORD j=0; j<g_models[i].nummaterials; j=j+1)
				{
					g_models[i].ptextures[j]->Release();
				}
				delete[] g_models[i].ptextures;
			}
			if(g_models[i].pmesh!=NULL)
			{
				g_models[i].pmesh->Release();
			}
		}
	}
	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:
		CleanupD3D();
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWnd,msg,wParam,lParam);
}
HRESULT InitD3DWindow(LPCTSTR wintitle,int w,int h)
{
	ZeroMemory(&g_models,sizeof(Model)*MAXMODEL);
	//ウィンドウクラス作成
	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デバイスの作成
	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;
}
//Xファイルを読み込む関数
int LoadModel(LPCTSTR filename)
{
	int idx;
	for(idx=0; idx<MAXMODEL; idx=idx+1)
	{
		if(g_models[idx].used==FALSE) break;
	}
	if(idx>=MAXMODEL) return -1;
	LPD3DXBUFFER pD3DXMtrlBuffer;
	if(FAILED(D3DXLoadMeshFromX(filename,D3DXMESH_SYSTEMMEM,g_pd3dDevice,NULL,&pD3DXMtrlBuffer,NULL,&g_models[idx].nummaterials,&g_models[idx].pmesh)))
	{
		MessageBox(NULL,_T("Xファイルが見つかりません"),_T("3D lib"),MB_OK);
		return -1;
	}
	//マテリアルとテクスチャ記録用配列確保
	D3DXMATERIAL* d3dxMaterials=
		(D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
	int num=g_models[idx].nummaterials;
	if(g_models[idx].pmaterials==NULL) return -1;
	g_models[idx].ptextures=new LPDIRECT3DTEXTURE9[num];
	if(g_models[idx].ptextures==NULL) return -1;
	for(int i=0; i<num; i=i+1)
	{
		//マテリアルのコピー
		g_models[idx].pmaterials[i]=d3dxMaterials[i].MatD3D;
		//アンビエント色の設定
		g_models[idx].pmaterials[i].Ambient=
			g_models[idx].pmaterials[i].Diffuse;
		//テクスチャの読み込み
		g_models[idx].ptextures[i] = NULL;
		if(d3dxMaterials[i].pTextureFilename !=NULL&&
			lstrlenA(d3dxMaterials[i].pTextureFilename)>0)
		{
			if(FAILED(D3DXCreateTextureFromFileA(g_pd3dDevice,d3dxMaterials[i].pTextureFilename,&g_models[idx].ptextures[i])))
			{
				MessageBox(NULL,_T("テクスチャが見つかりません"),_T("3D Lib"),MB_OK);
				return -1;
			}
		}
	}
	pD3DXMtrlBuffer->Release();
	g_models[idx].used=TRUE;
	return idx;
}
void RenderModel(int idx)
{
	if(g_models[idx].used==FALSE) return;
	for(DWORD i=0; i<g_models[idx].nummaterials; i=i+1)
	{
		g_pd3dDevice->SetMaterial(&g_models[idx].pmaterials[i]);
		g_pd3dDevice->SetTexture(0,g_models[idx].ptextures[i]);
		g_models[idx].pmesh->DrawSubset(i);
	}
}
------------------------------------------main.cpp---------------------------------------------------
#include "my3dlib.h"
int modelindex;
void Render()
{
	g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);
	if(SUCCEEDED(g_pd3dDevice->BeginScene()))
	{
		RenderModel(modelindex);
		g_pd3dDevice->EndScene();
	}
	g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
//WinMain関数
INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
	if(SUCCEEDED(InitD3DWindow(_T("My3DLibTest"),640,480)))
	{
		modelindex= LoadModel(_T("catsenkan.x"));
		if(modelindex==-1) return 0;
		
		//メッセージループ
		MSG msg = {0};
		while(msg.message!=WM_QUIT)
		{
			if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else
			{
				Render();
			}
		}
	}
	
	UnregisterClass(_T("D3D Window Class"),GetModuleHandle(NULL));
	return 0;
}
 |