HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
1021
nennneko5787NintendoSwitch Proコントローラーのボタンが押されたか取得29解決


nennneko5787

リンク

2022/10/21(Fri) 12:39:14|NO.97223

NintendoSwitch Proコントローラーのボタンが押されたか取得したいです。
mod_joystickを使ってみましたがうまくいきませんでした。



この記事に返信する


沢渡

リンク

2022/10/21(Fri) 19:15:30|NO.97225

どうもこの記事を読んだ限り、SwitchのコントローラーはPCへのUSB接続は受け付けてもらえず、
Bluetoothを使った接続でないとダメなようです。
https://www.4gamer.net/games/999/G999903/20170307086/

私はProコントローラーではなくワイヤレスホリパッドを使っているのですが、
Bluetoothを搭載したノートPCで試してみたところ、
うまくmod_joystickのサンプルプログラムが動きました。



nennneko5787

リンク

2022/10/22(Sat) 14:54:08|NO.97228

>>PCにプロコンをUSBケーブル接続しても、ゲームパッドと認識されない場合がありますが、
>>この場合はプロコンのSyncボタンを押すと何故か認識開始する模様。
http://midorinobiotop.blog.fc2.com/blog-entry-2416.html

上の方法で動作確認済みです。音ゲーでも動作しました。
しかしHSPでは動作しません。



沢渡

リンク

2022/10/22(Sat) 17:18:01|NO.97230

まず、mod_joystick.asを利用した方法を使うのなら、joyGetPosExの第二パラメータの
ポート番号を変更したらどうなるでしょうか?
それでもダメなら、X-Input対応のモジュールを作ってみましたので、
こちらだとどうでしょうか?

/* X-Input対応のジョイスティック状態を取得するモジュール ・joyGetPos_x_initを最初に実行しておく ・joyGetPos_x p1,p2,p3 p1には要素数8の整数配列を、p2にはコントローラーのインデックスを指定する(省略時は0)。 実行後、p1に指定した配列には以下の値が入る。 0 : ジョイスティックに入力があるたびに増加する値 1 : ボタンの入力状態(十字キーの状態もここに入る) 2 : 左アナログボタンの入力状態 3 : 右アナログボタンの入力状態 4 : 左スティックのX軸 5 : 左スティックのY軸 6 : 右スティックのX軸 7 : 右スティックのY軸 p3に0以外の値を指定した場合は、前回実行した時とジョイスティックの状態が変わらないのなら、配列の内容を変更しない。 (省略時は1) */ #uselib "XInputUap.dll" #func global XInputGetState "XInputGetState" int,int #module #deffunc joyGetPos_x_init //これを最初に実行する dim state,4 packet_old=-1 return #define ctype add_sign16(%1) ((%1)<<16>>16) //16bit符号なし整数を符号ありに変換する #define global joyGetPos_x(%1,%2=0,%3=1) _joyGetPos_x %1,%2,%3 #deffunc _joyGetPos_x array out,int port,int flag XInputGetState port,varptr(state) if flag : if state(0)=packet_old : return packet_old=state(0) out(0)=state(0) out(1)=state(1)&0xFFFF out(2)=(state(1)>>16)&0xFF out(3)=(state(1)>>24)&0xFF out(4)=add_sign16(state(2)&0xFFFF) out(5)=add_sign16((state(2)>>16)&0xFFFF) out(6)=add_sign16(state(3)&0xFFFF) out(7)=add_sign16((state(3)>>16)&0xFFFF) return #global joyGetPos_x_init //以下、テスト用プログラム dim data,8 repeat joyGetPos_x data,0 redraw 0 color 255,255,255 : boxf : color 0,0,0 : pos 0,0 repeat 8 : mes data(cnt) : loop redraw 1 await 33 loop



nennneko5787

リンク

2022/10/22(Sat) 17:32:28|NO.97231

動作しませんでした。
が、探して見たら、こんなものが見つかりました。
https://github.com/JibbSmart/JoyShockLibrary
HSPのヘッダーファイルにすれば実装できそうです。
できたら報告します。



GENKI

リンク

2022/10/22(Sat) 17:53:12|NO.97232

> ポート番号を変更したらどうなるでしょうか?
この手の問題は、大抵はポート番号があってないのが原因ですね。
とりあえずどのポート番号かわからないときは総当り。

#include "mod_joystick2.as" *main redraw 1 : await 16 : redraw 0 : color 255,255,255 : boxf : color : pos 0,0 repeat 16 ; jstick jkey,cnt ; mod_joystick.as jstick jkey,0xFFFFFFFF,cnt ; mod_joystick2.as mes "" + cnt + ":" + jkey loop goto *main
ところで、このサンプル書いてて気がついたんですが、mod_joystick.asがマニュアル通りの動作をしてませんね。
mod_joystick2.as を使うようにしてください。


> X-Input対応のモジュール
すごい。これでX-Input対応できるのか。
しかしリンク先の記事にも書いてありますが、ProコントローラーはX-Input非対応っぽいのでX-Input対応のモジュールはだめなような。


mod_joystick.as / mod_joystick2.as の場合、DirectInputやX-Inputよりも昔からあるAPIを使用しているので基本的にどのゲームコントローラーでも動作します。



GENKI

リンク

2022/10/22(Sat) 17:56:49|NO.97233

HSP3で、こういう細かいトラブルをお手軽に回避したいならこちらもおすすめ。(ただの宣伝)

PAD設定さん
https://mclab.uunyan.com/dl/dl11.htm



GENKI

リンク

2022/10/22(Sat) 18:10:32|NO.97234

先程、古いバージョンのHSP3で、mod_joystick.asの使い方を確認してきました。

mod_joystick.asとmod_joystick2.asでは、引数の順番や仕様が異なります。
マニュアルには、mod_joystick2.as の jstick の使い方のみが記載されています。
mod_joystick.as のjstickは、最新版マニュアルから除外されていますのでご注意ください。

旧jstickがエラーからの自動復帰がないことを忘れていたので、先程の修正版を記載しておきます。

;#include "mod_joystick.as" #include "mod_joystick2.as" *main redraw 1 : await 16 : redraw 0 : color 255,255,255 : boxf : color : pos 0,0 repeat 16 ; mod_joystick.as の場合 ;jstick jkey, cnt ;modjoy_err = 0 ; エラーの復帰 ; mod_joystick2.as の場合 jstick jkey, 0xFFFFFFFF, cnt mes "" + cnt + ":" + jkey loop MES modjoy_err goto *main



SMOPU

リンク

2022/10/22(Sat) 18:14:17|NO.97235

横から割り込み失礼します。
プロコンのジャイロの取得はできないのですかね?



nennneko5787

リンク

2022/10/22(Sat) 18:26:43|NO.97236

>>NO.97234
すみません。できませんでした。



nennneko5787

リンク

2022/10/22(Sat) 18:59:03|NO.97237

ボタンが押されたかを取得したいのに、何故かコントローラーの色が取得できてしまいました()
以下、ソースコードです。
JoyShockLibrary.as

//JoyShockLibraryをHSPで使えるようにするモジュール1 //Note:JslSetCallbackはよくわかりませんでした。 ButtonMaskUp = 0 ButtonMaskDown = 1 ButtonMaskLeft = 2 ButtonMaskRight = 3 ButtonMaskPlus = 4 ButtonMaskOptions = 4 ButtonMaskMinus = 5 ButtonMaskShare = 5 ButtonMaskLClick = 6 ButtonMaskRClick = 7 ButtonMaskL = 8 ButtonMaskR = 9 ButtonMaskZL = 10 ButtonMaskZR = 11 ButtonMaskS = 12 ButtonMaskE = 13 ButtonMaskW = 14 ButtonMaskN = 15 ButtonMaskHome = 16 ButtonMaskPS = 16 ButtonMaskCapture = 17 ButtonMaskTouchpadClick = 17 ButtonMaskSL = 18 ButtonMaskSR = 19 #uselib "JoyShockLibrary" #cfunc global JslConnectDevices "JslConnectDevices" //intが返されます #func global JslGetConnectedDeviceHandles "JslGetConnectedDeviceHandles" int,var //varにintが返されます #cfunc global JslDisconnectAndDisposeAll "JslDisconnectAndDisposeAll" //何も返されません #cfunc global JslGetSimpleState "JslGetSimpleState" int //p1:device ID、構造体が返されます #cfunc global JslGetIMUState "JslGetIMUState" int //p1:device ID、構造体が返されます #cfunc global JslGetStickStep "JslGetStickStep" int //p1:device ID、floatが返されます #cfunc global JslGetTriggerStep "JslGetTriggerStep" int //p1:device ID、floatが返されます #cfunc global JslGetPollRate "JslGetPollRate" int //p1:device ID、floatが返されます #cfunc global JslResetContinuousCalibration "JslResetContinuousCalibration" int //p1:device ID、何も返されません #cfunc global JslStartContinuousCalibration "JslStartContinuousCalibration" int //p1:device ID、何も返されません #cfunc global JslPauseContinuousCalibration "JslPauseContinuousCalibration" int //p1:device ID、何も返されません #cfunc global JslGetCalibrationOffset "JslGetCalibrationOffset" int,float,float,float //p1:device ID、p2:xオフセット、p3:yオフセット、p4:zオフセット //#cfunc global JslSetCallback "JslSetCallback" //C++ではEventCallback型(?)のようです #cfunc global JslGetControllerType "JslGetControllerType" int //p1:device ID、intが返されます #cfunc global JslGetControllerSplitType "JslGetControllerSplitType" int //p1:device ID、intが返されます #cfunc global JslGetControllerColour "JslGetControllerColour" int //p1:device ID、intが返されます #cfunc global JslSetLightColour "JslSetLightColour" int,int //p1:device ID、p2:colour、何も返されません #cfunc global JslSetRumble "JslSetRumble" int,int,int //p1:device ID、p2:smallRumble、p3:bigRumble、何も返されません #cfunc global JslSetPlayerNumber "JslSetPlayerNumber" int,int //p1:device ID、p2:number、何も返されません
sample1.hsp

#include "JoyShockLibrary.as" mes JslConnectDevices() //この関数でつなげているコントローラー全部をつなげるらしいです mes JslGetControllerColour(0) //コントローラー1の色を取得
色は下のサイトから探してください
https://www.muscle-hypertrophy.com/?p=11810



nennneko5787

リンク

2022/10/22(Sat) 19:23:39|NO.97238

なぜクラッシュするんだ...?
sample2.hsp

#include "JoyShockLibrary.as" ddim a,7 mes JslConnectDevices() //この関数でつなげているコントローラー全部をつなげるらしいです a = JslGetSimpleState(0)
JoyShockLibrary.as

//JoyShockLibraryをHSPで使えるようにするモジュール1 //Note:JslSetCallbackはよくわかりませんでした。 #define JS_TYPE_JOYCON_LEFT 1 #define JS_TYPE_JOYCON_RIGHT 2 #define JS_TYPE_PRO_CONTROLLER 3 #define JS_TYPE_DS4 4 #define JS_TYPE_DS 5 #define JS_SPLIT_TYPE_LEFT 1 #define JS_SPLIT_TYPE_RIGHT 2 #define JS_SPLIT_TYPE_FULL 3 #define JSMASK_UP 0x00001 #define JSMASK_DOWN 0x00002 #define JSMASK_LEFT 0x00004 #define JSMASK_RIGHT 0x00008 #define JSMASK_PLUS 0x00010 #define JSMASK_OPTIONS 0x00010 #define JSMASK_MINUS 0x00020 #define JSMASK_SHARE 0x00020 #define JSMASK_LCLICK 0x00040 #define JSMASK_RCLICK 0x00080 #define JSMASK_L 0x00100 #define JSMASK_R 0x00200 #define JSMASK_ZL 0x00400 #define JSMASK_ZR 0x00800 #define JSMASK_S 0x01000 #define JSMASK_E 0x02000 #define JSMASK_W 0x04000 #define JSMASK_N 0x08000 #define JSMASK_HOME 0x10000 #define JSMASK_PS 0x10000 #define JSMASK_CAPTURE 0x20000 #define JSMASK_TOUCHPAD_CLICK 0x20000 #define JSMASK_MIC 0x40000 #define JSMASK_SL 0x40000 #define JSMASK_SR 0x80000 #define JSOFFSET_UP 0 #define JSOFFSET_DOWN 1 #define JSOFFSET_LEFT 2 #define JSOFFSET_RIGHT 3 #define JSOFFSET_PLUS 4 #define JSOFFSET_OPTIONS 4 #define JSOFFSET_MINUS 5 #define JSOFFSET_SHARE 5 #define JSOFFSET_LCLICK 6 #define JSOFFSET_RCLICK 7 #define JSOFFSET_L 8 #define JSOFFSET_R 9 #define JSOFFSET_ZL 10 #define JSOFFSET_ZR 11 #define JSOFFSET_S 12 #define JSOFFSET_E 13 #define JSOFFSET_W 14 #define JSOFFSET_N 15 #define JSOFFSET_HOME 16 #define JSOFFSET_PS 16 #define JSOFFSET_CAPTURE 17 #define JSOFFSET_TOUCHPAD_CLICK 17 #define JSOFFSET_MIC 18 #define JSOFFSET_SL 18 #define JSOFFSET_SR 19 // PS5 Player maps for the DS Player Lightbar #define DS5_PLAYER_1 4 #define DS5_PLAYER_2 10 #define DS5_PLAYER_3 21 #define DS5_PLAYER_4 27 #define DS5_PLAYER_5 31 #uselib "JoyShockLibrary" #cfunc global JslConnectDevices "JslConnectDevices" //intが返されます #func global JslGetConnectedDeviceHandles "JslGetConnectedDeviceHandles" int,var //varにintが返されます #func global JslDisconnectAndDisposeAll "JslDisconnectAndDisposeAll" //何も返されません #cfunc global JslGetSimpleState "JslGetSimpleState" int //p1:device ID、構造体が返されます #cfunc global JslGetIMUState "JslGetIMUState" int //p1:device ID、構造体が返されます #cfunc global JslGetStickStep "JslGetStickStep" int //p1:device ID、floatが返されます #cfunc global JslGetTriggerStep "JslGetTriggerStep" int //p1:device ID、floatが返されます #cfunc global JslGetPollRate "JslGetPollRate" int //p1:device ID、floatが返されます #func global JslResetContinuousCalibration "JslResetContinuousCalibration" int //p1:device ID、何も返されません #func global JslStartContinuousCalibration "JslStartContinuousCalibration" int //p1:device ID、何も返されません #func global JslPauseContinuousCalibration "JslPauseContinuousCalibration" int //p1:device ID、何も返されません #cfunc global JslGetCalibrationOffset "JslGetCalibrationOffset" int,float,float,float //p1:device ID、p2:xオフセット、p3:yオフセット、p4:zオフセット //#cfunc global JslSetCallback "JslSetCallback" //C++ではEventCallback型(?)のようです #cfunc global JslGetControllerType "JslGetControllerType" int //p1:device ID、intが返されます #cfunc global JslGetControllerSplitType "JslGetControllerSplitType" int //p1:device ID、intが返されます #cfunc global JslGetControllerColour "JslGetControllerColour" int //p1:device ID、intが返されます #func global JslSetLightColour "JslSetLightColour" int,int //p1:device ID、p2:colour、何も返されません #func global JslSetRumble "JslSetRumble" int,int,int //p1:device ID、p2:smallRumble、p3:bigRumble、何も返されません #func global JslSetPlayerNumber "JslSetPlayerNumber" int,int //p1:device ID、p2:number、何も返されません
>>NO.97235
JoyShockLibraryを使えばいけます。



nennneko5787

リンク

2022/10/22(Sat) 19:27:06|NO.97239

訂正させてください

>>NO.97235
JoyShockLibraryを使えばいけます。

>>NO.97235
JoyShockLibraryを使えば(たぶん)いけます。



nennneko5787

リンク

2022/10/22(Sat) 19:35:13|NO.97240

完成(?)
一応ジャイロのテストもしたい。
sample2.hsp

#include "JoyShockLibrary.as" dim a,7 mes JslConnectDevices() //この関数でつなげているコントローラー全部をつなげるらしいです repeat redraw 0 color boxf color 255,255,255 pos 0,0 JslGetSimpleState a,0 mes a(0) redraw 1 await loop
JoyShockLibrary.as

//JoyShockLibraryをHSPで使えるようにするモジュール1 //Note:JslSetCallbackはよくわかりませんでした。 #define JS_TYPE_JOYCON_LEFT 1 #define JS_TYPE_JOYCON_RIGHT 2 #define JS_TYPE_PRO_CONTROLLER 3 #define JS_TYPE_DS4 4 #define JS_TYPE_DS 5 #define JS_SPLIT_TYPE_LEFT 1 #define JS_SPLIT_TYPE_RIGHT 2 #define JS_SPLIT_TYPE_FULL 3 #define JSMASK_UP 0x00001 #define JSMASK_DOWN 0x00002 #define JSMASK_LEFT 0x00004 #define JSMASK_RIGHT 0x00008 #define JSMASK_PLUS 0x00010 #define JSMASK_OPTIONS 0x00010 #define JSMASK_MINUS 0x00020 #define JSMASK_SHARE 0x00020 #define JSMASK_LCLICK 0x00040 #define JSMASK_RCLICK 0x00080 #define JSMASK_L 0x00100 #define JSMASK_R 0x00200 #define JSMASK_ZL 0x00400 #define JSMASK_ZR 0x00800 #define JSMASK_S 0x01000 #define JSMASK_E 0x02000 #define JSMASK_W 0x04000 #define JSMASK_N 0x08000 #define JSMASK_HOME 0x10000 #define JSMASK_PS 0x10000 #define JSMASK_CAPTURE 0x20000 #define JSMASK_TOUCHPAD_CLICK 0x20000 #define JSMASK_MIC 0x40000 #define JSMASK_SL 0x40000 #define JSMASK_SR 0x80000 #define JSOFFSET_UP 0 #define JSOFFSET_DOWN 1 #define JSOFFSET_LEFT 2 #define JSOFFSET_RIGHT 3 #define JSOFFSET_PLUS 4 #define JSOFFSET_OPTIONS 4 #define JSOFFSET_MINUS 5 #define JSOFFSET_SHARE 5 #define JSOFFSET_LCLICK 6 #define JSOFFSET_RCLICK 7 #define JSOFFSET_L 8 #define JSOFFSET_R 9 #define JSOFFSET_ZL 10 #define JSOFFSET_ZR 11 #define JSOFFSET_S 12 #define JSOFFSET_E 13 #define JSOFFSET_W 14 #define JSOFFSET_N 15 #define JSOFFSET_HOME 16 #define JSOFFSET_PS 16 #define JSOFFSET_CAPTURE 17 #define JSOFFSET_TOUCHPAD_CLICK 17 #define JSOFFSET_MIC 18 #define JSOFFSET_SL 18 #define JSOFFSET_SR 19 // PS5 Player maps for the DS Player Lightbar #define DS5_PLAYER_1 4 #define DS5_PLAYER_2 10 #define DS5_PLAYER_3 21 #define DS5_PLAYER_4 27 #define DS5_PLAYER_5 31 #uselib "JoyShockLibrary" #cfunc global JslConnectDevices "JslConnectDevices" //intが返されます #func global JslGetConnectedDeviceHandles "JslGetConnectedDeviceHandles" int,var //varにintが返されます #func global JslDisconnectAndDisposeAll "JslDisconnectAndDisposeAll" //何も返されません #func global JslGetSimpleState "JslGetSimpleState" var,int //p1:device ID、varに構造体が返されます #func global JslGetIMUState "JslGetIMUState" var,int //p1:device ID、varに構造体が返されます #cfunc global JslGetStickStep "JslGetStickStep" int //p1:device ID、floatが返されます #cfunc global JslGetTriggerStep "JslGetTriggerStep" int //p1:device ID、floatが返されます #cfunc global JslGetPollRate "JslGetPollRate" int //p1:device ID、floatが返されます #func global JslResetContinuousCalibration "JslResetContinuousCalibration" int //p1:device ID、何も返されません #func global JslStartContinuousCalibration "JslStartContinuousCalibration" int //p1:device ID、何も返されません #func global JslPauseContinuousCalibration "JslPauseContinuousCalibration" int //p1:device ID、何も返されません #cfunc global JslGetCalibrationOffset "JslGetCalibrationOffset" int,float,float,float //p1:device ID、p2:xオフセット、p3:yオフセット、p4:zオフセット //#cfunc global JslSetCallback "JslSetCallback" //C++ではEventCallback型(?)のようです #cfunc global JslGetControllerType "JslGetControllerType" int //p1:device ID、intが返されます #cfunc global JslGetControllerSplitType "JslGetControllerSplitType" int //p1:device ID、intが返されます #cfunc global JslGetControllerColour "JslGetControllerColour" int //p1:device ID、intが返されます #func global JslSetLightColour "JslSetLightColour" int,int //p1:device ID、p2:colour、何も返されません #func global JslSetRumble "JslSetRumble" int,int,int //p1:device ID、p2:smallRumble、p3:bigRumble、何も返されません #func global JslSetPlayerNumber "JslSetPlayerNumber" int,int //p1:device ID、p2:number、何も返されません



nennneko5787

リンク

2022/10/22(Sat) 19:41:12|NO.97241

>>NO.97235
ジャイロのテストもしてみました。

#include "JoyShockLibrary.as" ddim a,7 dialog JslConnectDevices() //この関数でつなげているコントローラー全部をつなげるらしいです repeat redraw 0 color boxf color 255,255,255 pos 0,0 JslGetIMUState a,0 mes a(0) mes a(1) mes a(2) mes a(3) mes a(4) mes a(5) redraw 1 await loop
JoyShockLibrary.asはさっき(NO.97240)と一緒。



nennneko5787

リンク

2022/10/23(Sun) 07:47:00|NO.97244

完成しました。
ソースコードが長くなってしまったので、Githubで配布します。
https://github.com/nennneko5787/JoyShockLibrary-For-HSP3
沢渡さん、GENKIさん、ありがとうございました。



沢渡

リンク

2022/10/23(Sun) 10:29:55|NO.97245

解決したので、No.97230のコードにあった一寸無駄な部分を修正したものを上げておきます。

/* X-Input対応のジョイスティック状態を取得するモジュール ・joyGetPos_x_initを最初に実行しておく ・joyGetPos_x p1,p2,p3 p1には要素数8の整数配列を、p2にはコントローラーのインデックスを指定する(省略時は0)。 実行後、p1に指定した配列には以下の値が入る。 0 : ジョイスティックに入力があるたびに増加する値 1 : ボタンの入力状態(十字キーの状態もここに入る) 2 : 左アナログボタンの入力状態 3 : 右アナログボタンの入力状態 4 : 左スティックのX軸 5 : 左スティックのY軸 6 : 右スティックのX軸 7 : 右スティックのY軸 p3に0以外の値を指定した場合は、前回実行した時とジョイスティックの状態が変わらないのなら、配列の内容を変更しない。 (省略時は1) */ #uselib "XInputUap.dll" #func global XInputGetState "XInputGetState" int,int #module #deffunc joyGetPos_x_init //これを最初に実行する dim state,4 packet_old=-1 return #define global joyGetPos_x(%1,%2=0,%3=1) _joyGetPos_x %1,%2,%3 #deffunc _joyGetPos_x array out,int port,int flag XInputGetState port,varptr(state) if flag : if state(0)=packet_old : return packet_old=state(0) out(0)=state(0) out(1)=state(1)&0xFFFF out(2)=(state(1)>>16)&0xFF out(3)=(state(1)>>24)&0xFF out(4)=state(2)<<16>>16 out(5)=state(2)>>16 out(6)=state(3)<<16>>16 out(7)=state(3)>>16 return #global joyGetPos_x_init //以下、テスト用プログラム dim data,8 repeat joyGetPos_x data,0 redraw 0 color 255,255,255 : boxf : color 0,0,0 : pos 0,0 repeat 8 : mes data(cnt) : loop redraw 1 await 33 loop



SMOPU

リンク

2022/10/23(Sun) 17:56:29|NO.97247

>NO.97244
このモジュールも振動機能も対応しているんですかね…?



沢渡

リンク

2022/10/24(Mon) 10:57:58|NO.97253

>NO.97247
私は振動機能付きのジョイパッドは持っていないので自分では試せませんが、
資料をもとに振動させる命令を実装してみました。
これで正常に動くでしょうか?

/* X-Input対応のジョイスティック状態を取得するモジュール ・joyGetPos_x_initを最初に実行しておく ・joyGetPos_x p1,p2,p3 p1には要素数8の整数配列を、p2にはコントローラーのインデックスを指定する(省略時は0)。 実行後、p1に指定した配列には以下の値が入る。 0 : ジョイスティックに入力があるたびに増加する値 1 : ボタンの入力状態(十字キーの状態もここに入る) 2 : 左アナログボタンの入力状態 3 : 右アナログボタンの入力状態 4 : 左スティックのX軸 5 : 左スティックのY軸 6 : 右スティックのX軸 7 : 右スティックのY軸 p3に0以外の値を指定した場合は、前回実行した時とジョイスティックの状態が変わらないのなら、配列の内容を変更しない。 (省略時は1) ・joyVibration_x p1,p2,p3 (この命令は当方にはテストできる環境がありません。以下、期待される動作です) ジョイスティックを振動させる。 p1にはコントローラーのインデックスを指定する(省略時は0)。 p2には左モーター、p3には右モーターの振動速度を0〜65535で指定する。いずれも省略時は0。 p2とp3に0を指定すると(もしくは省略すると)振動が止まる。 ・joyDisable_x X-Input対応のジョイスティックの入出力を一時的に無効にする。振動も止まる。 ・joyEnable_x joyDisable_xで無効にしたX-Input対応のジョイスティックの入出力を再開する。 */ #uselib "XInputUap.dll" #func global XInputGetState "XInputGetState" int,int #func global XInputSetState "XInputSetState" int,int #func global XInputEnable "XInputEnable" int #module #deffunc joyGetPos_x_init //これを最初に実行する dim state,4 packet_old=-1 vibration=0 return #define global joyGetPos_x(%1,%2=0,%3=1) _joyGetPos_x %1,%2,%3 #deffunc _joyGetPos_x array out,int port,int flag XInputGetState port,varptr(state) if flag : if state(0)=packet_old : return packet_old=state(0) out(0)=state(0) out(1)=state(1)&0xFFFF out(2)=(state(1)>>16)&0xFF out(3)=(state(1)>>24)&0xFF out(4)=state(2)<<16>>16 out(5)=state(2)>>16 out(6)=state(3)<<16>>16 out(7)=state(3)>>16 return #define global joyVibration_x(%1=0,%2=0,%3=0) _joyVibration_x %1,%2,%3 #deffunc _joyVibration_x int vport,int left,int right vibration=(right<<16)|left XInputSetState vport,varptr(vibration) return #deffunc joyDisable_x onexit XInputEnable 0 return #define global joyEnable_x XInputEnable 1 #global joyGetPos_x_init joyVibration_x 0,30000,30000 //振動機能付きジョイパッドならこれで振動する…かもしれない? await 3000 joyVibration_x 0 //これで振動が止まる…かもしれない? /* dim data,8 repeat joyGetPos_x data,0 redraw 0 color 255,255,255 : boxf : color 0,0,0 : pos 0,0 repeat 8 : mes data(cnt) : loop redraw 1 await 33 loop */



沢渡

リンク

2022/10/24(Mon) 11:21:27|NO.97254

追記です。
すみません、joyDisable_xとjoyEnable_xを試してみましたが、コメントに書いたような効果は
発生しませんね。
(APIのXInputEnableを実行するための命令として作りましたが。
 XInputEnableでググると詳しい情報が出てきます)
ただ、振動機能を使う場合、最終的に「XInputEnable 0」は実行する必要があるようなので、
onexitでjoyDisable_xを自動実行するようにしています。



usagi

リンク

2022/10/24(Mon) 18:15:57|NO.97256

>沢渡さん
ライブラリの問題ですかね。。。
私の環境(Win10, 360コントローラ)では1_4の方使ったら振動しました。
※Uap.dllだと、ERROR_DEVICE_NOT_CONNECTED 9_1_0.dllだと落ちる。


;#uselib "XInputUap.dll" #uselib "Xinput1_4.dll"



usagi

リンク

2022/10/24(Mon) 18:56:45|NO.97257

※追記※ 以下で動作確認

#uselib "Xinput1_4.dll" #func global XInputGetState "XInputGetState" int,int #func global XInputSetState "XInputSetState" int,int #func global XInputEnable "XInputEnable" int onexit *EXIT *MAIN state = 0,0,0,0 XInputGetState port,varptr(state) lt = (state(1)>>16)&0xFF rt = (state(1)>>24)&0xFF vibration = (rt*255<<16) | lt*255 XInputSetState vport,varptr(vibration) title strf("LeftTrigger: %d, RightTrigger: %d", lt, rt) await 33 goto *MAIN *EXIT XInputEnable 0 : end
Mcrosftのマニュアル見てみるとuap.dllはサポートされてないようですね。
https://learn.microsoft.com/ja-jp/windows/win32/api/xinput/nf-xinput-xinputsetstate
※要件[Dll}の所にuap.dllがGetStateはあるけどSetStateにはありませんでした。



沢渡

リンク

2022/10/24(Mon) 20:32:56|NO.97259

>usagiさん
動作確認ありがとうございます。
>Mcrosftのマニュアル見てみるとuap.dllはサポートされてないようですね。
特段HSPでのエラーは起きなかったのでuap.dllでも行けるのかなと思ったのですが、駄目でしたか。
改善ありがとうございました。



nennneko5787

リンク

2022/10/25(Tue) 13:26:53|NO.97260

>>NO.97244
JoyShockLibraryでサポートしているのはDualShock4とDualSenseの振動のみのようです。
ライブラリ自体も今年の4月から更新が止まってますね...



GENKI

リンク

2022/10/30(Sun) 00:07:53|NO.97276

>> NO.97244 nennneko5787さん

ありがたく試させていただきました。
センサー フュージョンの計算結果が取得できるのが素晴らしい。
DUALSHOCK4で動作確認しました。float型なのが厄介ですね。


#include "JoyShockLibrary.as" ; ########################################################## ; float for HSP モジュール ; http://spn.php.xdomain.jp/hsp_koneta3.htm #module #defcfunc todouble int p1 temp = 0.0 lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000) lpoke temp, 0, p1 << 29 return temp #defcfunc tofloat double p1 temp = p1 return lpeek(temp)>>29&7|(p1<0)<<31|lpeek(temp,4)-(p1!0)*0x38000000<<3 #global ; ########################################################## ; デバイスの種類名称リスト sdim nameControllerTypeList, 64, 6 nameControllerTypeList(0) = "不明" nameControllerTypeList(1) = "Joy-Con(L)" nameControllerTypeList(2) = "Joy-Con(R)" nameControllerTypeList(3) = "Switch Proコントローラー" nameControllerTypeList(4) = "DUALSHOCK 4" nameControllerTypeList(5) = "DualSense" screen 0, 640, 600 ; PCに接続されているデバイスと接続 numConnectJoystick = JslConnectDevices() ; デバイスの種類 dim type, numConnectJoystick ; コントローラの色を取得 dim colorJoy, numConnectJoystick ; ハーフ コントローラー?フル コントローラー? dim typeJoySplitType, numConnectJoystick ; 構造体 ; DLLから結果を取得する際に使用します。 dim joy_shock_state, 7 dim imu_state, 6 dim motion_state, 10 dim touch_state, 7 ; デバイスの状態を取得・設定 ; これらは、メインループ内に入れるとフリーズすることがあるようです。 randomize repeat numConnectJoystick id = cnt ; デバイスの種類を取得 type(id) = JslGetControllerType(id) ; デバイスの分割タイプ ;ハーフ コントローラー?フル コントローラー? typeJoySplitType(id) = JslGetControllerSplitType(id) ; コントローラの色を取得 ; Nintendoデバイスの場合は、色を取得できます。 ; その他の場合は、白(0xFFFFFF)を返します。 if ( type(id) >= 1 ) & ( type(id) <= 3 ) { colorJoy(id) = JslGetControllerColour(id) } ; ライトの色を設定 ; DUALSHOCK 4/DualSenseの場合は、ライトの色を取得できます。 if ( type(id) = JS_TYPE_DS4 ) | ( type(id) = JS_TYPE_DS ) { colorJoy(id) = (rnd(256)<<16) | (rnd(256)<<8) | rnd(256) ;colorJoy(id) = 0x000000 ; 消灯 ;colorJoy(id) = 0xFFFFFF ; 点灯(白) JslSetLightColour id, colorJoy(id) } loop *main redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0 mes "接続されている対応デバイス数:" + numConnectJoystick repeat numConnectJoystick pos 400*cnt, 30 id = cnt mes "デバイスID:" + id mes "タイプ:" + nameControllerTypeList( type(id) ) ; 分割タイプ if typeJoySplitType(id) = 0 : mes "分割 :不明" if typeJoySplitType(id) = 1 : mes "分割 :左半分" if typeJoySplitType(id) = 2 : mes "分割 :右半分" if typeJoySplitType(id) = 3 : mes "分割 :フルコントローラー" ; 色 x = ginfo_cx y = ginfo_cy mes "色  :" + strf( "0x%06X", colorJoy(id) ) rgbcolor colorJoy(id) boxf x + 140, y, x + 170, y + 18 color ; コントローラーの最新のボタン + トリガー + スティック状態を取得 JslGetSimpleState joy_shock_state, id mes strf( "ボタンの状態:0x%08X", joy_shock_state(id) ) s = "" if joy_shock_state(id) & JSMASK_UP : s+= "↑ " if joy_shock_state(id) & JSMASK_DOWN : s+= "↓ " if joy_shock_state(id) & JSMASK_LEFT : s+= "← " if joy_shock_state(id) & JSMASK_RIGHT : s+= "→ " if joy_shock_state(id) & JSMASK_PLUS : s+= "+/Options " if joy_shock_state(id) & JSMASK_MINUS : s+= "-/Share " if joy_shock_state(id) & JSMASK_LCLICK : s+= "left-stickクリック/L3 " if joy_shock_state(id) & JSMASK_RCLICK : s+= "right-stickクリック/R3 " if joy_shock_state(id) & JSMASK_L : s+= "L/L1 " if joy_shock_state(id) & JSMASK_R : s+= "R/R1 " if joy_shock_state(id) & JSMASK_ZL : s+= "ZL/L2 " if joy_shock_state(id) & JSMASK_ZR : s+= "ZR/R2 " if joy_shock_state(id) & JSMASK_S : s+= "南面ボタン: B/⨉ " if joy_shock_state(id) & JSMASK_E : s+= "東面ボタン: A/○ " if joy_shock_state(id) & JSMASK_W : s+= "西面ボタン: Y/□ " if joy_shock_state(id) & JSMASK_N : s+= "北面ボタン: X/△ " if joy_shock_state(id) & JSMASK_HOME : s+= "Home/PS " if joy_shock_state(id) & JSMASK_CAPTURE : s+= "Capture/touchpadクリック/Create " if joy_shock_state(id) & JSMASK_SL : s+= "SL//Mic " if joy_shock_state(id) & JSMASK_SR : s+= "SR " mes s ; 実数値 ; float型なので、double型に変換してから使用します。 mes "左トリガー :" + todouble( joy_shock_state(1) ) mes "右トリガー :" + todouble( joy_shock_state(2) ) mes "左スティック:" + todouble( joy_shock_state(3) ) + ", " + todouble( joy_shock_state(4) ) mes "右スティック:" + todouble( joy_shock_state(5) ) + ", " + todouble( joy_shock_state(6) ) ; 加速度センサーとジャイロスコープ mes "---加速度センサーとジャイロスコープ---" JslGetIMUState imu_state, id mes "加速度 :" + strf("%f, %f, %f", todouble(imu_state(0)), todouble(imu_state(1)), todouble(imu_state(2))) mes "ジャイロ:" + strf("%f, %f, %f", todouble(imu_state(3)), todouble(imu_state(4)), todouble(imu_state(5))) ; デバイスの向き ; センサー フュージョン ソリューションを使用して計算された結果を取得します。 JslGetMotionState motion_state, id mes "---デバイスの向き---" mes "クォータニオン :" + strf("%f, %f, %f, %f", todouble(motion_state(0)), todouble(motion_state(1)), todouble(motion_state(2)), todouble(motion_state(3)) ) mes "ローカル加速度 :" + strf("%f, %f, %f" , todouble(motion_state(4)), todouble(motion_state(5)), todouble(motion_state(6)) ) mes "ローカル重力方向:" + strf("%f, %f, %f" , todouble(motion_state(7)), todouble(motion_state(8)), todouble(motion_state(9)) ) ; タッチパッド if ( type(id) = JS_TYPE_DS4 ) | ( type(id) = JS_TYPE_DS ) { mes "---タッチパッドの状態---" JslGetTouchState touch_state, id mes "t0 タッチID " + touch_state(0) ; 0〜127 mes "t1 タッチID " + touch_state(1) mes "t0 タッチ状態 " + (touch_state(2) &1) ; 0, 1 mes "t1 タッチ状態 " + (touch_state(2)>>8&1) mes "t0 X,Y " + strf( "%f, %f", todouble(touch_state(3)), todouble(touch_state(4)) ) mes "t1 X,Y " + strf( "%f, %f", todouble(touch_state(5)), todouble(touch_state(6)) ) } mes "アナログスティックの最小のステップ サイズ  :" + todouble( JslGetStickStep(id) ) mes "トリガー     の最小のステップ サイズ  :" + todouble( JslGetTriggerStep(id) ) mes "1 秒あたりの何回レポートを返す速度(予測値) :" + todouble( JslGetPollRate(id) ) ; 振動 ; 長時間使用するとフリーズするようです。 ; しばらく放置すると復旧します。 ; 使わなくても稀にフリーズを引き起こす事があるようです。 sr = limit( todouble( joy_shock_state(1) ) * 256.0, 0, 255 ) br = limit( todouble( joy_shock_state(2) ) * 256.0, 0, 255 ) mes "振動小:" + sr mes "振動大:" + br JslSetRumble id, sr, br loop ; id goto *main



nennneko5787

リンク

2022/10/30(Sun) 10:21:51|NO.97279

>>NO.97276
ご使用いただきありがとうございます。

【JoyShockLibraryの厄介なところ】
NO.97260に書いた通り、振動に対応しているのはDualShock4とDualSenseだけなので
このライブラリで振動対応のゲームを作ろうとするとJoy-Conの人とProコンの人が困惑します。
なので今私はHD振動に対応できるように頑張っています



GENKI

リンク

2023/1/9(Mon) 01:10:38|NO.97678

このスレッドのお陰で、このようなものを作成することができましたので、感謝を込めてご報告
JoyShockLibraryは、振動以外はとても優秀です。

JoyShockLibrary for HSP3
https://mclab.uunyan.com/dl/dl58.htm
HSP3で使う際の面倒な部分をだいたいなくせたと思います。



HD振動…あれはちょっと、いやだいぶ特殊。がんばってください。



MIZUSHIKI

リンク

2023/1/11(Wed) 23:43:57|NO.97687

>nennneko5787 さん
>GENKI さん

JoyShockLibrary に NintendoSwitchデバイスのHD振動機能を追加してみました。

GitHub (MIZUSHIKI/JoyShockLibrary-plus-HDRumble)
https://github.com/MIZUSHIKI/JoyShockLibrary-plus-HDRumble

Releasesページからzipファイルをダウンロードし、中の x86/JoyShockLibrary.dll で差し替えて使用すれば Joyコン/PROコン を振動させられるようになるはずです。
https://github.com/MIZUSHIKI/JoyShockLibrary-plus-HDRumble/releases

下記命令を追加しています。

・void JslSetHDRumble(int deviceId, float LowFrequency, float LowAmplitude, float HighFrequency, float HighAmplitude) ・void JslSetHDRumbleLR(int deviceId, float LowFrequency_L, float LowAmplitude_L, float HighFrequency_L, float HighAmplitude_L, float LowFrequency_R, float LowAmplitude_R, float HighFrequency_R, float HighAmplitude_R) Frequency(周波数): Low 41〜626[Hz], High 82〜1252[Hz] Amplitude(大きさ): 0.0〜1.0
ただし、このHD振動は1回の命令につき約1秒間の振動しかできないようです。(仕様?)
連続で鳴らしたい場合は、途切れる前に再度命令をする必要があります。
(ちょっとだけ鳴らしたい場合は、すぐに振動の大きさを0にしてください。)

また、Joyコン/PROコン にはHD振動しかさせられないので、良い感じの振動をさせようと思ったらパラメータを上手く調整してあげなければいけません。
他のコントローラの振動と聞き比べて同じになるように調整したパラメータを基本の振動と出来ればよさそうですね。

以下、GENKIさんの JoyShockLibrary for HSP3 を使った例で振動確認用のサンプルです。

#include "JoyShockLibrary.hsp" #func JslSetHDRumble "JslSetHDRumble" int,float,float,float,float #func JslSetHDRumbleLR "JslSetHDRumbleLR" int,float,float,float,float,float,float,float,float ; 接続されているコントローラーデバイスを接続して、接続数を取得 numConnectJoystick = JslConnectDevices() if numConnectJoystick { mes "" + numConnectJoystick + " 台のデバイスが見つかりました。" } else { mes "対応デバイスが見つかりませんでした。" } ; デバイスID deviceId = 0 mes "デバイスID:" + deviceId ; 振動テスト開始 mes "振動テスト" JslSetHDRumble deviceId, 100, 0.5, 900, 0.7 wait 20 JslSetHDRumble deviceId, 0,0,0,0 ; トラックバー設置 lf=160 : la=0.5 : hf=320 : ha=0.5 mes "Low (周波数 / 大きさ): ",1 winobj "msctls_trackbar32", "", , $50000000, 200, 25 hTrackbar.0 = objinfo(stat, 2) sendmsg hTrackbar.0, $405, 1, 20 pos ginfo_cx+200,ginfo_cy-25 winobj "msctls_trackbar32", "", , $50000000, 200, 25 hTrackbar.1 = objinfo(stat, 2) sendmsg hTrackbar.1, $405, 1, 50 pos 0, mes "High (周波数 / 大きさ): ",1 winobj "msctls_trackbar32", "", , $50000000, 200, 25 hTrackbar.2 = objinfo(stat, 2) sendmsg hTrackbar.2, $405, 1, 20 pos ginfo_cx+200,ginfo_cy-25 winobj "msctls_trackbar32", "", , $50000000, 200, 25 hTrackbar.3 = objinfo(stat, 2) sendmsg hTrackbar.3, $405, 1, 50 pos 0, oncmd gosub *vscroll, $114 mes "1度の命令で約1秒間 振動します。" mes "連続して振動させたいときは、途切れる前に再度命令する必要があります。" mes "(Switchデバイスの仕様?)" stop *vscroll id = -1 switch lparam case hTrackbar.0 : id=0 sendmsg hTrackbar.id, $400 lf = stat*(626-41)/100 +41 swbreak case hTrackbar.1 : id=1 sendmsg hTrackbar.id, $400 la = 1.0*stat/100 swbreak case hTrackbar.2 : id=2 sendmsg hTrackbar.id, $400 hf = stat*(1252-82)/100 +82 swbreak case hTrackbar.3 : id=3 sendmsg hTrackbar.id, $400 ha = 1.0*stat/100 swbreak swend if id == -1 :return title strf("%d, %f - %d, %f",lf,la,hf,ha) JslSetHDRumble deviceId, lf,la,hf,ha return



zrs90(5さい)

リンク

2023/1/12(Thu) 21:29:59|NO.97690

スイッチの joyコンとproコン の「振動」このライブラリから
出来るようになったんですか?凄い。使ってみたい!

●joycon を unity で振動可能に[c#]

https://baba-s.hatenablog.com/entry/2017/11/12/090000

...と言う記事があったので「振動」は少し期待してましたが
「HD振動」については、ネットで記事見つけられませんでした。



後、ご存知の方が見えたら質問したかったのですが

ゲーム機本体無しで、別売りの proコンを買って
hsp3 から動かすのは可能なんでしょうか?
(※地元の電気屋では未だに入手困難...)



GENKI

リンク

2023/1/13(Fri) 01:36:30|NO.97696

> ゲーム機本体無しで、別売りの proコンを買って

PCに繋ぐと市販のゲームコントローラーとして認識されます。
つなぎ方は「proコントローラー PCへのつなぎ方」で探すといいです。接続操作にゲーム機本体は不要です。
(と書いたものの、Proコン、ジョイコンは持ってないので保証はできない。)


> hsp3 から動かすのは可能なんでしょうか?

このスレでのやり取りの通り、JoyShockLibrary を使えばボタン入力の取得やHD振動で動かすことも可能です。
あれそういえば、結局mod_joystickでは取得できない問題は解決していなかったのか。



ONION software Copyright 1997-2021(c) All rights reserved.