2016-10-29
ジョイパッドを使うよ!
ファイターズが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」となっているようだったので、そのように。
- 36 http://nadesiko.g.hatena.ne.jp/keyworddiary/間
- 14 https://www.google.co.jp/
- 7 http://nadesiko.g.hatena.ne.jp/20161029
- 6 http://nadesiko.g.hatena.ne.jp/keyworddiary/そう
- 5 http://nadesiko.g.hatena.ne.jp/keyword/変数
- 4 http://www.bing.com/search?q=LPJOYINFOEX&form=MSNH14&sc=8-4&sp=-1&qs=n&sk=
- 3 http://nadesiko.g.hatena.ne.jp/keyword/空
- 3 https://www.google.com/
- 2 http://nadesiko.g.hatena.ne.jp/keyword/そう
- 2 http://nadesiko.g.hatena.ne.jp/keyword/キー状態