Luaお絵描き部

Last-modified: 2024-11-14 (木) 23:16:56

はじめに

ondraw内に色々書いてお絵かきしよう
!テクニック随時募集中!

描画関数

Luaスクリプト/DRAWINGを参照

基本テクニック

覚えておいた方がいいテクニック

ドット表示

(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°傾けるという操作ができるようになる

x1,y1中心にx2,y2をn°傾けたときのx,yを返す関数
 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

コツ

まずはとにかく下絵を描くことが大切である
下絵さえできてしまえばあとはプログラミングするだけである