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