HSP Dishでジョイスティック(ゲームパッド)入力について考える


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でのゲームパッド入力は今の所できないっぽい。
 
 

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です