Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016/10/29 (土)

ジョイパッドを使うよ!

| 05:32 | ジョイパッドを使うよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - ジョイパッドを使うよ! - 雪乃☆雫のなでしこ日和 ジョイパッドを使うよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 ファイターズが10年ぶりの日本一!

 いや~、めでたいね、こりゃ\(^▽^)/



 さて・・・

 とりあえず、なでコラをジョイパッドで遊べるようにすること自体は、簡単でした。

 まえに、サンプルのなでりすでやってみたように、「キー処理」のサブルーチンをコピペして、「JOYキー処理」とでもして、「キー状態」を「JOYキー状態」に書き換えてやったらふつーに動きます。

 でもなあ、んなことでいいのか、本当に?!?!(汗)

 ・・・だけど、「または」で、一つにまとめようとすると、ジョイパッドがつながってる時はいいんだけど、つながっていない時のキーボードでの動きが、異常に悪くなるんだよね。

 なんでーなるのか、よく分からん(--;;;

 ・・・とゆうわけで、ものすごく無駄っぽく、ほとんど同じ風味なコードで行数を使ってしまうけど・・・取りあえず動けばOK!

 ・・・ってことにしておく。むむむ。



 さて、の、前のなでりすを試しに改造してみた時には、知恵が足りなくて、十字キーの状態をお手軽に別関数にしてしまっていたんだけど・・・

 ・・・「ほんっとバカだよなー、こいつ(爆)」・・・みたいな感じで、一つにまとめたwww

 文字列「U,R,D,L」の代わりに数値「$1000,$2000,$4000,$8000」を与えることにしただけです。

 ついでに、単にジョイパッドが接続されてるかどうかを返す関数と、JOYキー状態とは逆に、押されているジョイパッドのボタンのキーを返す関数追加して、のワタシの知恵ではこれが限度だけど、とりあえずキーコンフィグようの準備は整った・・・かもしない

 取りあえず、こんな感じ。

#-----------------------------------------------------------------------
# ジョイパッドの使用
#-----------------------------------------------------------------------
#『JOYパッド接続状態』
#・ジョイパッドが接続されてるかどうかをオン(1)かオフ(0)で返す。
#『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パッド接続状態
  もし、joyGetPosEx(0, POINTER(B))=JOYERR_NOERRORならばオン戻る。
  違えばオフ戻る。
#-----------------------------------------------------------------------
●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ならばオン戻る。
    # $2777とか$D888とかの数値は暫定。アナログジョイスティックのための措置。
    違えばもし、S=$1000ならば、
      もし、(A.dwYpos<$2777)ならばオン戻る。  # UP (A.dwYpos=0)
      違えばオフ戻る。
    違えばもし、S=$2000ならば、
      もし、(A.dwXpos>$D888)ならばオン戻る。  # RIGHT (A.dwXpos=$FFFF)
      違えばオフ戻る。
    違えばもし、S=$4000ならば、
      もし、(A.dwYpos>$D888)ならばオン戻る。  # DOWN (A.dwYpos=$FFFF)
      違えばオフ戻る。
    違えばもし、S=$8000ならば、
      もし、(A.dwXpos<$2777)ならばオン戻る。  # LEFT (A.dwXpos=0)
      違えばオフ戻る。
    違えばオフ戻る。
  違えばキャンセル戻る。
#-----------------------------------------------------------------------
●JOYキー取得
  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`)
    JOY_KEY=A.dwButtons
    もし、(A.dwYpos<$2777)ならば、JOY_KEY=JOY_KEY+$1000      # UP (A.dwYpos=0)
    違えばもし、(A.dwYpos>$D888)ならば、JOY_KEY=JOY_KEY+$4000  # DOWN (A.dwYpos=$FFFF)
    もし、(A.dwXpos<$2777)ならば、JOY_KEY=JOY_KEY+$8000      # LEFT (A.dwXpos=0)
    違えばもし、(A.dwXpos>$D888)ならば、JOY_KEY=JOY_KEY+$2000  # RIGHT (A.dwXpos=$FFFF)
    もし、JOY_KEY=0ならばオフ戻る。
    違えば、JOY_KEYで戻る。
  違えばオフ戻る。
#-----------------------------------------------------------------------

#以下はテスト
#-----------------------------------------------------------------------
!母艦設計=「母艦の可視はオフ」
//!「ジョイパッドの使用.nako」を取り込む。

#---キー定義------------------
!JOY_UPとは整数=$1000
!JOY_RIGHTとは整数=$2000
!JOY_DOWNとは整数=$4000
!JOY_LEFTとは整数=$8000
!JOY_Aとは整数=$01
!JOY_Bとは整数=$02
#-----------------------------

#---母艦------------
母艦中央移動
母艦の可視はオン
#-----------------------------------------------------------------------

AとはエディタCX=母艦のクライアント幅/2-24/2
CY=母艦のクライアント高さ/2-24/2
文字書体は「MS ゴシック|24|太字」
母艦CX,CYへ「●」を文字表示。

#---動作テスト------------

# 『JOYパッド接続状態』
もし、JOYパッド接続状態=オンならば、「ジョイパッドを認識しました」を言う違えば、「ジョイパッドが接続されていません」を言う終わる。

# 『JOYキー状態オン
  もし(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キー状態オン)ならば文字色青色。
  違えば文字色黒色。
  母艦白色画面クリア
  母艦CX,CYへ「●」を文字表示。
//  0.01秒待つ

# 『JOYキー取得』
  もし、JOYキー取得=0でなければ、
    Aのテキストは、「${HEX(JOYキー取得)}」。
  0.01秒待つ
#-----------------------------------------------------------------------

 ジョイパッドがつながっていないと、接続されていませんと言って終わるだけだけどね;


※2017/01/29

 ちょっと修正しました。

 十字キーの割り当てですが、「U,L,R,D=$1000,$2000,$4000,$8000」としていましたが、パッドによっては、十字キーも「A.dwXpos」「A.dwYpos」を使わず、「A.dwButtons」を割り当てているヤツがあり、それ数値がどうやら、「U,R,D,L=$1000,$2000,$4000,$8000」となっているようだったので、のように。

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