98 lines
2.7 KiB
Lua
98 lines
2.7 KiB
Lua
function draw9box(corner, edge, x, y, width, height)
|
|
-- edges
|
|
for i = 8, width - 9, 8 do
|
|
spr(edge, x + i, y, 0) -- top
|
|
spr(edge, x + i, y + height - 8, 0, 1, 0, 2) -- bottom
|
|
end
|
|
for i = 8, height - 8,8 do
|
|
spr(edge, x, y + i, 0, 1, 0, 3) -- left
|
|
spr(edge, x + width - 8, y + i, 0, 1, 0, 1) -- right
|
|
end
|
|
-- corners
|
|
spr(corner, x, y, 0) -- top left
|
|
spr(corner, x + width - 8, y, 0, 1, 0, 1) -- top right
|
|
spr(corner, x, y + height - 8, 0, 1, 0, 3) -- bottom left
|
|
spr(corner, x + width - 8, y + height - 8, 0, 1, 0, 2) -- bottom right
|
|
end
|
|
|
|
local function rot(x, y, rad)
|
|
local sa = math.sin(rad)
|
|
local ca = math.cos(rad)
|
|
return x * ca - y * sa, x * sa + y * ca
|
|
end
|
|
|
|
--- Draw a sprite using two textured triangles.
|
|
--- Apply affine transformations: scale, shear, rotate, flip
|
|
--- https://cxong.github.io/tic-80-examples/affine-sprites
|
|
---comment
|
|
---@param id number
|
|
---@param x number
|
|
---@param y number
|
|
---@param colorkey? number
|
|
---@param sx? number scale x
|
|
---@param sy? number scale y
|
|
---@param flip? number
|
|
---@param rotate? number
|
|
---@param w? number
|
|
---@param h? number
|
|
---@param ox? number
|
|
---@param oy? number
|
|
---@param shx1? number
|
|
---@param shy1? number
|
|
---@param shx2? number
|
|
---@param shy2? number
|
|
function aspr(
|
|
id, x, y, colorkey, sx, sy, flip, rotate, w, h,
|
|
ox, oy, shx1, shy1, shx2, shy2
|
|
)
|
|
colorkey = colorkey or -1
|
|
sx = sx or 1
|
|
sy = sy or 1
|
|
flip = flip or 0
|
|
rotate = math.rad(rotate or 0)
|
|
w = w or 1
|
|
h = h or 1
|
|
ox = ox or w * 8 // 2
|
|
oy = oy or h * 8 // 2
|
|
shx1 = shx1 or 0
|
|
shy1 = shy1 or 0
|
|
shx2 = shx2 or 0
|
|
shy2 = shy2 or 0
|
|
|
|
-- scale / flip
|
|
if flip % 2 == 1 then
|
|
sx = -sx
|
|
end
|
|
if flip >= 2 then
|
|
sy = -sy
|
|
end
|
|
ox = ox * -sx
|
|
oy = oy * -sy
|
|
|
|
-- shear / rotate
|
|
shx1 = shx1 * -sx
|
|
shy1 = shy1 * -sy
|
|
shx2 = shx2 * -sx
|
|
shy2 = shy2 * -sy
|
|
|
|
local rx1, ry1 = rot(ox + shx1, oy + shy1, rotate)
|
|
local rx2, ry2 = rot(((w * 8) * sx) + ox + shx1, oy + shy2, rotate)
|
|
local rx3, ry3 = rot(ox + shx2, ((h * 8) * sy) + oy + shy1, rotate)
|
|
local rx4, ry4 = rot(((w * 8) * sx) + ox + shx2, ((h * 8) * sy) + oy + shy2, rotate)
|
|
local x1 = x + rx1
|
|
local y1 = y + ry1
|
|
local x2 = x + rx2
|
|
local y2 = y + ry2
|
|
local x3 = x + rx3
|
|
local y3 = y + ry3
|
|
local x4 = x + rx4
|
|
local y4 = y + ry4
|
|
-- UV coords
|
|
local u1 = (id % 16) * 8
|
|
local v1 = id // 16 * 8
|
|
local u2 = u1 + w * 8
|
|
local v2 = v1 + h * 8
|
|
|
|
ttri(x1, y1, x2, y2, x3, y3, u1, v1, u2, v1, u1, v2, 0, colorkey)
|
|
ttri(x3, y3, x4, y4, x2, y2, u1, v2, u2, v2, u2, v1, 0, colorkey)
|
|
end |