DirectX9とwin32APIでゲーム作りをしています。
画像を表示して、自動で右にスクロールさせようと思ったのですが、
キーボードを押しているときやマウスをウィンドウ上で動かしているときしかスクロールしてくれません…
下がループの部分と描画の関数のプログラムです(http://ppp-lab.sakura.ne.jp/win32c/002.html←ほぼこのサイトのコピペ)。
書きながら思ったのですが、「メッセージループ」と言うだけあって、なんらかのメッセージを受け取った時だけループする仕組みなのでしょうか?
/////////////ループ/////////////
while( 1 )
{
BOOL ret = GetMessage( &msg, NULL, 0, 0 ); // メッセージを取得する
if( ret == 0 || ret == -1 )
{
// アプリケーションを終了させるメッセージが来ていたら、
// あるいは GetMessage() が失敗したら( -1 が返されたら )、ループを抜ける
break;
}
else
{
// メッセージを処理する
TranslateMessage( &msg );
DispatchMessage( &msg );
Render(); //これが描画の関数です。
ValidateRect(hWnd,NULL);
UpdateFrame(hWnd);
}
}
/////////////描画/////////////
VOID Render()
{
if( NULL == g_pd3dDevice )
return;
RECT rc;
D3DXVECTOR3 center , position;
// Clear the backbuffer to a blue color
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 0 ), 1.0f, 0 );
// Begin the scene
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// Rendering of scene objects can happen here
g_pSprite->Begin( NULL );
static int time = 0;
rc.left = 0;
rc.top = 0;
rc.right = 64;
rc.bottom = 64;
center.x = 0;
center.y = 0;
position.x = ++time; //自動で右に動かしたい
position.y = y;
g_pSprite->Draw( g_pTexture , &rc , ¢er , &position , 0xFFFFFFFF );
g_pSprite->End();
// End the scene
g_pd3dDevice->EndScene();
}
どうしたら良いのか、教えてください。
DirectXで、キーボードを押しているときしか画面が更新されない?ようなのですが
Re: DirectXで、キーボードを押しているときしか画面が更新されない?ようなのですが
掲示されたコードではそうなります。フイ さんが書きました:「メッセージループ」と言うだけあって、なんらかのメッセージを受け取った時だけループする仕組みなのでしょうか?
MSDNにはこうありますね。→MSDN参照(GetMessage)
GetMessage 関数とは異なり、PeekMessage 関数は、何かメッセージがポストされるのを待たずに制御を返します。
変な説明ですけど(笑)、要は何かメッセージがあるまで待つ関数なのです。
なのでとりあえずの手段としては、PeekMessageに変えてみてはどうでしょう?
GetMessageとPeekMessageの返す値は意味が違うので注意。
それかSetTimerでタイマーのメッセージを流させる案もありますが・・・
どっちにするかはあなた次第です。
written by へにっくす
Re: DirectXで、キーボードを押しているときしか画面が更新されない?ようなのですが
へにっくすさん、返信ありがとうございます。PeekMessageの使い方を調べて、メッセージループを下のように書き換えたら上手く動作しました。
ありがとうございました。
while( 1 )
{
if(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )) // メッセージを取得する
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render();
ValidateRect(hWnd,NULL);
}
}
ありがとうございました。
while( 1 )
{
if(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )) // メッセージを取得する
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render();
ValidateRect(hWnd,NULL);
}
}