ゲームの画面が更新されない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ナパン少将
記事: 2
登録日時: 3ヶ月前

ゲームの画面が更新されない

#1

投稿記事 by ナパン少将 » 3ヶ月前

今私はDirectX9でゲームを作っているのですが3dモデルを表示すると残像のように移動した後が残ってしまうのです。
画面のクリアがうまくいっていないと思うのですが理由がわかりませんだれかヒントをお願いしたいです。

コード: 全て選択

//必要なヘッダーファイルのインクルード
#include <windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#include <crtdbg.h>
#include <strsafe.h>
//必要なライブラリファイルのロード
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
// シンボル定義及びマクロ
#define WINDOW_WIDTH 1080
#define WINDOW_HEIGHT 720
#define SPRITE_WIDTH 1280
#define SPRITE_HEIGHT 720
int (WINAPIV * __vsnprintf)(char *, size_t, const char*, va_list) = _vsnprintf;
int (WINAPIV * _sscanf)(const char*, const char*, ...) = sscanf;
int (WINAPIV * __snprintf)(char *, size_t, const char*, ...) = _snprintf;
int (WINAPIV * _sprintf)(char*, const char*, ...) = sprintf;
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
//グローバルなインスタンスを宣言
LPDIRECT3D9 pD3d;
LPDIRECT3DDEVICE9 pDevice; 
LPDIRECT3DTEXTURE9 pTexture;
LPDIRECT3DTEXTURE9 pTexture2;
LPDIRECT3DTEXTURE9 pTexture3;
LPD3DXMESH pMesh = NULL;
D3DMATERIAL9* pMeshMaterials = NULL;
LPDIRECT3DTEXTURE9* pMeshTextures = NULL;
DWORD dwNumMaterials = 0;

LPD3DXSPRITE pSprite;
D3DXMATRIXA16			gIdentityMatrix = {};
//関数プロトタイプの宣言
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HRESULT InitD3d(HWND);
VOID DrawSprite();
VOID FreeDx();
void GameMainRender();
void render();
int menu=1;
enum 
{
	GAMEMAIN,
	GAMETITLE,
	GAMEOVER,
};
float X = 0;
int GAME_MODE = GAMETITLE;
//
//INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow)
//アプリケーションのエントリー関数
INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow)
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
	HWND hWnd=NULL;
	MSG msg;
	// ウィンドウの初期化
	static char szAppName[] = "016 スプライトをレンダリング ID3DXSprite";     
     WNDCLASSEX  wndclass;

     wndclass.cbSize           = sizeof (wndclass);
     wndclass.style              = CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc    = WndProc;
     wndclass.cbClsExtra      = 0;
     wndclass.cbWndExtra     = 0;
     wndclass.hInstance        = hInst;
     wndclass.hIcon             = LoadIcon (NULL,  IDI_APPLICATION);
     wndclass.hCursor          = LoadCursor (NULL, IDC_ARROW);
     wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
     wndclass.lpszMenuName = NULL;
     wndclass.lpszClassName = szAppName;
     wndclass.hIconSm         = LoadIcon (NULL,IDI_ASTERISK);

     RegisterClassEx (&wndclass);

     hWnd = CreateWindow (szAppName,szAppName,WS_OVERLAPPEDWINDOW,   
                    0,0,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInst,NULL);  
    ShowWindow (hWnd,SW_SHOW);
    UpdateWindow (hWnd);
	// ダイレクト3Dの初期化関数を呼ぶ
	if(FAILED(InitD3d(hWnd)))
	{
		return 0;
	}
	// メッセージループ
    ZeroMemory( &msg, sizeof(msg) );
    while( msg.message!=WM_QUIT )
     {
		if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
         {
			TranslateMessage( &msg );
             DispatchMessage( &msg );
         }    
		else
		{
			render();
		}
	}
	//アプリケーションを終了する時には、Direct3Dオブジェクトをリリースする
	FreeDx();
     return (INT)msg.wParam;
}
void BufferClear(D3DCOLOR color) {
	pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, color, 1, 0);
}
void render()
{
	//画面クリア
	pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
		D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
	if (SUCCEEDED(pDevice->BeginScene()))
	{
	switch (GAME_MODE)
	{
	case GAMETITLE:

		DrawSprite();
		break;
	case GAMEMAIN:

		GameMainRender();
		break;
	case GAMEOVER:
		break;
	}
	pDevice->EndScene();
	}
	pDevice->Present(NULL, NULL, NULL, NULL);
}

void GameMainRender()
{

	//BufferClear(0xffffffff);
	int i, k;
	if (GetKeyState('W') & 0x80)
	{
		X += 0.1f;
	}
	if (GetKeyState('S') & 0x80)
	{
		X -= 0.1f;
	}
	if (GetKeyState(' ') & 0x80)
	{
		GAME_MODE=GAMETITLE;
	}
	// ビュートランスフォームは全体に1回でいい
	D3DXVECTOR3 vEyePt(0.0f, 5.0f + X, -17.0f); //カメラ(視点)位置
	D3DXVECTOR3 vLookatPt(0.0f, 0.0f + X, 0.0f);//注視位置
	D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);//上方位置
	D3DXMATRIXA16 mView;
	D3DXMatrixLookAtLH(&mView, &vEyePt, &vLookatPt, &vUpVec);
	pDevice->SetTransform(D3DTS_VIEW, &mView);

	// プロジェクショントランスフォームも全体に1回でいい
	D3DXMATRIXA16 mProj;
	D3DXMatrixPerspectiveFovLH(&mProj, D3DX_PI / 4, (FLOAT)WINDOW_WIDTH / (FLOAT)WINDOW_HEIGHT, 0.1f, 100.0f);
	pDevice->SetTransform(D3DTS_PROJECTION, &mProj);

	

	
		//スケーリングするときは、これをやらないと暗くなったり明るくなったりする
		pDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true);

		//ワールドトランスフォームは”個々の物体ごとに”必要
		D3DXMATRIX mWorld;//最終的なワールド行列
		D3DXMATRIX mScale;//スケーリング行列
		D3DXMATRIX mRotation;//回転行列
		D3DXMATRIX mTranslation;//平行移動行列

								//行列を初期化
		D3DXMatrixIdentity(&mWorld);
		D3DXMatrixIdentity(&mScale);
		D3DXMatrixIdentity(&mRotation);
		D3DXMatrixIdentity(&mTranslation);

		//物体1用のワールドトランスフォーム

		D3DXMatrixScaling(&mScale, 0.1, 0.1, 0.1);
		mWorld = mScale * mRotation * mTranslation;//ワールド行列=スケーリング×回転×移動
		pDevice->SetTransform(D3DTS_WORLD, &mWorld);
		//物体1のレンダリング	
		for (DWORD i = 0; i<dwNumMaterials; i++)
		{
			pDevice->SetMaterial(&pMeshMaterials[i]);
			pDevice->SetTexture(0, pMeshTextures[i]);
			pMesh->DrawSubset(i);
		}

}
//
//LRESULT CALLBACK WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
// ウィンドウプロシージャー関数
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
	
	switch(iMsg)
	{
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		case WM_KEYDOWN:
		switch((CHAR)wParam)
		{
			case VK_ESCAPE:
				PostQuitMessage(0);
				break;
			case VK_DOWN:
			case VK_UP:
				menu *= -1;
				break;
		}
		break;
		
	}
	return DefWindowProc (hWnd, iMsg, wParam, lParam);	
}
//
//HRESULT InitD3d(HWND hWnd)
//ダイレクト3Dの初期化後にスプライトとそれに伴うテクスチャの初期化
HRESULT InitD3d(HWND hWnd)
{
	// 「Direct3D」オブジェクトの作成
	if( NULL == ( pD3d = Direct3DCreate9( D3D_SDK_VERSION ) ) )
	{
		MessageBox(0,"Direct3Dの作成に失敗しました","",MB_OK);
        return E_FAIL;
	}
	// 「DIRECT3Dデバイス」オブジェクトの作成
	D3DPRESENT_PARAMETERS d3dpp; 
	ZeroMemory( &d3dpp, sizeof(d3dpp) );
   
	d3dpp.BackBufferFormat =D3DFMT_UNKNOWN;
	d3dpp.BackBufferCount=1;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;	
	d3dpp.Windowed = true;
	
	if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                      &d3dpp, &pDevice ) ) )
    {
		if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &pDevice ) ) )
		{	
			MessageBox(0,"HALモードでDIRECT3Dデバイスを作成できません\nREFモードで再試行します",NULL,MB_OK);
			if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
                                      D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                      &d3dpp, &pDevice ) ) )
			{				
				if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &pDevice ) ) )
				{
					MessageBox(0,"DIRECT3Dデバイスの作成に失敗しました",NULL,MB_OK);			
					return E_FAIL;
				}
			}
		}
	} 
	//「テクスチャオブジェクト」の作成
	if(FAILED(D3DXCreateTextureFromFileEx(pDevice,"title_logo.png",SPRITE_WIDTH,SPRITE_HEIGHT,0,0,	D3DFMT_UNKNOWN,
											D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_DEFAULT,
								           0xff000000,NULL,NULL,&pTexture)))
	{
		MessageBox(0,"テクスチャの作成に失敗しました","",MB_OK);
		return E_FAIL;
	}
	//「テクスチャオブジェクト」の作成
	if (FAILED(D3DXCreateTextureFromFileEx(pDevice, "START.png", NULL, NULL, 0, 0, D3DFMT_UNKNOWN,
		D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT,
		0xff000000, NULL, NULL, &pTexture2)))
	{
		MessageBox(0, "テクスチャの作成に失敗しました", "", MB_OK);
		return E_FAIL;
	}
	if (FAILED(D3DXCreateTextureFromFileEx(pDevice, "EXIT.png", NULL, NULL, 0, 0, D3DFMT_UNKNOWN,
		D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT,
		0xff000000, NULL, NULL, &pTexture3)))
	{
		MessageBox(0, "テクスチャの作成に失敗しました", "", MB_OK);
		return E_FAIL;
	}
	// 「スプライトオブジェクト」の作成
	if(FAILED(D3DXCreateSprite(pDevice,&pSprite)))
	{
		MessageBox(0,"スプライトの作成に失敗しました","",MB_OK);
		return E_FAIL;
	}
	// Xファイルからメッシュをロードする	
	LPD3DXBUFFER pD3DXMtrlBuffer = NULL;

	if (FAILED(D3DXLoadMeshFromX("syujinko_sotai/player.x", D3DXMESH_SYSTEMMEM,
		pDevice, NULL, &pD3DXMtrlBuffer, NULL,
		&dwNumMaterials, &pMesh)))
	{
		MessageBox(NULL, "Xファイルの読み込みに失敗しました", NULL, MB_OK);
		return E_FAIL;
	}
	D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
	pMeshMaterials = new D3DMATERIAL9[dwNumMaterials];
	pMeshTextures = new LPDIRECT3DTEXTURE9[dwNumMaterials];

	for (DWORD i = 0; i<dwNumMaterials; i++)
	{
		pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
		pMeshMaterials[i].Ambient = pMeshMaterials[i].Diffuse;
		pMeshTextures[i] = NULL;
		if (d3dxMaterials[i].pTextureFilename != NULL &&
			lstrlen(d3dxMaterials[i].pTextureFilename) > 0)
		{
			if (FAILED(D3DXCreateTextureFromFile(pDevice, d3dxMaterials[i].pTextureFilename, &pMeshTextures[i])))
			{
				MessageBox(NULL, "テクスチャの読み込みに失敗しました", NULL, MB_OK);
			}
		}
	}
	pD3DXMtrlBuffer->Release();
	//カリングする
	pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
	//グーローシェーディング
	pDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
	//ソリッド(通常のポリゴンモード)
	pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
	// Zバッファー処理を有効にする
	pDevice->SetRenderState(D3DRS_ZENABLE, true);
	// ライトを有効にする
	pDevice->SetRenderState(D3DRS_LIGHTING, true);
	// アンビエントライト(環境光)を設定する
	pDevice->SetRenderState(D3DRS_AMBIENT, 0x00ffffff);
	// スペキュラ(鏡面反射)を有効にする
	pDevice->SetRenderState(D3DRS_SPECULARENABLE, true);
	
	D3DXMatrixIdentity(&gIdentityMatrix);
	return S_OK;
}

//
//VOID DrawSprite()
//スプライトをレンダリングする
VOID DrawSprite()
{
	

	
	int X=0;
	
		if (GetKeyState('W') & 0x80)
		{
			switch (menu)
			{
			case 1:
				GAME_MODE = GAMEMAIN;
				break;
			case -1:
				PostQuitMessage(0);
				break;
			}
		}
		RECT rect={0,0,1280,720};
		RECT rect2 = { 0,0,560,120 };
		D3DXVECTOR3 v3Center(SPRITE_WIDTH/2,SPRITE_HEIGHT/2,0);
		D3DXVECTOR3 v3Center2(NULL, NULL, 0);
		D3DXVECTOR3 v3Position(WINDOW_WIDTH/2,360,0);
		switch (menu)
		{
		case 1:
			X = -10;
			break;
		case -1:
			X = 10;
			break;
		}
		D3DXVECTOR3 v3Position2(WINDOW_WIDTH / 2+X, 360, 0);
		D3DXVECTOR3 v3Position3(WINDOW_WIDTH / 2 -180- X, 470, 0);
		pSprite->SetTransform(&gIdentityMatrix);
		pSprite->Begin(D3DXSPRITE_ALPHABLEND );
		pSprite->Draw(pTexture,&rect,&v3Center,&v3Position,D3DCOLOR_ARGB(255,255,255,255));
		
		pSprite->Draw(pTexture2, &rect2, &v3Center2, &v3Position2, D3DCOLOR_ARGB(255, 255, 255, 255));
		
		pSprite->Draw(pTexture3, &rect2, &v3Center2, &v3Position3, D3DCOLOR_ARGB(255, 255, 255, 255));
		pSprite->End();
		
		
	
	
}
//
//VOID FreeDx()
// 作成したDirectXオブジェクトの開放
VOID FreeDx()
{	
	
	for (DWORD k = 0;k<dwNumMaterials;k++)
	{
		SAFE_RELEASE(pMeshTextures[k]);
	}
	SAFE_RELEASE(pMesh);
	SAFE_RELEASE( pSprite );
	SAFE_RELEASE( pDevice );
	SAFE_RELEASE( pD3d );
}




ナパン少将
記事: 2
登録日時: 3ヶ月前

Re: ゲームの画面が更新されない

#2

投稿記事 by ナパン少将 » 3ヶ月前

追記
調べたところclear関数がやはり機能していませんでした

返信

“C言語何でも質問掲示板” へ戻る