2026年 10月 12日
シューティングを作るので HSP Dishでのパッド入力について検証してみる。
どうも mod_joystick2.asというモジュールで jstick命令で stick命令と同じような感じでパッド入力を検知できるみたい。
HELPでサンプルプログラムを表示できるのでやってみる。
残念ながら mod_joystick2.asは Linuxでは使えないみたい。
F1キーでヘルプ

jstickは stick命令と使い方は変わらない

サンプルを実行してみます。


パッドでもカーソルでも動きますね

これだけでパッドとカーソル両方を検知してくれます。
#include "mod_joystick2.as" ; stick互換ジョイスティックモジュール jstick key,15 ; キー入力 if key&128 : goto *owari ; [ESC]で終了 ; 入力から座標を動かす if key&1 : mx=mx-msp if key&4 : mx=mx+msp if key&2 : my=my-msp if key&8 : my=my+msp
ボタンは 1=16、2=32、3=64と言う感じです、手持ちのパッドの最大 13ボタン目で値 65536でした。
これキーボードだと 16=SPACE、32=Enter、64=Ctrl 128=ESCキーなので、例えばソースのように ESCで終了だとパッドの 4キーで終了します。
Linuxだとこうなります。

そもそも mod_joystick2.asファイルが無いみたいです。
たぶんパッドの検知にはウインドウズのダイレクトXを使ってるのではないかと思います(説明書によると mod_joystick.asはウインドウズ用ですね)
mod_joystick2.asのパッド検知 joyGetPosEx命令について。
こんな感じで値を見る事ができる。
#include "mod_joystick2.as" repeat redraw 0 color 255,255,255 : boxf : color 0,0,0 joyGetPosEx data, 0 pos 0,0 : mes "stat = " + stat repeat 13 mes ""+cnt+" "+data(cnt) loop redraw 1 : await 30 loop

2は左のスティックの X座標。
値は 0~65535で、ニュートラル(真ん中)が 32767。
これ注意しなければいけないのは、たしかニュートラルの値が各パッドによって少し違ったりするので、厳密な中央値で運用すると、スティックを倒して無いのに倒してる扱いになって、勝手に動いてしまう事。
中央から少しマージンを取って倒してる扱いにする、つまり中央 + - n値の分だけ検知しない仕様にする事。
あんまり無検知領域を大きくすると、おもいっきりスティックを倒さないと検知しなくなるので、経験上 + -4000くらい、つまり中央値が 32768なら 28768 ~ 36768の間は無検知にする事。
3は左のスティックの Y座標。
4は右のスティックの X座標。
5は右のスティックの Y座標。
8がボタンで 1=1、2=2、3=4、4=8、5=16、足し算で 1と2のボタンが押されてると値は 3になる、例えば 3と 5のボタンが押されてれば 4 + 16 = 20の値になる。
プログラム上では ANDで検知かな、IF n and 16なら 5ボタンを検知とか。
9は押してるボタンの数みたい、たぶん使う事は無い。
10は POVスイッチだっけ?、十字キーの入力で、ニュートラルが 65535で、上から時計回りに、上が 0、右上 4500、右 9000、右下 13500、下 18000、左下 22500、左 2700、左上 31500の値みたい。
#include "mod_joystick2.as"
screen 0,640,480
jx=320 : jy=240 ; 自機座標
jsp=5 ; スピード
sn=20 ; 弾数
ssp=10 ; ショットスピード
dim sd,sn,4
; 弾データ(0=フラグ、1=x座標、2=y座標、3弾種類)
repeat
redraw 0
color 255,255,255 : boxf : color 1,1,1
joyGetPosEx data, 0
if data(3)<32767-4000 : jy-=jsp ; 上
if data(3)>32767+4000 : jy+=jsp ; 下
if data(2)<32767-4000 : jx-=jsp ; 左
if data(2)>32767+4000 : jx+=jsp ; 右
if data(10)=0 : jy-=jsp ; 上
if data(10)=4500 : jx+=jsp : jy-=jsp ; 右上
if data(10)=9000 : jx+=jsp ; 右
if data(10)=13500 : jx+=jsp : jy+=jsp ; 右下
if data(10)=18000 : jy+=jsp ; 下
if data(10)=22500 : jx-=jsp : jy+=jsp ; 左下
if data(10)=27000 : jx-=jsp ; 左
if data(10)=31500 : jx-=jsp : jy-=jsp ; 左上
pos jx,jy : mes "★"
; ショット
bn=1 ; ボタン値
repeat 20 : bno=cnt+1 ; ボタンNo.
if data(8) and bn { ; 押されてる
f=0 : n=0 ; 登録No.
repeat sn
if sd(cnt,0)=0 : n=cnt : f=1 : break ; 登録空き
loop
if f=0 : break ; 空きが無かった
sd(n,0)=1 ; フラグ
sd(n,1)=jx ; x座標
sd(n,2)=jy-8 ; y座標
sd(n,3)=bno ; 種類
}
bn=bn*2
loop
repeat sn ; ショット移動
if sd(cnt,0)=0 : continue ; 無い
sd(cnt,2)-=ssp ; y座標
if sd(cnt,2)<-16 : sd(cnt,0)=0 ; 画面外で消去
loop
repeat sn ; ショット表示
if sd(cnt,0)=0 : continue ; 無い
pos sd(cnt,1),sd(cnt,2)
mes ""+sd(cnt,3)
loop
pos 0,0
repeat 13
mes ""+cnt+" "+data(cnt)
loop
redraw 1
await 1000/30 ; 30FPS
loop
後は Linuxでの検出だけど、上記プログラムを.exeファイル(ウインドウズファイル)にしたものを Wine(ウインドウズエミュ)で実行は普通に動く。

上記プログラムを Linuxの HSPでは mod_joystick2.asがウインドウズ用なので動かせない。
他に LInuxの HSPでパッドを検知する方法は今の所無い、説明書には GPIO入出力なる方法が記載されているが、試してみると devcontrol命令の部分で落ちる。
もしかしたらラズベリーパイでは出来て、ウブンツでは出来ないのかもしれない、よく分からないし、使い方もよく分からない。
他の方法論としては、カーソルとキーボードで動くものを JoyTokeyのような外部ソフトでパッドを使ってもらうとか。
と言う訳でゲームパッドの入力は jstick命令で簡単にできるようになっているけど、Linuxでのゲームパッド入力は今の所できないっぽい。