はじめに
ondraw内に色々書いてお絵かきしよう
!テクニック随時募集中!
描画関数
基本テクニック
覚えておいた方がいいテクニック
ドット表示
(x,y)に1ドットを書きたいとき、なぜか1ドット描画の関数がないのでこのようにする必要がある
screen.drawLine(x,y,x+1,y+1)
多用するならこのように関数にしたほうが文字数を削減できる
function dot(x,y)
screen.drawLine(x,y,x+1,y+1)
end
マスキング
上から順番に描画されるため、後に描いた図形で書いた図形を塗りつぶすことができる
背景色と同じ色であればトリミングが可能
関数名省略
Lua例文集/文字数削減系
これを利用することで以下のように文字数を削減できる
s=screen sL,sC,sR=s.drawLine,s.drawCircle,s.drawRect sL(x1,y1,x2,y2) --2+12文字 screen.drawLine(x1,y1,x2,y2) --15+12文字 sC(x,y,r) --2+7文字 screen.drawCircle(x,y,r) --17+7文字 sR(x,y,w,h) --2+9文字 screen.drawRect(x,y,w,h) --15+9文字
文字数がほぼ半減している
応用テクニック
使えると有用な場合がある
for+table
n行のリストを描きたい場合、drawTextでひとつづつ描いてもよいが、圧倒的に簡単になる方法がこれ
テーブルに並べたい文字列を並べ、for文を利用することで改行(位置ずらし)とテキストの変化を繰り返し行える
list={"Alpha","Beta","Gamma","Delta"}
for i=1,#list do
screen.drawText(x,y+i*6,list[i])
end
数字のn桁目の取り出し
001234のように頭に0を付けて桁をずらしたくない場合、mod関数(剰余)を使うことで任意の桁数を取り出してfor文で描画を繰り替えせばよい
for i=0,5 do
screen.drawText(x+i*5,y,math.mod(number/10^i))*10^i
end
極座標変換
※ここから高校数学
(x,y)座標(デカルト座標)と(r,θ)座標(極座標)の相互変換
これを利用することで座標をn°傾けるという操作ができるようになる
function Polar(x1,y1,x2,y2,n)
r = math.sqrt((x1-x2)^2+(y1-y2)^2)
t = math.atan(y1-y2,x1-x2)
n2 = n/(180/math.pi())+t
x=x1+r*cos(n2)
y=y1+r*sin(n2)
end
レインボー
tickごとに変化する数値をsin関数に入れることでRGBを周期的に切り替えてカラフルにできる
function rainbow_gradient(x)
local wavelength = 400.0 -- 虹の波長(nm)
local amplitude = 127.5 -- RGBの振幅
local red = math.sin(2.0 * math.pi * wavelength / 700.0 * x + 0) * amplitude + amplitude
local green = math.sin(2.0 * math.pi * wavelength / 700.0 * x + (2.0 * math.pi / 3.0)) * amplitude + amplitude
local blue = math.sin(2.0 * math.pi * wavelength / 700.0 * x + (4.0 * math.pi / 3.0)) * amplitude + amplitude
red=math.max(math.min(red,255),0) --範囲制限
green=math.max(math.min(green,255),0)
blue=math.max(math.min(blue,255),0)
return red,green,blue
end
コツ
まずはとにかく下絵を描くことが大切である
下絵さえできてしまえばあとはプログラミングするだけである