Add directional sticky and skewer box variants
This commit is contained in:
parent
c3f5aafd77
commit
f549eaf523
13 changed files with 723 additions and 101 deletions
89
generic_skewer.lua
Normal file
89
generic_skewer.lua
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
require "entity"
|
||||
|
||||
GenericSkewer = class("GenericSkewer", Entity)
|
||||
|
||||
local edgeDirections = {
|
||||
{x = 1, y = 0}, {x = -1, y = 0},
|
||||
{x = 0, y = 1}, {x = 0, y = -1},
|
||||
}
|
||||
|
||||
local function shapeHasCell(shape, x, y)
|
||||
for _, cell in ipairs(shape) do
|
||||
if cell.x == x and cell.y == y then return true end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Draw two teeth on every exposed cell edge. The art remains synthetic: the
|
||||
-- underlying box sprite and its collision shape are still the authored base.
|
||||
function drawSkewerSprite(sprite, cellShape, x, y, scale)
|
||||
cellShape = cellShape or {{x = 1, y = 1}}
|
||||
local cellSize = 16 * scale
|
||||
local inset = scale
|
||||
local reach = 3 * scale
|
||||
local halfBase = 1.5 * scale
|
||||
|
||||
for _, cell in ipairs(cellShape) do
|
||||
local left = x + (cell.x - 1) * cellSize
|
||||
local top = y + (cell.y - 1) * cellSize
|
||||
for _, direction in ipairs(edgeDirections) do
|
||||
if not shapeHasCell(cellShape, cell.x + direction.x, cell.y + direction.y) then
|
||||
for _, along in ipairs({5, 11}) do
|
||||
if direction.x ~= 0 then
|
||||
local edgeX = direction.x > 0 and left + cellSize - inset or left + inset
|
||||
local centerY = top + along * scale
|
||||
love.graphics.polygon("fill",
|
||||
edgeX, centerY - halfBase,
|
||||
edgeX + direction.x * reach, centerY,
|
||||
edgeX, centerY + halfBase
|
||||
)
|
||||
else
|
||||
local edgeY = direction.y > 0 and top + cellSize - inset or top + inset
|
||||
local centerX = left + along * scale
|
||||
love.graphics.polygon("fill",
|
||||
centerX - halfBase, edgeY,
|
||||
centerX, edgeY + direction.y * reach,
|
||||
centerX + halfBase, edgeY
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
love.graphics.draw(sprite, x, y, 0, scale, scale)
|
||||
end
|
||||
|
||||
function GenericSkewer:initialize(x, y, color, sprite, name, cellShape)
|
||||
Entity.initialize(self, {
|
||||
name = name,
|
||||
x = x,
|
||||
y = y,
|
||||
color = color,
|
||||
collision = "moveable",
|
||||
skewer = true,
|
||||
sprite = sprite,
|
||||
cellShape = cellShape
|
||||
})
|
||||
end
|
||||
|
||||
function GenericSkewer:update()
|
||||
|
||||
end
|
||||
|
||||
function GenericSkewer:draw(channel)
|
||||
local sprite = self.sprites[channel]
|
||||
if not sprite then return end
|
||||
love.graphics.setColor(gColor[channel]:set())
|
||||
local p = self:getDrawPos()
|
||||
drawSkewerSprite(
|
||||
sprite, self:getCellShape(),
|
||||
p.x + self.drawOffset.x * drawScale,
|
||||
p.y + self.drawOffset.y * drawScale,
|
||||
drawScale
|
||||
)
|
||||
end
|
||||
|
||||
function GenericSkewer:tick()
|
||||
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue