アナログジョイスティックへの対応

いまさら・・・という感じですが、ジョイスティックを購入したので、その対応をやってみました。でも、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

前のページへ戻る 解剖記のメニューへ戻る 後ろのページへ進む