センサコマンドによるCompassサンプル公開
Luaaridaにセンサ関連命令を追加したので、方位磁石サンプルを作ってみました。ダウンロードはこちらから(CompassSample.apk)。
参考動画です
使用コマンド
センサコマンドとして使用しているのは、sensor.setdevOrient()とsensor.getOrient()です。
- sensor.setdevOrient(ON/OFF設定)
setdevOrientは、方位・傾斜センサの使用可/不可の切り替えを行います。引数0の場合は不可、1の場合は使用可となります。
また、このコマンドは戻り値を持ち、センサの使用が可能であれば、0が返り、センサ使用不可の場合は、-1が返ってきます。
実際には下記のように記述した方がいいと思います。
if(sensor.setdevOrient(1)==-1)then toast("方位センサが使用不可です。画面タッチで終了します", 0 ) touch(3) return end
- sensor.getOrient()
getOrientは、引数は無く、戻り値を3つ持ちます。
direction, pitch, roll = sensor.getOrient()
第1戻り値は、方位角です。北が0度となるような角度が返ります。第2戻り値は長辺方向を前後方向としたときの上下傾き成分(ピッチ角成分)です。第3戻り値は左右傾き成分(ロール角成分)です。ここから角度を出すには、90度傾斜したときの成分値が必要です。あらかじめ求めて計算して下さい。サンプル必要かな・・。
下記が、全ソースです。
----------------------------------------- --方位磁石サンプル ------------------------------------------ --関数宣言-------------------------------- main={} --mainメソッド compassview={} -- 方位磁石描画 ------------------------------------------ Path="/sdcard/luarida/compasssample/" --luaファイルを保存しているPath ------------------------------------------ mt={} mt.__newindex=function(mtt,mtn,mtv) dialog( "Error Message", "宣言していない変数 "..mtn.." に値を入れようとしています", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end mt.__index=function(mtt,mtn) dialog( "Error Message", "変数 "..mtn.." は宣言されていません", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end setmetatable(_G,mt) --------以下が実プログラム---------------- ------------------------------------------ -- 方位磁石描画 ------------------------------------------ function compassview() local c,p,r local aax,aay local w,h local wb, hb local kaku local cx, cy local pi = 3.141592 local x,y,s local angle local droidangle --画面サイズ取得 w,h = canvas.getviewSize() w = w-1 h = h-1 wb = 80+w hb = h cx = w/2 cy = h/2 toast("ドロイド君をタッチすると終了します", 0 ) while(true)do --傾斜を取得 angle, p, r = sensor.getOrient() droidangle = 270 - angle kaku = droidangle/180*pi x = math.sin(kaku) y = math.cos(kaku) canvas.putg( 0, 0, w, h, 80, 0, wb, hb ) canvas.putrotg( cx, cy, droidangle, 0, 0, 79, 93 ) canvas.putTextRotate("▲", cx+100*x, cy-100*y, droidangle, 26, color(0,0,255)) canvas.putTextRotate("北", cx+70*x, cy-70*y, droidangle, 26, color(0,0,255)) canvas.drawTextRotate(angle, cx-70*x, cy+70*y, droidangle, 26, color(0,0,255)) --ドロイド君タッチで終了 x,y,s = touch() if( s~=1 )then if( x>=cx-79/2 and x<=cx+79/2 and y>=cy-93/2 and y<=cy+93/2 )then break end end end end ------------------------------------------ --メインプログラム ------------------------------------------ function main() local w,h,wb, hb --ワークエリアをクリアする canvas.workCls() --ワークエリアの(0,0)-(79,93)に、アンドロイド画像を読み込みます if( canvas.loadBmp( Path.."droidkun.png", 0, 0, 79, 93 )==-1)then dialog( Path.."droidkun.png", "ロードに失敗しました",1 ) do return end end --画面サイズ取得 w,h = canvas.getviewSize() w = w-1 h = h-1 wb = 80+w hb = h --背景を白にする canvas.drawCls( color(255,255,255) ) --画面を背景にするために、ワークエリアに取り込む canvas.getg( 0, 0, w, h, 80, 0, wb, hb ) --傾斜センサ起動 sensor.setdevOrient(1) --方位磁石の描画 compassview() --傾斜センサ終了 sensor.setdevOrient(0) end main()