直接描画
draw_* / fill_* / clear_rect / draw_text / text_width / get_pixel / パレット / invalidate / set_draw_area
これらの関数は
Canvasのrenderコールバックの中で使います(外で描いてもすぐ消えます。Canvasと直接描画)。座標は画面の座標、色は0〜15のパレットの番号(pico.COLOR_*)です。
pico.draw_pixel
pico.draw_line
width(px、既定1、最大64)を指定すると太い線を引きます。両端は丸くなります。
pico.draw_rect
矩形の枠線のみ描画します。
pico.fill_rect
矩形を塗りつぶします。
pico.draw_circle
円の輪郭のみ描画します。
pico.fill_circle
円を塗りつぶします。
pico.draw_ellipse / pico.fill_ellipse
中心 (x, y)、横半径 rx・縦半径 ry の楕円の輪郭/塗りつぶし。半径が負だとエラー。
pico.draw_triangle / pico.fill_triangle
三角形の輪郭(width で太さ)/塗りつぶし。
pico.draw_polygon / pico.fill_polygon
points は {x1, y1, x2, y2, ...} の平らな配列で、3点以上・32点まで。点列は最後から最初へ自動で閉じます。fill_polygon は偶奇規則で塗るので、凹んだ形や自己交差する形も塗れます。点が足りない・奇数個・数値以外・33点以上はエラー。
pico.fill_polygon({100,100, 130,100, 130,110, 110,110, 110,130, 100,130}, 9) -- L字
pico.draw_arc / pico.fill_arc
中心 (x, y)・半径 r の円弧(draw_arc)と扇形(fill_arc、中心から円弧までを塗る)。角度はラジアンで、0 が右、増えると時計回り(y が下向きのため)。a1 < a0 なら逆回り。fill_arc は円弧の分割が粗くなる(最大約30分割)ので、大きな円では角が見えます。
pico.fill_arc(150, 150, 20, 0, math.pi / 2, 6) -- 右下の1/4
pico.text_width
draw_text と同じ文字で1行に描いたときの幅(px)。font_size の既定は 1(pico.FONT_NORMAL)。右寄せ・中央寄せの位置決めに使います。
local w = pico.text_width("Score", 1)
pico.draw_text(240 - w - 4, 4, "Score", 0, 1)
pico.clear_rect
矩形を塗りつぶします。color を省くと背景色(pico.COLOR_BACKGROUND = 15)です。
pico.draw_text
colorの既定は文字の色(pico.COLOR_FORECOLOR= 0)。font_sizeの既定は1(pico.FONT_NORMAL、24px)。値は 定数 を参照。- 画面の右端で切れます(折り返しません。折り返すなら
draw_text_wrapped)。
align で揃えを選べます(6番目の引数、既定 "left")。"left" は x が左端、"center" は x が中心、"right" は x が右端になります。
pico.draw_text_wrapped
幅 w に収まるように折り返して描きます。\n で改行し、英語は空白で、日本語は文字の途中で折れます。戻り値は行数と全体の高さ(line_gap は行と行の間の追加の余白)。align は "left" / "center" / "right"(幅 w の中での揃え)。2048バイト・64行までです。
pico.measure_text
描かずに、draw_text_wrapped と同じ折り返しの行数と高さだけを返します。枠の大きさを先に決めるときに使います。
pico.get_pixel
画面(今描いている合成先)の1画素のパレット番号(0〜15)を読みます。範囲外は nil。Canvas の render の中では、その時点までに合成された絵が読めます。CanvasRaster の中身は pico.canvas_get_pixel で読みます。
pico.set_palette
パレット番号 index(1〜14)の色を RGB(各 0〜255)に差し替えます(少し丸められます)。画面全体とキャンバス・画像の同じ番号の色が一斉に変わります。黒(0)と白(15)は変えられず、index が 0・15・範囲外ならエラーです。
変えたパレットは、アプリを閉じるときと別の画面へ移るときに既定のパレットへ自動で戻ります(pico.reset_palette() で自分から戻すこともできます)。
pico.get_palette
パレット番号 index(0〜15)の今の色を RGB(各 0〜255)で返します。
pico.reset_palette
パレットを既定の16色へ戻します。
pico.invalidate
そのウィジェットを次のフレームで描き直させます(Canvas なら render が呼ばれます)。どのウィジェットにも使えます。
pico.mark_dirty
画面の矩形を次のフレームで描き直させます。広い Canvas の一部だけが変わったとき、その部分だけを指定すると速くなります(render の中で pico.get_draw_area() を見て、その範囲だけ描きます)。
pico.set_draw_area
以降の pico.draw_* をこの矩形の内側だけに制限します(クリップ)。render の中では、今回描き直す範囲との重なりになります(それより広げることはできません)。
pico.clear_draw_area
set_draw_area で設定したクリップを解除します(render コールバックの中では、今回描き直す範囲へ戻します)。set_draw_area を呼んだら、同じ render コールバック内で必ず対にして呼んでください(クリップ矩形は画面全体で1個しか無い共有状態です)。
pico.get_draw_area
今のクリップを返します。render の中では「そのCanvasのうち、今回描き直す部分」になるので、部品の多い絵で、描き直しが要る部分だけを描くのに使えます(pico.mark_dirty で小さな矩形だけを指定したときは、その矩形だけ)。クリップが無いときは w と h が0です。
pico.on(board, "render", function()
local x, y, w, h = pico.get_draw_area()
-- (x, y, w, h) にかかるマスだけを描く
end)
set_draw_area を呼ぶとこの値も(元の範囲との重なりへ)狭まる点に注意してください。実例は ゲームエンジン の描画(pico.game は描き直す範囲をこれで絞っている)と、「テトリス」のHOLD/NEXT欄。