• 締切済み

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(多分最新)

みんなの回答

  • mindassass
  • ベストアンサー率23% (318/1337)
回答No.2

初心者です。 私の環境(ターボC++)では char str=0; while(1) { str=getch(); if(str==48)break; }

回答No.1

 こんばんは。  キー入力待ちのスレッドを作成して、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);  と、言った具合でしょうか・・・。

関連するQ&A

  • DirectXのSDKについて3つの質問

    こんにちは VisualStudio2008でDirectXをはじめようと思っている者です。 SDKをダウンロードしようと探してみたものの バージョンが頻繁に新しくなっているので、 何も考えず最新のものをダウンロードしていいのか不安です。 調べまわってもわからなかったことを3つ質問します。 質問1 最新のものはMicrosoft DirectX SDK (Nov 2007) のようですが、リソースノートを見るとVisualStudio2008へのサポートは March 2008 SDKからと書いてあります。これは3月まで待たないとVS2008ではまだDirectXは使えないということでしょうか? 質問2 古いSDKを使っている場合、新しいバージョンに変えたいときは 既存のSDKは一度完全にアンインストールしてから新しいものを入れることになるのでしょうか? はたまたアップデートができるのでしょうか 質問3 最新のSDKではDirectX10と9のどちらのアプリケーションも作れるのですか? なんだかわからないことだらけです。 あほみたいな質問かもしれませんがどうか教えてくださいませ

  • C#: キー判定からどのようにしてもとの繰り返しへ?

    VisualStudio2005のC#を使用しております。 現在、 テキスト1行ずつ読み込み⇒行中に"★"があるとキー入力待ち ⇒Enter押す⇒{処理}⇒ 元の文章の続きを読み込み・・・ という処理を行いたいのですが、Enterをおしたらそこで止まってしまいます。どうやら、元のテキストの読み込みに戻らないようです。 private void Form1_KeyDown(object sender, KeyEventArgs e) //Enterが押されたとき、EnterKeyDownが1でキー入力待ち、2で押した、0でなにもなしです。 { if (EnterKeyDown == 1) { if (e.KeyData == Keys.Enter) { EnterKeyDown = 2; } } } すべてを載せると多いので、キー処理の部分のみですが、なにかよい方法はないでしょうか?

  • Platform SDKについて

    VS2005ProとDirectX SDK(April 2007)を使って、DirectShowを使ったプログラムを書きたいのですが、dshow.hがインクルードできません。DirectShowは2005年4月にDirectXからPlatformSDKへ移ったという情報を見たのですが、Platform SDKを最新のものにしなければいけないのでしょうか?また、インストールは普通にインストーラを使って行ってもよいのでしょうか?何か特別な設定を行わなければならないのでしょうか?ご教授願います。

  • Delphi6 ループ中にキー入力

    Delphi 6 です。 for next などのループの中で、stringgridのセルをEnterキーで選択させたい時、選択されるまで(キーが押されるまで)処理を進めたくない方法は、どうするんでしょうか? flg:=false; for i:=1 to 100 do begin ~諸々の処理で flg:=true; ~ if flg=true then x[i]:= stringgridの選択されたRow番号(はじめからフォーカスされている番号でなく) ~諸々の処理で flg:=false; ~ end;

  • 配列のキー取得

    現在の$str配列には、下記のようになっています。 Array ( [9] => test [5] => aaa [7] => bbb) print_r(array_keys($str)); とすると下記のように配列のキー値がわかりますが、 Array ( [0] => 9 [1] => 5 [2] => 7) キーを下記のように一つづつほかの配列に代入したい場合はどのようにしたらいいのでしょうか? for($i=0;$i<count($str);$i++){ $new_str[$i]=キーを取得する関数; } ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • p->next(ポインタ)的なことをC#で

    環境:VisualStudio2005 .Net C# FrameWork 2.0 プログラムを作成してみましたが、 どこが間違っているのかもわかりにくい上に 思うような結果が得られませんでした。 もっとスマートで美しい解法はないでしょうか。 お知恵をお貸しください。 --- No, Class, ChildNo, Status からなるクラス Info があり、 Info 型の配列 info には以下のデータが格納されているとします。 なお、PrimaryKey=No+Classで、配列 info は、No+Classの昇順に並んでいるとします。 class Info { byte no; byte class; byte childno; byte[] status= new byte[256]; public Info() { for (int i = 0; i < 256; i++) { this.status[i] = 0; } } } Info []info = new Info[8]; No,Class,ChildNo,Status 1, 1, 2, ___ 1, 2, 3, ___ 1, 3, 4, ___ 2, 1, 5, ___ 3, 1, 6, ___ 4, 1, 7, ___ 5, 1, 8, ___ 5, 2, 9, ___ まず、No=1,Class=1をキーとしてChildNo=2を取得し、 見つかったChildNoをNoとしNo=2,Class=1をキーとしてChildNo=5を取得、 次に、No=5,Class=1をキーとしてChildNo=8を取得、 次に、No=8,Class=1をキーとしてデータが見つからないので終了 最終的に、No=1,Class=1のStatusの[2][5][8]に1をセットしたいと思います(残りは0)。 同様に、No=2,Class=1からは5,8のデータを No=5,Class=1からは8のデータを取得したいです。 for (int i = 0; i < info[i].Length; i++) { Func(info[i].No, info[i].Class); } private byte Func(byte no, byte class) { byte cno = 0; byte tmpno = 0; byte ret = 0; for (int i = 0; i < info.Length; i++) { if (info[i].no == no && info[i].class == class) { cno = info[i].childno; tmpno = info[i].childno; info[i].status[childno] = 1; while ((ret = SetNearFlag(tmpno, class)) != 0) { info[i].status[ret] = 1; tmpno = ret; } info[i].status[tmpno] = 1; break; } } return cno; } よろしくお願いいたします。

  • Jump文について

    main(){ char a[80]; int i = 0; --------------------------------------------------- while(1){ printf("文字を入力してください>"); scanf("%s" , a); if(a == "end"){ i++; break; } i--; } ---------------------------------------------------- printf("%d" , i); return; } -----でかこった部分になりますが、 変数aにendが入力されると、ループをぬける処理を作ろうと思うのですが、 endを入力しても、ループからぬけることができません。 ループから抜けられない原因として考えられるのが、aの初期状態に何か問題が あるのではと思われます。 以上、宜しくお願い致します。

  • DirectX サンプル エラー

    こんにちは。DirectXプログラミング初心者です。 Visual C++ 2005 Express Editonで開発しております。 Platfrom SDKもインストール済みです。 DirectX 9.0 SDKの最新版のサンプルをコンパイルしようとすると、 fatal error C1083: include ファイルを開けません。'dimm.h': No such file or directory とエラーがでてコンパイル出来ません。 また、工学社の「DirectX9 DirectX Graphics」という本に付属しているDirectX 9.0 SDK(December 2004)をインストール(新しいSDKを消して)して、付属のサンプルをコンパイルすると、 DXGSample01.obj : error LNK2019: 未解決の外部シンボル _DXTraceW@20 が関数 "long __cdecl InitApp(struct HINSTANCE__ *)" (?InitApp@@YAJPAUHINSTANCE__@@@Z) で参照されました。 DXGSample01.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateSprite@8 が関数 "long __cdecl InitDXGraphics(void)" (?InitDXGraphics@@YAJXZ) で参照されました。 DXGSample01.obj : error LNK2019: 未解決の外部シンボル _D3DXCreateTextureFromFileW@12 が関数 "long __cdecl InitDXGraphics(void)" (?InitDXGraphics@@YAJXZ) で参照されました。 DXGSample01.obj : error LNK2019: 未解決の外部シンボル _Direct3DCreate9@4 が関数 "long __cdecl InitDXGraphics(void)" (?InitDXGraphics@@YAJXZ) で参照されました。 Debug/DXGSample01.exe : fatal error LNK1120: 外部参照 4 が未解決です。 と出てきます。 コンパイラの方の「プロパティ」→「構成プロパティ」→「リンカ」→「入力」の「追加の依存ファイル」に d3d9.lib d3dx9dt.lib dxerr9.lib dxguid.lib の4つは追加済みです。 インクルードパス・ライブラリパスがおかしいのでしょうか? ご回答お願いいたします。

  • ループ中でのscanfおよびcin

    あまりに基礎的な質問ですが,ループ中の入力関数が期待する動作になりません. コードを載せます while (1) { int key; scanf("%d", &key); if (key == 1) break; } 期待する動作は1が入力されるまでループし続けるというものですが scanfは一度しか実行されずループし続けます,cinに変えても同様でした 何が原因か分かる方,ご教示ください

  • C#のKeyDownイベント?で

    プログラムやり始めたばかりの初心者です。 電卓を作ってみようとやっているのですが、 一応ボタンを押しては動くようになりました。 キーボードからも入力できるようにKeyDownで設定したのですが 数字キー、+ - * /などは反応するのですがEnterキーだけは フォーカスされてるボタンがクリックされた状態になってしまいます。 どのようにすればよいのでしょうか? プログラムはこんな感じです! private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.D1: case Keys.NumPad1: this.button_1.Focus(); this.button_1.PerformClick(); break; case Keys.D2: case Keys.NumPad2: this.button_2.Focus(); this.button_2.PerformClick(); break; . . . case Keys.Enter: this.button_kei.Focus(); this.button_kei.PerformClick(); break; }