DirectXで、キーボードを押しているときしか画面が更新されない?ようなのですが

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

DirectXで、キーボードを押しているときしか画面が更新されない?ようなのですが

#1

投稿記事 by フイ » 5年前

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 , &center , &position , 0xFFFFFFFF );

g_pSprite->End();

// End the scene
g_pd3dDevice->EndScene();
}

どうしたら良いのか、教えてください。

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

Re: DirectXで、キーボードを押しているときしか画面が更新されない?ようなのですが

#2

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

フイ さんが書きました:「メッセージループ」と言うだけあって、なんらかのメッセージを受け取った時だけループする仕組みなのでしょうか?
掲示されたコードではそうなります。
MSDNにはこうありますね。→MSDN参照(GetMessage)
GetMessage 関数とは異なり、PeekMessage 関数は、何かメッセージがポストされるのを待たずに制御を返します。

変な説明ですけど(笑)、要は何かメッセージがあるまで待つ関数なのです。

なのでとりあえずの手段としては、PeekMessageに変えてみてはどうでしょう?
GetMessageとPeekMessageの返す値は意味が違うので注意。

それかSetTimerでタイマーのメッセージを流させる案もありますが・・・
どっちにするかはあなた次第です。
written by へにっくす

フイ
記事: 11
登録日時: 6年前

Re: DirectXで、キーボードを押しているときしか画面が更新されない?ようなのですが

#3

投稿記事 by フイ » 5年前

へにっくすさん、返信ありがとうございます。PeekMessageの使い方を調べて、メッセージループを下のように書き換えたら上手く動作しました。
ありがとうございました。

while( 1 )
{
if(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )) // メッセージを取得する
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render();
ValidateRect(hWnd,NULL);

}

}

閉鎖

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