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