Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016/03/26 (土)

ゲームパッドの入力を「キー状態」と同じ感じで使いたい!

| 09:49 | ゲームパッドの入力を「キー状態」と同じ感じで使いたい! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - ゲームパッドの入力を「キー状態」と同じ感じで使いたい! - 雪乃☆雫のなでしこ日和 ゲームパッドの入力を「キー状態」と同じ感じで使いたい! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 なでりすのソースを、うーむと眺めていたんだけど、よくわかんな~い(爆)

 でも、キー操作でブロックを左右に動かしたり転させたり落としたり・・・とゆう操作自体は、「キー処理」という関数にまとまっている。

 ふつーに、バーチャルキーのキー状態オンオフをとって、もしもし条件分岐してる。

 てことは、ゲームパッドの入力を、なでしこの標準命令であるキー状態」と同じ感じで取得できれば、最小限の変更でゲームパッドで遊べるように改造することができるだろうし、後何か作ろうと思った時にも便利に違いない


 ・・・とゆーわけで、知恵が足りないから、通常のボタンと十字キーは手軽に別関数にしてしまったけれど、こんな感じの関数にしてみた。

#-----------------------------------------------------------------------
# 『JOYキー状態』『JOY十字キー状態』
#・なでしこの「キー状態」と同じ感じで、ジョイパッドのボタン入力状態を調べ、オンオフを返す。
#・肝心のWindowsAPI部分は「なでしこ質問掲示板」の一般人さまの答による。
#http://nade.jp-pro.net/bbs/bbs/cbbs.cgi?mode=one&number=7435&type=7400&space=45&no=0
#-----------------------------------------------------------------------

#-----------------------------------------------------------------------
!JOYERR_NOERROR = 0 //情報取得時にエラーがないときに返される値
!JOY_RETURNALL = 255 //Joystickの情報を全て取り込む値
#-----------------------------------------------------------------------
//Joystickの情報を取り込む関数
●joyGetPosEx(uJoyID,{参照渡し}pji) =DLL("winmm.dll","UINT joyGetPosEx(UINT uJoyID,LPJOYINFOEX pji)")
//Joystickの最大サポート数(?)は未使用
●joyGetNumDevs =DLL("winmm.dll","UINT joyGetNumDevs(VOID)")

//JOYINFOEXの構造体をグループで構成
■JOYINFOEXとは
 ・dwSize
 ・dwFlags
 ・dwXpos
 ・dwYpos
 ・dwZpos
 ・dwRpos
 ・dwUpos
 ・dwVpos
 ・dwButtons
 ・dwButtonNumber
 ・dwPOV
 ・dwReserved1
 ・dwReserved2
#-----------------------------------------------------------------------
●JOYキー状態(Sで|Sの)
  AとはJOYINFOEX
  A.dwSize = 52 //Cで言うsizeof()がわからなかったためマジックナンバー
  A.dwFlags = JOY_RETURNALL
  Bとは文字列
  PACK(A,B,`DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD`)
  もし、joyGetPosEx(0, POINTER(B))=JOYERR_NOERRORならば
    UNPACK(B,A,`DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD`)
    もし、S=A.dwButtonsならばオン戻る。
    違えばオフ戻る。
  違えばキャンセル戻る。

●JOY十字キー状態(Sで|Sの)
  AとはJOYINFOEX
  A.dwSize = 52 //Cで言うsizeof()がわからなかったためマジックナンバー
  A.dwFlags = JOY_RETURNALL
  Bとは文字列
  PACK(A,B,`DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD`)
  もし、joyGetPosEx(0, POINTER(B))=JOYERR_NOERRORならば
    UNPACK(B,A,`DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD`)
    Sで条件分岐
      # $2777とか$D888とかの数値は暫定。アナログジョイスティックのための措置。
      "L"ならば、
        もし、(A.dwXpos<$2777)ならばオン戻る。  # (A.dwXpos=0)
        違えばオフ戻る。
      "U"ならば、
        もし、(A.dwYpos<$2777)ならばオン戻る。  # (A.dwYpos=0)
        違えばオフ戻る。
      "R"ならば、
        もし、(A.dwXpos>$D888)ならばオン戻る。  # (A.dwXpos=$FFFF)
        違えばオフ戻る。
      "D"ならば、
        もし、(A.dwYpos>$D888)ならばオン戻る。  # (A.dwYpos=$FFFF)
        違えばオフ戻る。
      違えばオフ戻る。
  違えばキャンセル戻る。
#-----------------------------------------------------------------------

 以下はサンプルプログラム。

 十字キーで「●」を動かし、ボタンで色を変えるプログラムが、キーボードの場合のをコピペしてキー番号と関数名の書き換えだけで、全く同様に動いたよ!

#-----------------------------------------------------------------------
#----バーチャルキー定義-------------
!VK_LEFT = 37
!VK_UP = 38
!VK_RIGHT = 39
!VK_DOWN = 40
!VK_Z = 90
!VK_X = 88
#----ジョイパッドのキー定義-------------
!JOY_Aとは整数=$01
!JOY_Bとは整数=$02
!JOY_Cとは整数=$04
!JOY_Xとは整数=$08
!JOY_Yとは整数=$10
!JOY_Zとは整数=$20
!JOY_Lとは整数=$40
!JOY_Rとは整数=$80
!JOY_STARTとは整数=$100
!JOY_SELECTとは整数=$200
!JOY_LEFTとは文字列="L"
!JOY_UPとは文字列="U"
!JOY_RIGHTとは文字列="R"
!JOY_DOWNとは文字列="D"
#-----------------------------------------------------------------------

ゲームパッド使用=オンオフにするとキーボードで動きます
CX=母艦のクライアント幅/2-24/2
CY=母艦のクライアント高さ/2-24/2
文字書体は「MS ゴシック|24|太字」
母艦CX,CYへ「●」を文字表示もし、ゲームパッド使用=オンならば
  1の
    もし(JOY_UPのJOY十字キー状態オン)ならば
      もし、(JOY_RIGHTのJOY十字キー状態オン)ならばCX=CX+3。CY=CY-3。
      違えばもし、(JOY_LEFTのJOY十字キー状態オン)ならばCX=CX-3。CY=CY-3。
      違えば、CY=CY-3。
    違えばもし(JOY_DOWNのJOY十字キー状態オン)ならば
      もし、(JOY_RIGHTのJOY十字キー状態オン)ならばCX=CX+3。CY=CY+3。
      違えばもし、(JOY_LEFTのJOY十字キー状態オン)ならばCX=CX-3。CY=CY+3。
      違えば、CY=CY+3。
    違えばもし(JOY_RIGHTのJOY十字キー状態オン)ならばCX=CX+3。
    違えばもし(JOY_LEFTのJOY十字キー状態オン)ならばCX=CX-3。

    もし、(JOY_AのJOYキー状態オンならば文字色緑色。
    違えばもし、(JOY_BのJOYキー状態オンならば文字色赤色。
    違えばもし、(JOY_CのJOYキー状態オンならば文字色青色。
    違えばもし、(JOY_XのJOYキー状態オンならば文字色紫色。
    違えば文字色黒色。
    母艦白色画面クリア
    母艦CX,CYへ「●」を文字表示。
    0.01秒待つ
違えば
  1の
    もし(VK_UPのキー状態オン)ならば
      もし、(VK_RIGHTのキー状態オン)ならばCX=CX+3。CY=CY-3。
      違えばもし、(VK_LEFTのキー状態オン)ならばCX=CX-3。CY=CY-3。
      違えば、CY=CY-3。
    違えばもし(VK_DOWNのキー状態オン)ならば
      もし、(VK_RIGHTのキー状態オン)ならばCX=CX+3。CY=CY+3。
      違えばもし、(VK_LEFTのキー状態オン)ならばCX=CX-3。CY=CY+3。
      違えば、CY=CY+3。
    違えばもし(VK_RIGHTのキー状態オン)ならばCX=CX+3。
    違えばもし(VK_LEFTのキー状態オン)ならばCX=CX-3。

    もし、(VK_Zのキー状態オンならば文字色赤色。
    違えばもし、(VK_Xのキー状態オンならば文字色青色。
    違えば文字色黒色。
    母艦白色画面クリア
    母艦CX,CYへ「●」を文字表示。
    0.01秒待つ
#-----------------------------------------------------------------------

 同様にして、なでりすの「キー処理」関数だけ書き換えたら、ちゃんと遊べました♪


 途中で、アナログジョイスティックの場合の実験に移行してしまったため、ここまでえらく時を食ったけれど、おかげでやっぱりゲームパッドによって、割り当て数値がまたちょっと違うみたいだとゆうことも分かった。

 のジョイパッドのキー定義は、サターンパッドに合わせています(サターンパッドにセレクトボタンないけど)

 でも、PS2の場合は、Aボタン(○)が$02、Bボタン(×)が$04・・・みたいなことになってるし、LRボタンも、SSのLとRがPS2ではR2とR1になっているなど、自分以外の人にも遊んでもらおうと思う場合は、キー設定のオプションが必須になるかもしないねえ。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20160326