--information:四隅に配置 v1.4.1 by teruyoshi | 指定されたオブジェクトを四隅に配置します。 --label:配置 --group:基本設定,true --track@mX:余白X,-2000,2000,100,0.01 --track@mY:余白Y,-2000,2000,100,0.01 --select@method:配置方法=0,画面端からの余白を指定=0,中央からの余白を指定=1 --checksection@is_percent:余白をパーセントで指定する,false --checksection@multiobject:個別オブジェクトとして描画する,false --group:サイズ設定,false --track@size:全体サイズ,0,1000,100,0.01 --track@size_ul:左上サイズ,0,1000,100,0.01 --track@size_ur:右上サイズ,0,1000,100,0.01 --track@size_dl:左下サイズ,0,1000,100,0.01 --track@size_dr:右下サイズ,0,1000,100,0.01 --group:回転設定,false --track@rot:全体回転,-3600,3600,0,0.01 --track@rot_ul:左上回転,-3600,3600,0,0.01 --track@rot_ur:右上回転,-3600,3600,0,0.01 --track@rot_dl:左下回転,-3600,3600,0,0.01 --track@rot_dr:右下回転,-3600,3600,0,0.01 --group:反転設定,false --checksection@flip_x:左右反転,true --checksection@flip_y:上下反転,true --group:透明度設定,false --track@alpha_ul:左上透明度,0,100,0,0.01 --track@alpha_ur:右上透明度,0,100,0,0.01 --track@alpha_dl:左下透明度,0,100,0,0.01 --track@alpha_dr:右下透明度,0,100,0,0.01 if size == 0 then return end -- 全体サイズが0の場合は描画しない if size_ul == 0 then alpha_ul = 0 end -- 左上サイズが0の場合は透明度を0にして描画しない if size_ur == 0 then alpha_ur = 0 end -- 右上サイズが0の場合は透明度を0にして描画しない if size_dl == 0 then alpha_dl = 0 end -- 左下サイズが0の場合は透明度を0にして描画しない if size_dr == 0 then alpha_dr = 0 end -- 右下サイズが0の場合は透明度を0にして描画しない -- 画面サイズとオブジェクトサイズを略記 local screen_half_w = obj.screen_w/2 local screen_half_h = obj.screen_h/2 local w = obj.w local h = obj.h -- パーセント指定の場合は、mXとmYを画面サイズに応じた値に変換する if is_percent == true then mX = mX/100*screen_half_w mY = mY/100*screen_half_h end -- methodが1の場合は、mXとmYを画面の中心からの余白に変換する local tX = mX local tY = mY if method == 0 then -- 余白を画面端からの余白として扱う場合 mX = screen_half_w - math.abs(mX-screen_half_w) -- mXが負の時でも描画範囲外にならないようにする処置 mY = screen_half_h - math.abs(mY-screen_half_h) else -- 余白を画面の中心からの余白として扱う場合 tX = screen_half_w - mX tY = screen_half_h - mY mX = screen_half_w - math.abs(mX) -- mXが負の時でも描画範囲外にならないようにする処置 mY = screen_half_h - math.abs(mY) end -- flipを-1または1の形に変換 if flip_x == true then flip_x = -1 else flip_x = 1 end if flip_y == true then flip_y = -1 else flip_y = 1 end -- x軸と元オブジェクトの右上の角度を求める local angle = math.atan2(h, w) -- 角度をラジアンに変換して回転を加える (反転も考慮) rot_ul = -math.rad(rot_ul + rot) rot_ur = -math.rad(rot_ur + rot)*flip_x rot_dl = -math.rad(rot_dl + rot)*flip_y rot_dr = -math.rad(rot_dr + rot)*flip_x*flip_y -- 透明度を0~1の形に変換 alpha_ul = (100 - alpha_ul)/100 alpha_ur = (100 - alpha_ur)/100 alpha_dl = (100 - alpha_dl)/100 alpha_dr = (100 - alpha_dr)/100 -- 中心から右上までの距離を求め、size倍する local r = math.sqrt(w^2 + h^2)/2 *size/100 -- 最も大きいサイズに合わせて出力範囲を決定する local max_r = r * math.max(size_ul, size_ur, size_dl, size_dr)/100 local system_max_w, system_max_h = obj.getinfo("image_max") -- 画像の最大サイズ制限を取得する if multiobject == true then -- 個別オブジェクトとして描画する場合 max_r = max_r / size * 100 local buf_w = (screen_half_w - mX/size*100 + max_r)*2 local buf_h = (screen_half_h - mY/size*100 + max_r)*2 if buf_w > system_max_w or buf_h > system_max_h then buf_w = math.min(buf_w, system_max_w) buf_h = math.min(buf_h, system_max_h) print("@warn","四隅に配置: 画像の最大サイズ制限により、描画範囲が制限されました。幅:" ..buf_w.." 高さ:"..buf_h) end obj.setoption("drawtarget", "tempbuffer", buf_w, buf_h) local ox_s = { -screen_half_w + tX, screen_half_w - tX, -screen_half_w + tX, screen_half_w - tX } local oy_s = { -screen_half_h + tY, -screen_half_h + tY, screen_half_h - tY, screen_half_h - tY } local size_s = { size_ul, size_ur, size_dl, size_dr } local alpha_s = { alpha_ul, alpha_ur, alpha_dl, alpha_dr } local rot_s = { -rot_ul, -rot_ur*flip_x, -rot_dl*flip_y, -rot_dr*flip_x*flip_y } local flip_x_s = { 1, flip_x, 1, flip_x } local flip_y_s = { 1, 1, flip_y, flip_y } local ox_ori = obj.ox local oy_ori = obj.oy local size_ori = obj.zoom local alpha_ori = obj.alpha local rot_ori = obj.rz local i = 0 obj.multiobject(4, function() -- 4つそれぞれの中心やサイズ、透明度、回転を設定して描画する obj.draw() obj.ox = ox_s[i+1] obj.oy = oy_s[i+1] obj.zoom = size_s[i+1]/100*size/100 obj.alpha = alpha_s[i+1] obj.sx = flip_x_s[i+1] obj.sy = flip_y_s[i+1] obj.rz = math.deg(rot_s[i+1]) i = i + 1 end) obj.ox = ox_ori -- 元の値に戻す obj.oy = oy_ori obj.zoom = size_ori/size_s[4]*100 obj.alpha = alpha_ori obj.rz = rot_ori else -- 個別オブジェクトとして描画しない場合 local buf_w = (screen_half_w - mX + max_r)*2 local buf_h = (screen_half_h - mY + max_r)*2 if buf_w > system_max_w or buf_h > system_max_h or buf_w*buf_h > 16000000 then buf_w = math.min(buf_w, system_max_w, buf_w *(16000000/(buf_w*buf_h))) buf_h = math.min(buf_h, system_max_h, buf_h *(16000000/(buf_w*buf_h))) print("@warn","四隅に配置: 画像の最大サイズ制限により、描画範囲が制限されました。幅:" ..buf_w.." 高さ:"..buf_h) end obj.setoption("drawtarget", "tempbuffer", buf_w, buf_h) if alpha_ul > 0 then local r_ul = r * size_ul/100 local x0 = -screen_half_w + tX - (r_ul * math.cos(rot_ul - angle)) local y0 = -screen_half_h + tY - (r_ul * -math.sin(rot_ul - angle)) local x1 = -screen_half_w + tX - (r_ul * -math.cos(rot_ul + angle)) local y1 = -screen_half_h + tY - (r_ul * math.sin(rot_ul + angle)) local x2 = -screen_half_w + tX - (r_ul * -math.cos(rot_ul - angle)) local y2 = -screen_half_h + tY - (r_ul * math.sin(rot_ul - angle)) local x3 = -screen_half_w + tX - (r_ul * math.cos(rot_ul + angle)) local y3 = -screen_half_h + tY - (r_ul * -math.sin(rot_ul + angle)) obj.drawpoly(x0,y0,0, x1,y1,0, x2,y2,0, x3,y3,0, 0,0, w,0, w,h, 0,h, alpha_ul) end if alpha_ur > 0 then local r_ur = r * size_ur/100 local x0 = screen_half_w - tX - (r_ur * math.cos(rot_ur - angle))*flip_x local y0 = -screen_half_h + tY - (r_ur * -math.sin(rot_ur - angle)) local x1 = screen_half_w - tX - (r_ur * -math.cos(rot_ur + angle))*flip_x local y1 = -screen_half_h + tY - (r_ur * math.sin(rot_ur + angle)) local x2 = screen_half_w - tX - (r_ur * -math.cos(rot_ur - angle))*flip_x local y2 = -screen_half_h + tY - (r_ur * math.sin(rot_ur - angle)) local x3 = screen_half_w - tX - (r_ur * math.cos(rot_ur + angle))*flip_x local y3 = -screen_half_h + tY - (r_ur * -math.sin(rot_ur + angle)) obj.drawpoly(x0,y0,0, x1,y1,0, x2,y2,0, x3,y3,0, 0,0, w,0, w,h, 0,h, alpha_ur) end if alpha_dl > 0 then local r_dl = r * size_dl/100 local x0 = -screen_half_w + tX - (r_dl * math.cos(rot_dl - angle)) local y0 = screen_half_h - tY - (r_dl * -math.sin(rot_dl - angle))*flip_y local x1 = -screen_half_w + tX - (r_dl * -math.cos(rot_dl + angle)) local y1 = screen_half_h - tY - (r_dl * math.sin(rot_dl + angle))*flip_y local x2 = -screen_half_w + tX - (r_dl * -math.cos(rot_dl - angle)) local y2 = screen_half_h - tY - (r_dl * math.sin(rot_dl - angle))*flip_y local x3 = -screen_half_w + tX - (r_dl * math.cos(rot_dl + angle)) local y3 = screen_half_h - tY - (r_dl * -math.sin(rot_dl + angle))*flip_y obj.drawpoly(x0,y0,0, x1,y1,0, x2,y2,0, x3,y3,0, 0,0, w,0, w,h, 0,h, alpha_dl) end if alpha_dr > 0 then local r_dr = r * size_dr/100 local x0 = screen_half_w - tX - (r_dr * math.cos(rot_dr - angle))*flip_x local y0 = screen_half_h - tY - (r_dr * -math.sin(rot_dr - angle))*flip_y local x1 = screen_half_w - tX - (r_dr * -math.cos(rot_dr + angle))*flip_x local y1 = screen_half_h - tY - (r_dr * math.sin(rot_dr + angle))*flip_y local x2 = screen_half_w - tX - (r_dr * -math.cos(rot_dr - angle))*flip_x local y2 = screen_half_h - tY - (r_dr * math.sin(rot_dr - angle))*flip_y local x3 = screen_half_w - tX - (r_dr * math.cos(rot_dr + angle))*flip_x local y3 = screen_half_h - tY - (r_dr * -math.sin(rot_dr + angle))*flip_y obj.drawpoly(x0,y0,0, x1,y1,0, x2,y2,0, x3,y3,0, 0,0, w,0, w,h, 0,h, alpha_dr) end end --tempbufferに描画したものをobjectにコピーする obj.copybuffer("object", "tempbuffer")