大家好 我是misk
這次的成果我覺得相當有趣,所以想分享給大家。
相信有寫過UI.lua的玩家們絕對會對UI.box有印象,因為它可以在螢幕上顯示圖形。
但是....為什麼官方只給我們矩形的API呢?我們能不能做出圓形?
當然可以,我想要分享一個自製圓形函式給大家。
***UI.lua***(如要使用請務必複製函式內容)
circle_part={} --在UI.lua中設全域變數
function circle(number,quality,position_x,position_y,radius,e,r_,g_,b_,a_) --函式內容
circle_part[number]={}
local i=0
while i<=quality*2 do
circle_part[number][i]=UI.Box.Create()
set={
x=math.floor((position_x+radius*i/quality)/e),
y=math.floor((position_y+radius-math.sqrt(math.abs(radius*radius-(radius*(quality-i)/quality)*(radius*(quality-i)/quality))))*e),
width=math.floor((radius/quality)/e)+1,
height=math.floor((math.sqrt(math.abs(radius*radius-(radius*(quality-i)/quality)*(radius*(quality-i)/quality))))*e*2),
r=r_,
g=g_,
b=b_,
a=a_
}
circle_part[number][i]:Set(set)
i=i+1
end
end
我先說明一下定義的參數。
function circle(number,quality,position_x,position_y,radius,e,r_,g_,b_,a_)
number:你可能不會只使用一個圓形,因此如果要產出兩個圓,就要為圓加上"編號"。
quality:畫質。畫質越高,稜角越不明顯,但是能製造的圓就越少,反之。
position_x,position_y:這裡的座標並不是圓心!而是左上角的座標,使用方法就跟UI.Box的座標定義一樣。
radius:半徑。
e:你希望的可能不是正圓而是橢圓,因此我多設了一個參數(正圓參數為1),此為橢圓的壓縮量。
r_,g_,b_,a_:圓形的顏色,透明度。
Ex:circle(1,250,200,200,250,1,0,255,0,255)
當我把半徑縮小時:circle(1,250,200,200,100,1,0,255,0,255)
結果:
當我想製作一個橢圓時,只要將e參數變動就行。
Ex:circle(1,250,600,0,200,1.4,0,255,0,255)
Ex:circle(1,250,200,0,200,0.6,0,255,0,255)
當我想要製作很多圓,一樣很方便。但這裡請注意一件事情,這個圓的組成方式是由一條條的矩形組成的,然後再將矩形存取在陣列中,然而陣列有限制大小,無法儲存太多圓,因此想要更多的圓就要將畫質(參數quality)降低(這個問題我之後再嘗試破解)。
Ex:
circle(1,200,200,0,200,0.6,0,255,0,255)
當我把畫質調降為50時,結果為。
差別就自己比較吧!
這次的成果介紹到這裡結束,如果巴哈有人能提供更好的畫圓方式也希望能不吝提出,謝謝!