# sample11_sunadokei.hsp

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