« [解剖記]全画面表示への改造 | トップページ | [改造記]はじめに »

[解剖記]アナログジョイスティックへの対応

いまさら・・・という感じですが、ジョイスティックを購入したので、その対応をやってみました。でも、Hspの標準命令にはジョイスティックの入力に関する命令が無いため、拡張dllを使う事になります。Miaさんの開発された、hspjsis.dllをダウンロードし、hsp2.exeなどと同じフォルダに入れましょう。

詳しくはhspjsis.dll添付のreadmeやサンプルを参考にして頂きたいのですが、この拡張dllを使う場合はスクリプトの先頭を次のようにして下さい。


#uselib "hspjsis.dll"
#func jstick jstick $0
#func jsticka jsticka $0
#func jassign jassign $0
#func jdset jdset $0

これで準備ができました。

実は、デジタルジョイスティックへの対応は非常に簡単です。というのは、stick命令とjstick命令はほぼ同じ機能なので、


stick (変数)

となってる部分に追加して、


jstick : (変数)=stat

とやればOKです。より具体的にすると、次のような形にした方がいいでしょう。


stick pat,79
jstick 79 : if stat!0 : pat=stat
xv=(pat>>2&1)-(pat&1)
yv=(pat>>3&1)-(pat>>1&1)

非トリガータイプキーの指定の仕方も全く同じです。

問題はアナログジョイスティックへの対応です。システム変数statに代入される値がstick命令と全く違うため、対応させるためにはキー入力の判定を別の方法でやらなければなりません。その対応版は以下の通りです。色がついてる部分が変更箇所になります。


;■ 自機移動-ジョイスティック対応後-
*jikimove
if mf>0 :
jsticka : pat=stat
shottime--
axv=pat>>16&255 : xv=0
if axv< 96 : xv=-1
if axv>160 : xv=1
ayv=pat>>8&255 : yv=0
if ayv< 96 : yv=-1
if ayv>160 : yv=1
pat=pat<<4
if mf>0 : if (pat&64>0)&(shottime<0) : shot=1
if mf>0 : mx=xv*move+mx : my=yv*move+my
if mx<0 : mx=0
if mx>590 : mx=590
if my<0 : my=0
if my>430 : my=430
pos mx,my : gcopy 2,xv*50+50,0,50,50
return

赤い部分が運動方向の算出式です。
(jstickaで得られる値)>>16&255が左右方向を表します。この値は、127を中心として、それ以下(0まで)は左、それ以上(255まで)は右を表します。
(jstickaで得られる値)>>8&255が上下方向です。この値も同じく、127を中心として、それ以下(0まで)は上、それ以上(255まで)は左を表します
ちゃんとしたアナログジョイスティックというのは、大きく傾けると速く、小さく傾けると遅く移動する、というような判定もできるようです。要は、127を 中心として256段階の判定ができるというわけ。私の持ってるジョイスティックの場合、左なら0、右なら255と、とってもデジタルな値しか返してくれま せんでしたけども^^;
それゆえここでは、127を中心として64の範囲を「動かない(xvまたはyvが0)」、それ以外の場合をそれぞれ上下左右に割り振っています。

ゴールドの部分がボタンの入力判定算出式です。
こうすれば、stick命令と同じ値が返されるようになります。具体的には、ボタン1がスペースキー(16)、ボタン2がEnterキー(32)、ボタン3がCtrlキー(64)、ボタン4がEscキー(128)です。


さて、問題はユーザーによって持ってるジョイスティックの種類が違うということです。デジタル入力の場合とアナログ入力の場合とで、入力判定の方法が異 なってくるため、同じルーチン内で処理するのは困難です。私の場合、コンフィグメニューでユーザーに「どちらを使うのか?」を選ばせるようにしてありま す。恐らく順々に入力判定を行えば、ユーザー側がデジタルアナログを意識することなく利用することが出来るようなスクリプトを組むことができると思います が、それは皆さんのほうで工夫してみてください。

参考までに、今までのキーボードからの入力のみの移動判定ルーチンを列記しておきます。


;■ 自機移動-ジョイスティック対応前-
*jikimove
if mf>0 : stick pat,79
shottime--
if mf>0 : if (pat&64>0)&(shottime<0) : shot=1
xv=(pat>>2&1)-(pat&1)
yv=(pat>>3&1)-(pat>>1&1)
if mf>0 : mx=xv*move+mx : my=yv*move+my
if mx<0 : mx=0
if mx>590 : mx=590
if my<0 : my=0
if my>430 : my=430
pos mx,my : gcopy 2,xv*50+50,0,50,50
return

« [解剖記]全画面表示への改造 | トップページ | [改造記]はじめに »

2.解剖記」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67538/57445615

この記事へのトラックバック一覧です: [解剖記]アナログジョイスティックへの対応:

« [解剖記]全画面表示への改造 | トップページ | [改造記]はじめに »