トップページ > 過去ログ > 記事閲覧
画面クリック時のレスポンスをよくしたい
名前:twintania 日時: 2010/05/15 03:37

はじめまして失礼します。 DxLibを使ってプログラムをしています。 0.05秒ほどで1ループするwhile文の中でGetMouseInput()を使用して左クリックを取得し、それによって画面の描画を変えるプログラムです。 しかし、クリックをたまたまこのループの途中に行ってしまったということなのか、クリックしても反応がないことがあるのです。 何かうまい方法はないでしょうか。

Page: 1 |

Re: 画面クリック時のレスポンスをよくしたい ( No.1 )
名前:いっち 日時:2010/05/15 12:01

デバイスの入力周りは環境によって挙動が違う場合があるので、開発環境を明記したほうが良いと思います。 とりあえず、マルチスレッド化をしてみました。 twintaniaさんのお望みの動作となるかわかりませんがお試し下さい。 ※参考 > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1693 //-- 以下、テストソース --// bool mouse_update; bool quit_thread; unsigned int WINAPI MouseInputThread( void *p ) { int now_state = false, old_state = false; while( quit_thread == false ) { now_state = GetMouseInput( ); if ( now_state != old_state ) { mouse_update = true; old_state = now_state; } } _endthreadex( 0 ); return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); //SetMultiThreadFlag(TRUE); // 入力イベントぐらいなら必要ないかも if ( DxLib_Init( ) == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); int ScrColor = 0; unsigned int id; HANDLE handle = (HANDLE)_beginthreadex( NULL, 0, &MouseInputThread, 0, 0, &id ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { if ( mouse_update ) { ScrColor = GetColor( GetRand( 255 ), GetRand( 255 ), GetRand( 255 ) ); mouse_update = false; } WaitTimer( 200 ); ClearDrawScreen( ); DrawBox( 0, 0, 640, 480, ScrColor, TRUE ); ScreenFlip( ); } quit_thread = true; WaitForSingleObject( handle, INFINITE ); DxLib_End( ); return 0; }
Re: 画面クリック時のレスポンスをよくしたい ( No.2 )
名前:管理人 日時:2010/05/16 20:48

いっちさんの方法でも大丈夫だと思いますが、一応 twintaniaさんの問題解決にピッタリな機能が DXライブラリの内部関数にありましたので、この機会に外部からアクセスできる関数に変更しました よろしければこちらのバージョンをダウンロードしてください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) 今回外部から使えるようにした関数は以下の関数です // マウスのクリック情報を取得する( 戻り値 -1:ログが無かった ) int GetMouseInputLog( int *Button, int *ClickX, int *ClickY, int LogDelete ) ; DXライブラリはマウスがクリックされたときのクリックされたボタンと座標を内部に 記憶していまして、この関数は記憶されたクリック情報を古い順から取得するための関数です 一回得た記憶を削除するかどうかは LogDelete で指定します( TRUEで削除、FALSEで削除しない ) 削除しなかった場合は次の関数呼び出しで全く同じ内容を返してきます あと、注釈にも書いてありますが、クリックされた記録が無い場合は -1 が返ってきます 使い方の例: int Button, ClickX, ClickY ; if( GetMouseInputLog( &Button, &ClickX, &ClickY, TRUE ) == -1 ) { // クリックされてない! } else { // 更に左クリックされたかどうかを調べる if( Button & MOUSE_INPUT_LEFT ) { // 左クリックされたときの座標を画面に描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "ClickX:%d ClickY:%d", ClickX, ClickY ) ; } } もし不明な点がありましたらご質問ください m(_ _)m

Page: 1 |