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