update()を通らない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
donabe
記事: 7
登録日時: 9年前

update()を通らない

#1

投稿記事 by donabe » 9年前

 DirectXでプログラムを組んでいるのですがエラーが出ないのに画面が真っ暗でなにも表示されないので原因を探ったらどうやらupdate()を通ってないみたいなのですがどうしてなのか分かりません。

以下コードです。

コード:

 /********************************************************************/
/*						インクルードファイル						*/
/********************************************************************/
#include"main.h"
#include"polygon.h"
#include"input.h"
#include"game.h"
#include"title.h"
#include"bg.h"
#include"result.h"
/********************************************************************/
/*							グローバル変数							*/
/********************************************************************/
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDEVICE = NULL;
LPD3DXFONT g_pD3DFont = NULL; 
int g_nCountFPS = 0;
MODE g_mode = MODE_TITLE;


/********************************************************************/
/*								メイン関数							*/
/********************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE nPrevInstance,LPSTR lpcmdLine,int nCmdShow)
{
	DWORD dwExecLastTime;
	DWORD dwFPSLastTime;
	DWORD dwCurrentTime;
	DWORD dwFrameCount;

	// 分解能を設定
	timeBeginPeriod(1);

	dwExecLastTime =
	dwFPSLastTime = timeGetTime();
	dwCurrentTime =
	dwFrameCount = 0;

	WNDCLASSEX wcex =
	{
		sizeof(WNDCLASSEX),
		CS_CLASSDC,							//ウィンドウスタイルを設定
		WndProc,							//ウィンドウプロシージャのアドレス(関数名)を設定
		0,
		0,
		hInstance,							//メイン関数の引数のインスタンスハンドル
		NULL,								//使用するアイコンを指定
		LoadCursor(NULL,IDC_ARROW),			//マウスカーソルの指定
		(HBRUSH)(COLOR_WINDOW+1),			//ウィンドウの背景色の設定(クライアント領域)
		NULL,								//メニューを設定
		"application",						//ウィンドウクラスの名前
		NULL								//使用するスモールアイコンの指定
	};
	HWND hWnd;								//ウィンドウのハンドル
	MSG msg;								//メッセージ

	//ウィンドウクラスの登録
	RegisterClassEx(&wcex);

	//ウィンドウの生成

	hWnd = CreateWindowEx(0,
						"application",	//ウィンドウクラスの名前
						"DirectX",	//ウィンドウの名前(キャプションに表示)
						WS_OVERLAPPEDWINDOW,	//ウィンドウのスタイル
						1,	//ウィンドウの左上座標(X座標)
						1,	//ウィンドウの左上座標(Y座標)
						1280,	//ウィンドウの幅
						576,	//ウィンドウの高さ
						NULL,			//親ウィンドウのハンドル
						NULL,			//メニューハンドルまたは子ウィンドウのID
						hInstance,		//インスタンスハンドル
						NULL);

	//初期化処理
	if(FAILED(Init(hInstance,hWnd,TRUE)))
	{
		return -1;
	}

	InitKeyboard(hInstance, hWnd);

	//ウィンドウの表示
	ShowWindow(hWnd,nCmdShow);				//ウィンドウの表示状態の設定
	UpdateWindow(hWnd);						//ウィンドウの更新


	//メッセージループ

	while(1)
	{
		if(PeekMessage(&msg,NULL,0,0,PM_REMOVE) != 0)
		{
			if(msg.message == WM_QUIT)
			{
				break;
			}
			else
			{
				//メッセージの翻訳と送出
				TranslateMessage(&msg);				//翻訳
				DispatchMessage(&msg);				//送出
			}
		}
		else
		{
			dwCurrentTime = timeGetTime();
			if((dwCurrentTime - dwFPSLastTime) >= 500)	// 0.5秒ごとに実行
			{
				g_nCountFPS = dwFrameCount * 1000 / (dwCurrentTime - dwFPSLastTime);
				dwFPSLastTime = dwCurrentTime;
				dwFrameCount = 0;
			}
			if((dwCurrentTime - dwExecLastTime) >= (1000 / 60))
			{
				dwExecLastTime = dwCurrentTime;
				//更新処理
				Update();
				//描画処理
				Draw();

			dwFrameCount++;
			}
		}
	}

	timeEndPeriod(1);

	//ウィンドウクラスの登録解除
	UnregisterClass("application",wcex.hInstance);
	
	//終了処理
	Uninit();
	return 0;
}

/********************************************************************/
/*		ウィンドウプロシージャ					*/
/********************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd,					//ウィンドウのハンドル
						UINT uMsg,					//メッセージ
						WPARAM wParam,				//パラメータ
						LPARAM lParam)				//パラメータ

{
	int EndCmd;


	switch(uMsg)
	{
	

	case WM_DESTROY:
			PostQuitMessage(0);						//WM_QUITメッセージを返す
			break;
	case WM_KEYDOWN:
		switch(wParam)
		{
		case VK_ESCAPE:

			EndCmd = MessageBox(NULL,"アプリケーションを終了させますか?","終了しますか?",MB_YESNO);		//終了確認

			if(EndCmd == IDYES)							//はいが押された場合
			{

				DestroyWindow(hWnd);					//ウィンドウを破棄する
				break;
			}
		}

		break;
	}

	return DefWindowProc(hWnd,uMsg,wParam, lParam);

}

	//初期化処理
HRESULT Init(HINSTANCE hInstance,HWND hWnd,BOOL bWindow)
{

	D3DDISPLAYMODE d3ddm;
	D3DPRESENT_PARAMETERS d3dpp;


	//Direct3Dオブジェクトの生成
	g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
	if(g_pD3D == NULL)
	{
		return E_FAIL;
	}

	if(FAILED(g_pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
	{
		return E_FAIL;
	}

	ZeroMemory(&d3dpp,sizeof(d3dpp));
	d3dpp.BackBufferWidth = SCREEN_WIDTH;		//画面の幅
	d3dpp.BackBufferHeight = SCREEN_HEIGHT;		//画面の高さ
	d3dpp.BackBufferFormat = d3ddm.Format;		//カラーモードの指定
	d3dpp.BackBufferCount = 1;					//バックバッファの数
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.Windowed = bWindow;					//ウィンドウモード/フルスクリーンモード
	d3dpp.EnableAutoDepthStencil = TRUE;		//デプスバッファ、ステンシルバッファ
	d3dpp.AutoDepthStencilFormat = D3DFMT_D16;	//デプスバッファとして16bit使用
	if(bWindow == TRUE)
	{
		d3dpp.FullScreen_RefreshRateInHz = 0;
		d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
	}
	else
	{
		d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
		d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

	}

	// デバイスオブジェクトの生成
	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)))
		{
			if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDEVICE)))
			{
				return E_FAIL;
			}
		}
	}

	//レンダーステートの設定
	g_pD3DDEVICE -> SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
	g_pD3DDEVICE -> SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
	g_pD3DDEVICE -> SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
	g_pD3DDEVICE -> SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
	
	// サンプラーステートパラメータの設定
	g_pD3DDEVICE->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);	// テクスチャアドレッシング方法(U値)を設定
	g_pD3DDEVICE->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);	// テクスチャアドレッシング方法(V値)を設定
	g_pD3DDEVICE->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);	// テクスチャ縮小フィルタモードを設定
	g_pD3DDEVICE->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);	// テクスチャ拡大フィルタモードを設定

	//テクスチャステージの設定
	g_pD3DDEVICE->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);	// アルファブレンディング処理
	g_pD3DDEVICE->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);	// 最初のアルファ引数
	g_pD3DDEVICE->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);	// 2番目のアルファ引数
	Initpolygon();
	return S_OK;

	

}
//デバイスの取得
LPDIRECT3DDEVICE9 GetDevice(void)
{
	return g_pD3DDEVICE;
}

//更新処理
void Update(void)
{
	UpdateKeyboard();
	g_mode = GetMode();
	switch(g_mode)
	{
	case MODE_TITLE:
		Updatetitle();
		Drawtitle();
		break;
	case MODE_GAME:
		Updategame();
		break;
	case MODE_RESULT:
		Updateresult();
		Drawresult();
		break;
	}
}
//描画処理
void Draw(void)
{
	g_pD3DDEVICE -> Clear(0,NULL,(D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER),D3DCOLOR_RGBA(0,0,0,255),1.0f,0);
	if(SUCCEEDED(g_pD3DDEVICE -> BeginScene()))		//描画の開始
	{
		
		g_pD3DDEVICE -> EndScene();
	}

	g_pD3DDEVICE -> Present(NULL,NULL,NULL,NULL);
}
//終了処理
void Uninit(void)
{
	if(g_pD3DDEVICE != NULL)
	{
		g_pD3DDEVICE -> Release();
		g_pD3DDEVICE = NULL;
	}
	if(g_pD3D != NULL)
	{
		g_pD3D -> Release();
		g_pD3D = NULL;
	}
}
//モードの状態
void SetMode(MODE mode)
{
	g_mode = mode;
	switch(g_mode)
	{
	case MODE_TITLE:
		Uninitresult();
		Inittitle();
		break;
	case MODE_GAME:
		Uninittitle();
		Initgame();
		break;
	case MODE_RESULT:
		Uninitgame();
		Initresult();
	}
}

MODE GetMode(void){
	return g_mode;
}

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: update()を通らない

#2

投稿記事 by へにっくす » 9年前

掲示したソースだけでは不明です。
だってInittitle、Uninittitle、Initgame、Uninitgame、Initresult、Uninitresult関数の内容が掲示されていませんから。
開発環境は何を使っていますか。
Visual Studioを使用しているなら、デバッグしてください。
プログラミングするなら、デバッグ手法はマスターすべきものです。
(デバッグしてUpdateに入っていないことを確認したのなら、そう書いてくださいね?)
オフトピック
プロジェクトのソースを全部zipに固めてこの掲示板に添付すれば、全体を見てもらえると思います。
ユーザーさんなんだからできるはず
written by へにっくす

donabe
記事: 7
登録日時: 9年前

Re: update()を通らない

#3

投稿記事 by donabe » 9年前

>へにっくすさん
 説明不足ですみません・・・デバッグしてupdateを通らないことを確認済みです。
自分でも原因は探ってるのですがなかなか解決しなくて・・・お手数ですがよろしくお願いします
ソースを添付しようと思ったんですがファイル添付で参照をしてファイル追加で合ってるでしょうか?やったんですけどどこにも表示されないから間違えてるんですかね?
最後に編集したユーザー donabe on 2014年7月06日(日) 17:41 [ 編集 1 回目 ]

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: update()を通らない

#4

投稿記事 by へにっくす » 9年前

donabe さんが書きました:ソースも添付します。
ソースが添付されていませんが。
投稿時に、ファイル添付タグがあるはずですよ
written by へにっくす

donabe
記事: 7
登録日時: 9年前

Re: update()を通らない

#5

投稿記事 by donabe » 9年前

なぜかできないみたいなのでうpろだのURL貼っておきます。
お手数かけますがすみません・・・
http://www.dotup.org/uploda/www.dotup.o ... 9.zip.html

アバター
a5ua
記事: 199
登録日時: 13年前

Re: update()を通らない

#6

投稿記事 by a5ua » 9年前

IDirect3DDevice9::Clear()
IDirect3DDevice9::BeginScene()
IDirect3DDevice9::EndScene()
IDirect3DDevice9::Present()
の使い方に問題があると思われます。

描画処理はBeginScene()~EndScene()の間に実行する必要があります。

現状の処理では、BeginScene()~EndScene()の間に描画処理が一つもありません(Draw()関数)
したがって、Clear()した結果が画面に反映されていると考えられます。

試しに添付のソースコードで、Clear()とBeginScene()の呼び出しをUpdate()の前に移動したら、白い四角形が表示されました。

コード:

//描画処理
void Draw(void)
{
    g_pD3DDEVICE -> Clear(0,NULL,(D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER),D3DCOLOR_RGBA(0,0,0,255),1.0f,0);
    if(SUCCEEDED(g_pD3DDEVICE -> BeginScene()))     //描画の開始
    {
        /* ここに描画処理を書く必要がある */

        g_pD3DDEVICE -> EndScene();
    }
 
    g_pD3DDEVICE -> Present(NULL,NULL,NULL,NULL);
}

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: update()を通らない

#7

投稿記事 by へにっくす » 9年前

donabe さんが書きました:なぜかできないみたいなので
19.3MBもあるんじゃ当たり前。
zipファイルだと8MBまでのようですので。
ソースだけと言ったはずですよ。データや中間ファイルなどは外してください。
(a5uaさんがレスしてくれているので、私は添付できない理由をレスしました)
written by へにっくす

donabe
記事: 7
登録日時: 9年前

Re: update()を通らない

#8

投稿記事 by donabe » 9年前

< a5uaさん
ありがとうございました。解決しました。そこら辺は完全に間違ってないと思ってたのでよく見てなかったんですが指摘されてなるほどと思いました。以後気をつけたいと思います

< へにっくすさん
すみません・・・ソースだけだったんですね申し訳ないです。

閉鎖

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