- 締切済み
DirectX キーが入力されるまで一時停止
下記の処理で0ボタンを押すとループ処理を抜ける処理をしたいのです。 その際、キーが押されて無い場合キー入力取得の所で停止させ、押された瞬間動き始めるプログラムを組みたいのですが、出来るのでしょうか? const BYTE *keys; for( int i = 0; i == 0; i ) { // キー入力の取得 keys = iGetKey(); // 0キーはキャンセル if( keys['0'] & 0x80 ) { break; } } 開発環境 VisualStudio2008 C++ SP1 Platform SDK(多分最新) DirectX SDK(多分最新)
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- mindassass
- ベストアンサー率23% (318/1337)
初心者です。 私の環境(ターボC++)では char str=0; while(1) { str=getch(); if(str==48)break; }
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 キー入力待ちのスレッドを作成して、0が押されたらスレッドから抜け出せば良いのではないでしょうか。 更に前後を見ないと名言は出来ないのですが、スレッドを使用した時、場合によってはクリティカルセクション等による排他処理が必要になります。 とても取り扱いの面倒な物ですので、クラスに丸め込んだ方が楽です。 アラもあるとは思いますが、以下参考程度に(テストはしていません)。 //クリティカルセクションを丸め込む struct CCS { CCS(){ ::CreateCriticalSection(&m_cs); } ~CCS(){ ::DeleteCriticalSection(&m_cs); } LPCRITICAL_SECTION Get(){ return &m_cs; } const LPCRITICAL_SECTION Get() const { return &m_cs; } private: CCS(const CCS&); CCS& operator = (const CCS&); CRITICAL_SECTION m_cs; }; //排他ロックをかける動作を丸め込む struct CLock { explicit CLock(CCS* pccs) : m_pccs(pccs) { ::EnterCriticalSection(m_pccs->Get());} ~CLock() { ::LeaveCriticalSection(m_pccs->Get()); } private: CCS* m_pccs; }; //必要であれば前もってクリティカルセクションを作成しておく CCS g_ccs; //キー入力待ちスレッド DWORD WINAPI ThreadKeyWait(LPVOID p) { CCS* pccs = static_cast<CCS*>(p); while(1) { //必要であれば排他ロックのオブジェクトを作成する CLock lockObject(pccs); // キー入力の取得 const BYTE *keys = iGetKey(); // 0キーはキャンセル if( keys['0'] & 0x80 ) { break; } } } 止めたい場所で、 DWORD dwThreadId; //スレッドを作成する HANDLE hThread = ::CreateThread(NULL, 0, &::ThreadKeyWait, &g_ccs, 0, &dwThreadId); //ココで停止する。0キーが押されると、下に落ちる筈 ::WaitForSingleObject(hThread, INFINITE); //スレッドを消す ::CloseHandle(hThread); と、言った具合でしょうか・・・。