コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

センサコマンドによる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()