応用テクニック
汎用性のある応用テクニックを紹介します。
なお、例示のスクリプトは、出典元のスクリプトを分かりやすいように抜粋・加工等しています。
鮮やかなランダム色
exedit.scn「図形で隠す」より。
図形などでランダムな色を指定する場合に、鮮やかな色が選択されるようにします。
n=5
for i=0,n-1 do
c = (obj.rand(0,100,i,0)-50)/100
if( c < 0 ) then
c = math.floor(math.cos(math.pi*c)*255)*256 + math.floor(math.sin(math.pi*-c)*255)
else
c = math.floor(math.cos(math.pi*c)*255)*256 + math.floor(math.sin(math.pi*c)*255)*65536
end
obj.load("figure","円",c,100)
obj.draw(-200+i*100)
end
鮮やかなランダム色 その2[#td5fe5eb]
明度・彩度を一定に保ったランダムカラーの生成
--メイン処理
color=0x8877ff --ベースカラー
h,s,v=HSV(color) --h,s,v変換
for i=1,100 do
col=HSV(obj.rand(1,360,i),s,v) --ランダム色相(h)と、ベースカラーの s,v を使いRGBコードを作成
obj.load("figure","四角形",col,10)
obj.draw(obj.rand(1,360,i),obj.rand(1,360,i))
end
テキストオブジェクトの個別の座標を取得する
アニメーション効果の「登場_ランダム文字(ゆうき改)」より。
配列を使用して、テキストオブジェクトの1文字毎の座標などのパラメータを取得します。
※文字毎に個別オブジェクトにチェックしておく必要があります。
--座標の保存
if(obj.index==0)then
if(pp==null) then
pp={}
end
end
pp[obj.index+1]={obj.ox,obj.oy}
pp[i+1][1] → index=i番目のx座標
pp[i+1][2] → index=i番目のy座標
配列をシャッフルする
アニメーション効果の「登場_ランダム文字(ゆうき改)」より。
配列の中身をランダムにシャッフルします。
【テキストオブジェクトのindexをシャッフルするケース】
---順番通りの配列を定義する
local indexes = {}
for i=0,obj.num-1 do
indexes[i+1]=i
end
---配列をシャッフルする
for i=0,obj.num-1 do
local dest = 0
dest=rand(0,obj.num-1, (obj.num+1)*(-1),i+1) --obj共通のランダム値を得るためにシードは負の値を使う、とのこと
local swap = indexes[i+1]
indexes[i+1] = indexes[dest+1]
indexes[dest+1] = swap
end
i=indexes[obj.index+1]
テクスチャ付きのスクリプトを配布
「script」フォルダの中に「picture」フォルダを作成し、その中の画像テクスチャを使用。
「picture」フォルダを共有にして、個別のスクリプト毎にサブフォルダを作成し、テキスチャ画像を入れれば配布しやすいかもしれません。
【サンプル】
「koya」というサブフォルダの「wood_02.png」というテクスチャを読み込むケース
--パスを読み変える
path=obj.getinfo("script_path") .. "picture\\koya\\wood_02.png"
file=string.gsub(path,"\\","\\\\")
--テクスチャをマッピング
w=400
h=300
obj.setoption("drawtarget","tempbuffer",w,h)
obj.load(file)
wn=math.floor(w/obj.w)+1
hn=math.floor(h/obj.h)+1
for j=0,hn do
y=-h/2+obj.h*j
for i=0,wn do
x=-w/2+obj.w*i
obj.draw(x,y)
end
end
obj.setoption("drawtarget","framebuffer")
obj.load("tempbuffer")
領域枠表示
ティム氏の稲妻スクリプトより。
領域サイズの枠を表示。対角線上のアンカーポイント2個で調節します。
--dialog:領域サイズ,AS={-100,-100,100,100};枠表示/chk,chk=1;
local function Szdrawpoly(x1,y1,x2,y2)
obj.drawpoly(x1,y1,0, x2,y1,0, x2,y2,0, x1,y2,0, 0,0, obj.w,0, obj.w,obj.h, 0,obj.h)
end
obj.setanchor("AS",2)
local ASx0,ASy0,ASx1,ASy1=unpack(AS)
local cx,cy=(ASx1+ASx0)/2,(ASy1+ASy0)/2
obj.setoption("drawtarget","tempbuffer",math.abs(ASx1-ASx0),math.abs(ASy1-ASy0))
--[[
四角形の枠を描画する部分
guiによる表示設定、出力時の表示設定、枠表示チェックによる表示設定を行っている
--]]
if obj.getoption("gui")==true and obj.getinfo("saving")==false and chk==1 then
obj.load("figure","四角形",0xffffff,100)
ASx0=ASx0-cx
ASx1=ASx1-cx
ASy0=ASy0-cy
ASy1=ASy1-cy
Szdrawpoly(ASx0 ,ASy0-0.5,ASx1 ,ASy0+0.5)
Szdrawpoly(ASx0 ,ASy1-0.5,ASx1 ,ASy1+0.5)
Szdrawpoly(ASx0-0.5,ASy0 ,ASx0+0.5,ASy1 )
Szdrawpoly(ASx1-0.5,ASy0 ,ASx1+0.5,ASy1 )
end
obj.load("tempbuffer")
obj.cx,obj.cy=obj.cx-cx,obj.cy-cy --アンカーポイントと枠の頂点が一致するように処理
- 最終更新:2012-02-18 19:36:32