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

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

Luaridaグラフィック編 (5)

Luarida ver1.10Betaで追加したコマンドの説明です。

canvas.loadBmp( 画像ファイル名, wx0, wy0, wx1, wy1 )

画像ファイルをワーク画面に読み込みます。画像ファイルは(wx0,wy0)-(wx1,wy1)を対角とする範囲に自動的に扁平して描かれます。
既に描かれている絵の上に読み込むときには、透過色が透けて下地の絵が残るので注意してください。ワーク画面をクリアするのは、canvas.workCls()です。
戻り値:成功:0, 失敗: -1
例.
 if( canvas.loadBmp("/sdcard/test.png", 0, 0, 100, 100 )==-1 )then
dialog( "/sdcard/test.png", "ロードに失敗しました", 1 )
do return end
end
SDメモリカードのluaridaフォルダにあるtest.pngファイルをワーク画面に読み込みます。読み込み範囲は(0,0)-(100,100)のエリア無いです。test.png画像が200×300であっても、100×100に扁平されて書き込まれます。

canvas.saveBmp( 画像ファイル名, wx0, wy0, wx1, wy1 )

ワーク画面の画像ファイルをPNGファイルとして書き出します。画像ファイルは(wx0,wy0)-(wx1,wy1)を対角とする範囲のものが書き出されます。
戻り値:成功:0, 失敗: -1
例.
if( canvas.saveBmp( "/sdcard/test.png", 0, 0, 500, 500 )==-1 )then
dialog( "/sdcard/test.png", "保存に失敗しました", 1 )
else
dialog( "画面を以下のファイルに保存しました", "/sdcard/test.png", 1 )
end
ワーク画面の(0,0)-(500,500)の範囲にある絵をSDメモリカードのluaridaフォルダにtest.pngファイルとして書き出します。

canvas.workCls( [色] )

ワーク画面を指定色でクリアします。色を省略した場合、Color(0,0,0,0)でクリアします。
例.
 canvas.workCls()
ワーク画面を0クリアします。
 canvas.workCls( color(255,255,255) )
ワーク画面を白にします。

canvas.putg( x0, y0, x1, y1, wx0, wy0, wx1, wy1 )

ワーク画面の(wx0,wy0)-(wx1,wy1)の矩形エリアの画像を、メイン画面(x0,y0)-(x1,y1)に描画します。
ワーク画面範囲とメイン画面範囲が異なる場合は自動的に扁平します。
メイン画面に描画しても、canvas.putflush()しない限り表示されません。
例.
canvas.putg( 0, 0, 480, 295, 80, 0, 560, 295 )
ワーク画面の(80,0)-(560,295)の矩形エリアの画像をメイン画面(0,0)-(480,295)に描画します。

canvas.getg( x0, y0, x1, y1, wx0, wy0, wx1, wy1 )

メイン画面の(x0,y0)-(x1,y1)の矩形エリアの画像を、ワーク画面(wx0,wy0)-(wx1,wy1)に取り込みます。メイン画面範囲とワーク画面範囲が異なる場合は自動的に扁平します。
また、メイン画面を越えた範囲を取り込もうとすると、Luaridaは自動的にトリミングするので、指定した取り込みサイズではなくなります。その結果、ワーク画面に取り込んだ画像が予想外に扁平します。
例.
canvas.getg( 0, 0, 100, 100, 100, 100, 200, 200 )
メイン画面の(0,0)-(100,100)の矩形エリアの画像をワーク画面(100,100)-(200,200)に取り込みます。

canvas.putflush( [x0,y0,x1,y1] )

メイン画面にputg()した画像を画面にフラッシュします。引数無しでcanvas.putflush()とすると全体がフラッシュされます。引数をつけた場合、メイン画面の(x0,y0)-(x1,y1)の範囲がフラッシュされます。

ここで、ややこしい話をします。実はLuaridaで用いているSufaceViewはダブルバッファを持っています。canvas.putflush()としたときは、画面全体をフラッシュするので1画面のバッファだけ描いています。更新されるのはダブルバッファの1画面ということになります。常に全画面更新しているので、これで大丈夫です。
ところが、範囲指定した場合は、メイン画面の一部をフラッシュするため、ダブルバッファの両画面の整合性を取るため、両画面同時更新しています。もし、canvas.putflush()したあと、canvas.putflush(0,0,100,100)のような部分的なフラッシュを行うと、ダブルバッファの一方がフラッシュできていない状態が発生します。故に、下の例のように、部分的なフラッシュを行うときには、必ず、canvas.putflush()を二回行って、2つのバッファをフラッシュしてください。
例.

  --背景を画面に描きます
  canvas.putg( 0, 0, 480, 295, 80, 0, 560, 295 )
  --ドロイド君を描きます
  canvas.putg( px-40, py-47, px+39, py+46, 0, 0, 79, 93 )
  --フラッシュしないと画面に反映しません
  canvas.putflush()	
  canvas.putflush()              --2回します
  --canvas.putflush(0,0,480,300) --これだと1回でいいです
  touch(1)  --タッチするまで待つ

  while(v<50)do
    canvas.putg( px-40, py-47, px+39, py+46, 0, 0, 79, 93 )
    canvas.putflush( px-40-2*dx, py-47-2*dy, px+39+2*dx, py+46+2*dy )
    canvas.putg( px-40, py-47, px+39, py+46, px+40, py-47, px+119, py+46 )
    x, y, s = touch()
    if(x>px)then px = px + dx else px = px - dx end
    if( math.abs(x-px)<=dx )then px = x end
    if(y>py)then py = py + dy else py = py - dy end
    if( math.abs(y-py)<=dy )then py = y end
    v = v + 1
  end

上の例だと、putg()の取り込み処理をするときに、トリミングしていないので、(py-47)が負になったときにおかしくなりますね。背景画面をワーク画面の中央付近に配置する必要がありますね。