2023-04-20 17:15:38 +00:00
|
|
|
local Object = require "lib/classic"
|
|
|
|
|
|
|
|
local NineSlice = Object:extend()
|
|
|
|
|
|
|
|
function NineSlice:new(atlas, sprites)
|
|
|
|
self.atlas = atlas
|
|
|
|
self.sprites = sprites
|
|
|
|
end
|
|
|
|
|
|
|
|
function NineSlice:draw(x, y, width, height)
|
|
|
|
local function draw(sprite, tx, ty)
|
|
|
|
local atlas = self.atlas
|
|
|
|
local sw = atlas.sw
|
|
|
|
local sh = atlas.sh
|
|
|
|
local gx = x + tx * sw
|
|
|
|
local gy = y + ty * sh
|
|
|
|
|
|
|
|
if sprite then
|
2023-04-21 01:11:56 +00:00
|
|
|
atlas:draw(sprite, gx, gy)
|
2023-04-20 17:15:38 +00:00
|
|
|
else
|
|
|
|
love.graphics.rectangle("fill", gx, gy, sw, sh)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
--common variables
|
|
|
|
local right = width - 1
|
|
|
|
local bottom = height - 1
|
|
|
|
local sprites = self.sprites
|
|
|
|
|
|
|
|
if width == 1 and height == 1 then
|
|
|
|
draw(sprites.only_center, 0, 0)
|
|
|
|
elseif width == 1 then
|
|
|
|
draw(sprites.vert_top, 0, 0)
|
|
|
|
draw(sprites.vert_bottom, 0, bottom)
|
|
|
|
|
|
|
|
for cy = 1, bottom - 1 do
|
|
|
|
draw(sprites.vert_center, 0, cy)
|
|
|
|
end
|
|
|
|
elseif height == 1 then
|
|
|
|
draw(sprites.hori_left, 0, 0)
|
|
|
|
draw(sprites.hori_right, right, 0)
|
|
|
|
|
|
|
|
for cx = 1, right - 1 do
|
|
|
|
draw(sprites.hori_center, cx, 0)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
--draw corners
|
|
|
|
draw(sprites.tl, 0, 0)
|
|
|
|
draw(sprites.tr, right, 0)
|
|
|
|
draw(sprites.bl, 0, bottom)
|
|
|
|
draw(sprites.br, right, bottom)
|
|
|
|
|
|
|
|
--horizontal edges
|
|
|
|
for cx = 1, right - 1 do
|
|
|
|
draw(sprites.top, cx, 0)
|
|
|
|
draw(sprites.bottom, cx, bottom)
|
|
|
|
end
|
|
|
|
|
|
|
|
--vertical edges
|
|
|
|
for cy = 1, bottom - 1 do
|
|
|
|
draw(sprites.left, 0, cy)
|
|
|
|
draw(sprites.right, right, cy)
|
|
|
|
end
|
|
|
|
|
|
|
|
--draw center
|
|
|
|
for cx = 1, right - 1 do
|
|
|
|
for cy = 1, bottom - 1 do
|
|
|
|
draw(sprites.center, cx, cy)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
return NineSlice
|