応用テクニック

汎用性のある応用テクニックを紹介します。
なお、例示のスクリプトは、出典元のスクリプトを分かりやすいように抜粋・加工等しています。

鮮やかなランダム色

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

このWIKIを編集するにはパスワード入力が必要です

認証パスワード