sample\sample_gamepad\
sample05_gamepad.hsp
#include "hsp3dish.as"
#include "ezlocal-dish-js.hsp"
ezLocalJS
#include "mod_dish-js-gamepad.hsp"
#packopt xsize 1040
#packopt ysize 480
;
; HSPTV!掲示板「d3moduleで一人称視点ゲームが作りたい」内
; - 法貴優雅 氏 サンプルスクリプト // thanks!
; https://hsp.tv/play/pforum.php?mode=pastwch&num=81890#81895
;
; HSP3Dish.jsで動作するように改造
; jsでゲームパッドを使用するモジュールのサンプル
;
#include "d3m.hsp"
#const MV 0.5 // 移動速度
// スクリーンサイズ
sx = 1040
sy = 480
// 画面中心座標
scx = sx / 2
scy = sy / 2
// 設置する箱の位置情報(てきとー)
bx = 240, 160, 80, 40, -60, -90, -120, -200
by = 200, -80, 40, -120, 120, -80, 20, -160
bs = 10 // 箱のサイズ
// スクリーン設定
screen 0, sx, sy, 0
title "ゲームパッド接続サンプル"
mouse ginfo_wx1 + frmx + scx, ginfo_wy1 + frmy + scy
// カメラの初期設定
ch = 0.0 // カメラ水平角度
cv = 0.0 // カメラ垂直向き
cx = 0.0 // カメラ位置
cy = 0.0
cz = 10.0
clx = 0.0 // カメラターゲット位置
cly = 0.0
clz = 0.0
gosub *updatecam
bt_BAYX = 0 // A⇔B, X⇔Y ボタンの入れ替え設定
cam_UD = 1.0 : cam_LR = 1.0 // カメラリバース設定
*main
// 動作処理
stick stk, $3C00F ; 上下左右,WASDキーを非トリガー設定
JspadStick jspstk, $3C00F ; 上下左右ボタン,Lスティック移動を非トリガー設定
stk |= jspstk ; ゲームパッドのボタン状態をstickのキー状態に被せ合わせられる
; - 被せ合わせてますが、このサンプルではゲームパッド,キーボードマウスどちらでも対応というところまでは作り込んでません
// ESC
if stk & $00080 :end
cm = 0 // カメラ移動フラグ
// 前進後退は同時押しさせない
if stk & $08000 { // W
cm += 8
}else : if stk & $20000 { // S
cm += 1
}
// 左移動右移動は同時押しさせない
if stk & $04000 { // A
cm += 2
}else : if stk & $10000 { // D
cm += 4
}
// ダッシュ
if stk & $01000000 : dash ^= 1 : squat = 0 ; Lスティック押し込み [JspadStick独自拡張]
// しゃがみ [スペースキー]
if stk & $00000010 : squat ^= 1 : dash = 0 ; 東ボタン: A(N)、○(DS4)、B(MS)
// ジャンプ [Ctrlキー]
if jumpCounter > 0 : jumpCounter++
if stk & $00000040 : if jumpCounter==0 : jumpCounter = 1 : squat = 0 ; 南ボタン: B(N)、×(DS4)、A(MS)
// 弾 [左クリック]
if stk & $00100 { ; ZRボタン
repeat length(bulletCounters)+1
// 重なり順を気にしなくていいので空いてる所にテキトーに代入
if cnt >= length(bulletCounters) : bulletCounters(cnt) = 10 : break
if bulletCounters(cnt) == 0 : bulletCounters(cnt) = 10 : break
loop
needDrawBullet = 1
}
// カメラリバース設定 [Enter]
if stk & $00020 { ; PLUSボタン
camera++ : camera \= 4
switch camera
case 0: cam_UD= 1.0:cam_LR= 1.0 :swbreak
case 1: cam_UD=-1.0:cam_LR= 1.0 :swbreak
case 2: cam_UD=-1.0:cam_LR=-1.0 :swbreak
case 3: cam_UD= 1.0:cam_LR=-1.0 :swbreak
swend
}
// A⇔B,X⇔Yボタン入れ替え設定
if stk & $04000000 : bt_BAYX ^= 1 : JspadSetBAYX bt_BAYX ; HOMEボタン [JspadStick独自拡張]
//カメラの状態を更新
gosub *updatecam
// 描画処理
redraw 0
// 画面クリア
color 255, 255, 255 : boxf
// 床描画
color 0, 192, 0
repeat 32
d3line 256, 256 - (cnt * 16), 0, -256, 256 - (cnt * 16), 0
d3line 256 - (cnt * 16), 256, 0, 256 - (cnt * 16), -256, 0
loop
// 箱描画
color 0, 0, 255
repeat 8
d3box bx(cnt), by(cnt), 0, bx(cnt) + bs, by(cnt) + bs, bs
loop
// 弾描画
gmode 3,,,128
color 255, 255, 0
if needDrawBullet {
needDrawBullet = 0
foreach bulletCounters
if bulletCounters(cnt) > 0 {
bulletCounters(cnt)--
L = 7*bulletCounters(cnt)*bulletCounters(cnt)
a = scx-L, scx+L, scx+L, scx-L : b = scy-L, scy-L, scy+L, scy+L
gsquare -1, a, b
needDrawBullet = 1
}
loop
}
// サイト描画
color 255, 0, 0
line scx - 8, scy, scx + 8, scy
line scx, scy - 8, scx, scy + 8
// フレームレート表示
color 0, 0, 0
gfilter 1
pos 50, 0:mes "fps:" + d3getfps()
mes "stick="+stk
idstr = JspadGetID() :if idstr=="": idstr = "[ゲームパッドを接続してください]"
mes "ID="+idstr
mes "GetButtons="+JspadGetButtons()
mes "dash="+dash
mes "squat="+squat
mes "jump="+jumpCounter
mes "BtnBAYX="+bt_BAYX
mes "CamType="+camera
gfilter 0
redraw 1
await (1000 / 60) // fps60位のウェイト
goto *main
// カメラ更新
*updatecam
// カメラ位置の更新
if (cm > 0) {
// 移動してる場合だけ更新
fdir = ch
_MV = MV * (10 + (11*dash)) * (10 - (3*squat)) / 100 ; 速度補正
switch (cm)
case 8 // 前
fmv = _MV
swbreak
case 1 // 後
fmv = -_MV
swbreak
case 2 // 左
fmv = _MV
fdir = ch - 1.5707
swbreak
case 4 // 右
fmv = -_MV
fdir = ch - 1.5707
swbreak
case 10 // 右前
fmv = _MV
fdir = ch - 0.7853
swbreak
case 12 // 左前
fmv = -_MV
fdir = ch - 2.356
swbreak
case 3: // 右後
fmv = _MV
fdir = ch - 2.356
swbreak
case 5: // 左後
fmv = -_MV
fdir = ch - 0.7853
swbreak
swend
fx = sin(fdir)
fy = cos(fdir)
fz = 1.0
// 正規化
len = sqrt((fx * fx) + (fy * fy) + (fz * fz))
if (len != 0.0) {
fx /= len
fy /= len
fz /= len
}
// カメラ移動
fx *= fmv
cx += fx
fy *= fmv
cy += fy
}
// カメラ視点の更新
// LookAtカメラしかないみたいなので、ターゲット位置を算出する
fx = cam_LR * JspadGetRightX() * 20.0
fy = cam_UD * JspadGetRightY() * 20.0
ch += fx / 500.0
cv -= fy / 100.0
// リミッター
if ch < -6.2832:ch += 6.2832
if ch > 6.2832:ch -= 6.2832
if cv < -10.0:cv = -10.0
if cv > 10.0:cv = 10.0
// 水平方向のベクトルを算出する
fx = sin(ch)
fy = cos(ch)
fz = 1.0
// 正規化
len = sqrt((fx * fx) + (fy * fy) + (fz * fz))
if len != 0.0 {
fx /= len
fy /= len
fz /= len
}
clx = cx + (fx * 10)
cly = cy + (fy * 10)
clz = cz + cv
czJump = 0
if jumpCounter > 0 : czJump = int(15.0 * sin(0.1*jumpCounter)) : if czJump < 0 : czJump = 0 : jumpCounter = 0
// カメラ更新
d3setcam cx, cy, cz - squat*(cz/2) + czJump, clx, cly, clz - squat*(cz/2) + czJump, 1.0
return