• ベストアンサー

DirectX環境下での方向キー同時押しについて

現在、DirectXでゲームを作っているのですが、上と右や下と左の方向キー同時押しを認識させたいのですがやり方がわかりません。 現在は、VK_UP,VK_DOWN,VK_LEFT,VK_RIGHTで4方向は認識できるのですが。右上,左上,右下,左下も含めた8方向を認識させたいのです。 やり方や方法がわかるサイトでもかまいませんのでお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

 こんにちは。  ゲームの種類にもよるのですが、DirectX環境下と言う事で、秒間60回描写辺りを目安に作っているゲームなら、アイドリングループ位は持っているでしょうから、その中でGetKeyboardState()を呼び出して検出するのが手っ取り早いです。  ただ、ウィンドウのメッセージループ外では無効な上、ウィンドウがタスクバー化したり、フォーカスを失うと、一気に入力を受け付けなくなるので、DirectInputの使用が最も無難だと思います(何処でも現在の入力状態が受け取れる)。  初期化は面倒ですが、呼び出し方としてはGetKeyboardState()と大した変わりがありません(良く似ていると言う事です)。 +----------------------------------------------------------------+ BYTE key[256] = {0}; ::GetKeyboardState(key); //左後方大ジャンプ成立 if((key[VK_UP] & 0x80) && (key[VK_LEFT] & 0x80)) {  ココでキャラが左上に大ジャンプする } +----------------------------------------------------------------+ BYTE Key[256] = {0}; g_pKeyboard->GetDeviceState(256, Key); //左後方大ジャンプ成立 if((key[DIK_UP] & 0x80) && (key[DIK_LEFT] & 0x80)) {  ココでキャラが左上に大ジャンプする } +----------------------------------------------------------------+  尚、キーボードの同時押しについては既出の通り、DirectInputを使用しても受け付けない組み合わせがあります。  DirectInputに関しては以下を参考にして見て下さい。  http://www.shader.jp/xoops/html/masafumi/directx9/dinput/dinput002.htm  http://oshiete1.goo.ne.jp/qa4345138.html  http://oshiete1.goo.ne.jp/qa4312916.html

その他の回答 (3)

  • chie65535
  • ベストアンサー率43% (8516/19359)
回答No.3

蛇足ですが。 当方の回答の例では「キーボードイベントを受け取って、キーの状態により変数を操作する部分」と「キーの状態を持つ変数の値により、方向を認識する部分(つまり、移動の処理をする部分)」は「別々」にしてあります。 何故なら、ゲームの場合「自機(自分)は、一旦動き出したら一定速度で動く筈」であり、キーボードイベントが来た時しか動かないのは変です。 なので「キーボードイベントを処理する場所で、自機(自分)を移動させる処理をしてはいけない」のです。 自機(自分)を移動させる処理は、画面表示1回につき1回ごと(つまり、1フレームごと)に行わねばならず、キーボードイベントとは別のタイミングで行わねばなりません。 そのため、2つの処理を「別々」にしてあるのです。

  • chie65535
  • ベストアンサー率43% (8516/19359)
回答No.2

WM_KEYDOWN、WM_KEYUPメッセージをキャプチャして下さい。 上下左右キーそれぞれについて、押下中かどうかの状態を持つ変数を1つ用意します。 そして、変数のビット0~3を、上下左右キーの状態に割り当てます。 WM_KEYDOWNイベントを受け取ったら、以下のようにします。 ・WPARAMがVK_UPだったら変数のビット0を1にします。 ・WPARAMがVK_DOWNだったら変数のビット1を1にします。 ・WPARAMがVK_LEFTだったら変数のビット2を1にします。 ・WPARAMがVK_RIGHTだったら変数のビット3を1にします。 WM_KEYUPイベントを受け取ったら、以下のようにします。 ・WPARAMがVK_UPだったら変数のビット0を0にします。 ・WPARAMがVK_DOWNだったら変数のビット1を0にします。 ・WPARAMがVK_LEFTだったら変数のビット2を0にします。 ・WPARAMがVK_RIGHTだったら変数のビット3を0にします。 具体的には、以下のようになります。 事前に変数KeyBitsを用意し0に初期化しておいて下さい。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {  switch ( msg )  {  case WM_KEYDOWN:   // キーが押されたとき   switch ( wp )   {   case VK_UP:    KeyBits |= 1;    return 0;   case VK_DOWN:    KeyBits |= 2;    return 0;   case VK_LEFT:    KeyBits |= 4;    return 0;   case VK_RIGHT:    KeyBits |= 8;    return 0;   }   break; // 特に処理しないキーはDefWindowProc()に任せる  case WM_KEYUP:   // キーが離されたとき   switch ( wp )   {   case VK_UP:    KeyBits &= ~1;    return 0;   case VK_DOWN:    KeyBits &= ~2;    return 0;   case VK_LEFT:    KeyBits &= ~4;    return 0;   case VK_RIGHT:    KeyBits &= ~8;    return 0;   }   break; // 特に処理しないキーはDefWindowProc()に任せる  case WM_DESTROY:   // ウィンドウが破棄されるとき   PostQuitMessage( 0 );   return 0;  }  return DefWindowProc( hWnd, msg, wp, lp ); } で、変数KeyBitsの値により、以下のように場合分けします。  switch ( KeyBits )  {  case 0x01: ///↑を押している  case 0x0d: ///↑→←を押している   上方向の処理   break;  case 0x02: ///↓を押している  case 0x0e: ///↓→←を押している   下方向の処理   break;  case 0x04: ///←を押している  case 0x07: ///↑↓←を押している   左方向の処理   break;  case 0x08: ///→を押している  case 0x0b: ///↑↓→を押している   右方向の処理   break;  case 0x09: ///↑→を押している   右上方向の処理   break;  case 0x0a: ///↓→を押している   右下方向の処理   break;  case 0x05: ///↑←を押している   左上方向の処理   break;  case 0x06: ///↓←を押している   左下方向の処理   break;  case 0x00: //どれも押してない  case 0x03: //↑↓を押している  case 0x0c: //→←を押している  case 0x0f: //↑↓→←を押している   // 何もしない   break;  } なお、ウィンドウ上でキーを押したままにして、マウスで別ウィンドウに移動して、別ウィンドウがアクティブになった状態でキーを離すと、元のウィンドウにはWM_KEYDOWNのみが送られ、WM_KEYUPが送られない場合があります。 つまり、矢印キーを押している最中に別ウィンドウに移ってから、元のウィンドウに戻ると「キーを押してないのに、矢印キーがいつまでも押しっぱなしの状態のまま」になる事があります。 なので「ウィンドウが非アクティブになった時」に「全部の矢印キーが離された事にする」と言う細工が必要です(前述の例で言えば、KeyBits変数を0にしてしまう) また、キーのオートリピート機能により、WM_KEYDOWNイベントが連続で大量に発生する事があるので「WM_KEYDOWNが連続で発生しても大丈夫」な書き方をする必要があります。

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

キーボードの同時押しに関しましては、 GetKeyboardState()が使えると思いますので、 参照してみてください。 ただし、キーの組み合わせや、キーボードの種類によっては、 同時押しを正しく取得出来る保証はありません。

関連するQ&A

  • キーボードで画像を動かす方法

    javaScriptで、 if (event.keyCode == 38) UP(); if (event.keyCode == 39) RIGHT(); if (event.keyCode == 37) LEFT(); if (event.keyCode == 40) DOWN(); のような処理で、上下左右の方向に画像などを移動させています。 しかし、上キーと右キーを同時に押しても 右上には移動しません。 率直にJavaScriptでキーボード入力を行って 右上、右下、左上、左下のように 2つのキーを同時に押したことを判定する方法は ありますでしょうか? ためしに&&を用いて 上キーと右キーが押されたとき用にUP_RIGHT() を作ってコールしたのですが思ったように動かないようでした。 どうかご教授ください。

  • キーボードの同時押しについて。

    以下の同時入力ができるかどうか、教えてください。一つでも構いません。 ・「Z」+「←」+「↓」 ・「Z」+「→」+「↓」 ・「Z」+「←」+「↑」 ・「Z」+「→」+「↑」 ・「Z」+「X」+「←」+「↑」 ・「Z」+「X」+「→」+「↑」 ・「Z」+「X」+「←」+「↓」 ・「Z」+「X」+「→」+「↓」 時間があれば http://nyaco.hp.infoseek.co.jp/toho.shtml のゲームで確認を取っていただくと嬉しいです。 ・「Z」+「←」+「↓」 弾を撃ちながら、左下に移動 ・「Z」+「→」+「↓」 弾を撃ちながら、右下に移動 ・「Z」+「←」+「↑」 弾を撃ちながら、左上に移動 ・「Z」+「→」+「↑」 弾を撃ちながら、右上に移動 このように回答していただくと嬉しいです。 ・パソコンの種類:ノートPC,デスクトップPC,タブレットPC ・メーカー:NEC,富士通,DELL,ソニー(Vaio) ・同時押しができたかどうか 分かればこちらも ・型番 ・OS ・デスクトップの場合 キーボードメーカー 例 ・ノートPC ・富士通 ・以下の入力ができない -・「Z」+「←」+「↓」 -・「Z」+「→」+「↓」 -・「Z」+「X」+「←」+「↓」 -・「Z」+「X」+「→」+「↓」 ・FMV-S8215 ・XP 目的 パソコンの購入を検討しています。しかし、キーボードの同時押しができないとゲームをするときに非常に困るので、同時押しが出来るパソコン(キーボード)を探しています。 また、ノートパソコンを検討しているのでノートパソコンの方の回答は非常に参考になります。

  • 左下方向に口をゆがめる事ができても、右下方向に口をゆがめる事ができません

    私は物事に失敗した時などに唇を左下方向にゆがめるクセがあります。 ある時、鏡の前で口を左下方向にゆがめたところ、思っていた以上に自分は口をゆがめれるので、すごいなあと思いました そして同じことを今度は右側でしようとしたところ、できないのです。 これはちょっとおかしい事だと思いませんか? 左下方向に口をゆがめる事ができても、右下方向に口をゆがめる事ができません 逆に、右上方向になら口をゆがめる事はできますが、反対に左上方向に口をゆがめる事ができません これは正常な事なのでしょうか? 私は顔の神経、筋肉が柔軟ではないという事でしょうか? 将来、顔面神経に何か異常をきたす可能性はあるでしょうか? また、口を閉じた状態でニコッとして、可能な限り口角を上げた時、左右の口角の位置が水平でないような気がします。(少しだけ左口角がやや上) それは肉体のどこかが、ゆがんでいるという事でしょうか 少し心配です どなたかご存じの方、よろしければご回答ください よろしくお願いいたします

  • [SHIFT+矢印キー]同時押しすると矢印キーが

    どのカテゴリーか今一分類し辛かった為、こちらに書きました。 ・FMV-BIBLO NH70J ・WindowsXP SP2-DirectX 9.0c ・足りない情報など不備があるやも。 [SHIFT+矢印キー]の同時押しを幾度か繰り返していると、その押した方向の片方の矢印キーが押しっぱなしと同じ状態になってしまいます。 例:SHIFT +↓+ ← の同時押しを繰り返した場合、↓か←のキーが押しっぱなし状態になる。 固定キーの設定かと思いましたが、該当のチェックボックスは設定含め外してありました。 また、この症状が発生する少し前に「ユーザー補助の設定ウィザード」で色々設定を変えてしまい、HP検索等でその設定を無効にしていました。 これが原因なのかと思い、色々調べましたが参考に出来るサイトは見つかりませんでした。 尚、この症状が発生するのはVectorのゲームや市販のゲーム等の操作時のみであり、IE等ゲーム外通常の操作では発生していません。ゲームではなく明らかにこのPCの設定がおかしい筈なのですが・・・。 何か良い解決策は無いのでしょうか…。 最終手段はOS再インストールとして、他の解決策が分かる方いらっしゃいましたら宜しくお願い致します。

  • 上部

    上部という言葉がありますが、下・右・左・真ん中、右上・左上・右下・左下はなんと言いますか?

  • 数学C 行列の問題です

    左上3a^2-3 右上3a 左上 -1 右上-3a-2 * 左下2a^2-a-2 右下2a-1 左下 a 右下3a^2+2a-3 見にくくてすみません。 よろしくお願いいたします。

  • キーボードの同時押し能力を調べる方法

    現在acer製ノートPCを使用しているのですが、シューティングゲームをしているとき、4キーの同時押しが認識されません。 (例えば、shift + z + ← + ↑ など) これはキーボードの能力の問題なので、このPCで4キー同時押しを実現するのは諦めています。 そこで、新しく、4キー同時押しに対応しているノートPCを購入しようと考えています。 友人のPCを触らせてもらった体感として、東芝製ノートPCは比較的、多数キー同時押しに対応しているように思えます。 よって東芝製ノートPCを買おうかなと考えているのですが、購入してみたらやっぱり対応していませんでした、では困るので、簡単にチェックする方法を探しています。 電気屋さんでPCを実際に使ってみて、簡単に同時押し能力をチェックする方法は、何かないでしょうか。 (ゲーム用キーボードを購入すれば多キー同時押しに対応することは分かっていますが、ノートPCでやりたいので。)

  • 有線の光学式マウスを使用していますが、マウスを斜めに動かした場合の感度

    有線の光学式マウスを使用していますが、マウスを斜めに動かした場合の感度?が左右で違う症状がでています。 具体的には左上から右下方向の対角線上はスムーズに動くのですが、逆の右上から左下の対角線が非常に反応が悪いです。 言い方を変えますと、同じ速さでマウスを動かした場合、左上と右下には早く動く、右上と左下には遅く動くといった状態です。 どうやらこの斜めの反応が悪いようで、右のみや上のみといった直線ではスムーズに動くのですが、それに上下の動きが動き加わると反応悪くなります。右上と左下に動かした場合、段差ができるように動いているため、右と上、左と下といった同時認識が行われていない?とも感じています。 症状の発生時期は、購入時からかどうかも気にしたことが無かったため解りませんが、購入からまだ半年も経過していません。 ちなみに使用しているマウスはGalleriaでパソコンを購入した際付属していたものです。 Galleria Laser Mouse MODEL NO:GLM-01 と裏面に表記。 原因や対処方法など解る方がいましたら、どうか教えて下さい。

  • この数学の問題が意味不明です。

    この数学の問題が意味不明です。 m = ( a[括弧内の左上] b[右上] c[左下] d[右下] ) は2×2の行列である。tM と detM を次で定義する。 tM = ( a [括弧内の左上] c [右上] b [左下] d [右下] ), detM = ad - bc. A = ( 1 [括弧内の左上] x [右上] 1/2 [左下] y [右下] ) とする。 tA( 0 [括弧内の左上] 1 [右上] 1 [左下] 0 [右下] )A = ( 1 [括弧内の左上] 0 [右上] 0 [左下] -1 [右下] ) 且つ detA = 1 を満たすxとyを求めよ。 解:x= -1 y=1/2 この回答の解説を、わかる人は言葉を添えて丁寧に説明しください、お願いします。 自分は、行列の意味と、tMとdetM とかの意味がわかりません。高校三年生初期の知識だけあります。 教えてくれたら本当に助かります。

  • 漢字の書き順について教えてください

    いつもお世話になっております。 先日画数の多い漢字を調べたところ、龍龍                         龍龍と、 龍の字を四つ並べた漢字が有るということを知りました。 この漢字の書き順はどのようになりますでしょうか? (龍をどの順番で書けば良いのか、悩んでいます) 左上→右上→左下→右下 左上→左下→右上→右下 どの順番が正しいのでしょうか? どなたか教えていただけると幸いです。 よろしくお願いします。

専門家に質問してみよう