>> nennneko5787 さん
ありがとうございます。
ProコンはPCにUSB接続すると普通のゲームコントローラーとして使えないという記事は目にしますが、DLL経由で値は取得出来るんですね。
そういえば、自分の環境を言ってなかった。我が家のDualshock4は、Bluetooth接続で値の取得と振動、全ても題なく動いています。
さてところで、Dualshock4で何かできないかと思い、タッチパッドをマウス代わりにするツール作ってみました。
Dualshock4かDualSenseお持ちの方は、遊んでみてください。
次の操作が可能です。
・スワイプ :マウスの移動
・タップ :左クリック
・ダブルタップ :ダブルクリック
・2本指スワイプ :ホイール回転
;
; Dualshock4, Dualsense のタッチパッドをマウス代わりにするサンプル
;
; 簡易実装なので、あまり複雑な操作はできません。
;
;完全なタッチ操作を行うためには、InjectTouchInput関数を使用するといいようです。
;
#include "user32.as"
#include "JoyShockLibrary.hsp"
; JslGetSimple
buttonJs = 0
ddim analogJs, 6
; JslGetTouch
dim touchId, 2
dim touchDown, 2
ddim touchX, 2
ddim touchY, 2
dim touchDown0, 2
; タッチパッドのサイズ x,y
dim sizeTouch, 2, numConnectJoystick
; 接続されているコントローラーデバイスを接続して、接続数を取得
numConnectJoystick = JslConnectDevices()
; デバイスの性能を取得
repeat numConnectJoystick
deviceId = cnt
; タッチパッドのサイズ
if JslGetTouchpadDimension(deviceId, x, y) {
sizeTouch(0,deviceId) = x, y
}
loop
cntFrm = 0
touchDown_time = -1
isDblTouch = 0
*main
redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0
if numConnectJoystick > 0 {
deviceId = 0
;-----------------------------
; 入力を取得
;-----------------------------
; ボタン
buttonJs0 = buttonJs
JslGetSimple deviceId, buttonJs, analogJs
; タッチパッド
touchDown0(0) = touchDown(0), touchDown(1)
JslGetTouch deviceId, touchId, touchDown, touchX, touchY
; タッチ座標をタッチパッドの解像度に合わせる
touchPX0_0 = touchPX0
touchPY0_0 = touchPY0
touchPX0 = touchX(0) * sizeTouch(0,deviceId)
touchPY0 = touchY(0) * sizeTouch(1,deviceId)
; 2点押し
isDblTouch0 = isDblTouch
if touchDown(0) & touchDown(1) = 1 {
isDblTouch = 1
} else {
isDblTouch = 0
}
; 押してる時間を計測
if (touchDown0(0) = 0) & (touchDown(0) = 1) {
touchDown_time = 0
}
if touchDown(0) {
touchDown_time++
}
;-----------------------------
; マウス操作
;-----------------------------
; 押下操作
if ((buttonJs0 & JSMASK_CAPTURE) = 0) & ((buttonJs & JSMASK_CAPTURE) ! 0) {
if touchX(0) <= 0.5 {
; 左ボタンダウン
mouse_event $2, 0, 0, 0, 0
} else {
; 右ボタンダウン
mouse_event $8, 0, 0, 0, 0
}
}
; アップ操作
if ((buttonJs0 & JSMASK_CAPTURE) ! 0) & ((buttonJs & JSMASK_CAPTURE) = 0) {
if touchX(0) <= 0.5 {
; 左ボタンアップ
mouse_event $4, 0, 0, 0, 0
} else {
; 右ボタンアップ
mouse_event $10, 0, 0, 0, 0
}
}
; 左クリック
; 押している時間を使って判定しています。
taptip = 8
if (touchDown0(0) = 1) & (touchDown(0) = 0) {
if touchDown_time <= taptip {
mouse_event $6, 0, 0, 0, 0 ; 左クリック
touchDown_time = -1
}
}
; カーソル移動・ホイール回転
if touchDown(0) {
; タッチ中の指の本数で動作を変更しています。
if isDblTouch {
; ホイール回転
if isDblTouch0(0) = 0 {
; 始点
touchPX0_0 = touchPX0
touchPY0_0 = touchPY0
}
z = 0.3 ; 移動倍率
h = int((touchPY0 - touchPY0_0) * z)
mouse_event $800, 0, 0, h, 0
} else {
; カーソル移動
if touchDown0(0) = 0 {
; 始点
touchPX0_0 = touchPX0
touchPY0_0 = touchPY0
}
z = 0.3 ; 移動倍率
x = int((touchPX0 - touchPX0_0) * z)
y = int((touchPY0 - touchPY0_0) * z)
mouse_event $1, x, y, 0, 0
mes ""+x+ " "+y
}
}
}
cntFrm++
goto *main
これだけならDS4Windowsで同じことができます。
しかし自作できるということは、思いつきを形にできます。例えばAC持ちや、ジョイコンのように90回して持つ場合に対応したタッチパッドも実装出来るわけです。
せっかくHSPなのでこういうゲーム用途でも活用されるといいな、などと考えています。