sample\sample_devmotion\
sample11_sunadokei.hsp
#include "hsp3dish.as"
#include "ezlocal-dish-js.hsp"
ezLocalJS
#include "mod_dish-js-devmotion.hsp"
debug = 0 // デバッグモード
#const GR_KABE 1
#const GR_SUNA 2
#const GR_HANTEI_UE 4
#const GR_HANTEI_SHITA 8
;
; OBAQ 砂時計
; デバイスに合わせて砂の落下向き(重力)変更
;
title "OBAQ 砂時計"
qreset ; OBAQの初期化
frame = 0
num_suna = 0
// デバイスモーション値の取得開始
JsdevmStart
; - iOSの場合は、ユーザーに画面をタップして貰ってデバイスモーションのアクセス許可(パーミッション)を取得する必要があります。
; - jsdevm_allowed で既に許可済みか確認できますが、#include直後はまだ判定できず jsdevm_allowed に値が反映されません。
; iOS向けに「画面をタップしてください」等の注記を書く場合は、jsdevm_allowed が「1」になったら消してください。
// 砂粒の生成
x = 10 : y = 10
repeat 9
y+ = 4 : x = 10
repeat 40
x += 2
qaddpoly id, 5, x,y,0 ,1.8,1.8,0, GR_SUNA ; 多角形(砂粒)を追加
qmat id, mat_wire, $DDDDFF
qdamper id, 0.2, 1.0 ; 吸振設定
num_suna++
loop
loop
maxNum_suna = num_suna
// 外壁
qborder -57,-95,57,95
// 砂時計壁面
model = 0.0,0.0, -1.0,-10.0, -58.0,-50.0, -58.0,50.0, -1.0,10.0
qaddmodel id, model,-1, 60,100,0, 1,1,0, GR_KABE
qtype id, type_bind
qmat id, mat_wire, $555588
// 壁の座標を180度回転(Y軸反転だと頂点が左回りにならない)
repeat length(model)/2
model(cnt*2) = -model(cnt*2)
model(cnt*2+1) = -model(cnt*2+1)
loop
qaddmodel id,model,-1, 60,100,0,1,1,0, GR_KABE
qtype id, type_bind
qmat id, mat_wire, $555588
// 中央判定用オブジェクト
qaddpoly id_hantei_ue, 4, 60.0,100.0-7.5,0 ,8.0,8.0, 0, GR_HANTEI_UE, GR_SUNA, GR_SUNA ; 多角形を追加
qtype id_hantei_ue, type_bind
qaddpoly id_hantei_shita, 4, 60.0,100.0+7.5,0 ,8.0,8.0, 0, GR_HANTEI_SHITA, GR_SUNA, GR_SUNA ; 多角形を追加
qtype id_hantei_shita, type_bind
// 重力設定
gravity_x = 0.0
gravity_y = 0.006
qgravity gravity_x, gravity_y
*main
redraw 0
gradf ,,,,1,0,128 ; 画面クリア
if debug {
getreq systime, SYSREQ_TIMER
}
// デバイス向きで重力の方向を調整
if jsdevm_allowed {
if gmuki == 0 { ; iOS, Android, PC の中でiOSだけ数値の+−が反対 : 許可ボタンを押したときの向きで判定してみる
; - dishjs_devtype()でもデバイス判定できます。[ezlocal-dish-js追加命令]
if absf(jsdevm_accel_gy) > 0.01 {
if jsdevm_accel_gy < 0 : gmuki = 1 : else : gmuki = -1
}
}
gravity_x = jsdevm_accel_gx / 1000.0 * gmuki
gravity_y = jsdevm_accel_gy / -1000.0 * gmuki
qgravity gravity_x, gravity_y ; 重力設定
}
// 砂粒の移動
if (frame\12) == 0 {
_num_suna = num_suna
// 下側への砂粒移動
if gravity_y >= 0.006 { ; ある程度垂直にしないと通さない
qcollision id_hantei_ue ; 中央判定用オブジェクトと接触している砂粒を検索
qy = -9999 : qid = -1 ; 一番中央に近い砂粒を見つけるため位置Yを記憶
repeat
qgetcol getvid, getvx, getvy ; 砂粒(id,x,y)
if getvid == -1 : break
if qy >= getvy : continue
qid = getvid : qx = getvx : qy = getvy ; 記憶
loop
if qid != -1 { ; 一番中央に近い砂粒を反対側へ移動
qpos qid, 60.0, 110.0
qspeed qid, 0.0,0.2
num_suna--
}
}
// 上側への砂粒移動
if gravity_y <= -0.006 { ; ある程度垂直にしないと通さない
qcollision id_hantei_shita ; 中央判定用オブジェクトと接触している砂粒を検索
qy = 9999 : qid = -1 ; 一番中央に近い砂粒を見つけるため位置Yを記憶
repeat
qgetcol getvid, getvx, getvy ; 砂粒(id,x,y)
if getvid == -1 : break
if qy <= getvy : continue
qid = getvid : qx = getvx : qy = getvy ; 記憶
loop
if qid != -1 { ; 一番中央に近い砂粒を反対側へ移動
qpos qid, 60.0, 90.0
qspeed qid, 0.0,-0.2
num_suna++
}
}
if _num_suna != num_suna {
if systime_startMovingSand == 0 : systime_startMovingSand = systime
}else {
systime_startMovingSand = 0
}
}
qexec ; OBAQによるオブジェクトの更新
qdraw 1-debug ; オブジェクトの描画
if debug {
// 情報表示
color 255,255,255
pos 0,0
mes "Frame : "+frame ; フレーム数を表示
mes ""+qid+" : "+qx+", "+qy
mes "num : "+num_suna+" / "+(maxNum_suna-num_suna)
mes "DeviceMotion_allowed = "+jsdevm_allowed
mes "g_xyz = " + strf("(% .02f, % .02f, % .02f) m/s^2",jsdevm_accel_gx,jsdevm_accel_gy,jsdevm_accel_gz)
t = (systime - systime_startMovingSand)*(systime_startMovingSand>0)
mes "経過時間 : "+ strf("%02d:%02d",t/60/1000,(t/1000)\60) + " s"
}
if dishjs_devtype()==2 || dishjs_devtype()==3 {
if jsdevm_allowed == 0 {
color 200,200,255
pos 220,550
mes "iOS"
pos 50, 650
mes "画面をタップして"
mes "加速度センサーのアクセス許可をしてください"
}
}
redraw 1
await 16
frame++
goto *main