Files
love-tilesheet-tool/lib/tilesheet.lua
T
2026-10-29 18:13:08 -06:00

67 lines
1.7 KiB
Lua

local load_image = function(file_path)
local file = io.open(file_path, "rb")
local raw_data = file:read("*all")
file:close()
local love_file_data = love.filesystem.newFileData(raw_data, file_path)
local love_image = love.graphics.newImage(love_file_data)
return love_image
end
local tilesheet = {}
local tile_metatable = {
__index = {
draw = function(self, ...)
love.graphics.draw(self.image, self.quad, ...)
end,
}
}
local tilesheet.load = function(data_or_path)
local tile_image, tile_size
local tiles = {}
if type(data_or_path) == "table" then
tile_image = load_image(data_or_path.image_path)
tile_size = data_or_path.tile_size
for name, tile_data in pairs(data_or_path.tiles) do
tiles[name] = setmetatable({
image = tile_image,
quad = love.graphics.newQuad( (tile_data.x - 1) * tile_size, (tile_data.y - 1) * tile_size, tile_size, tile_size, tile_image ),
}, tile_metatable)
end
else
tile_image = load_image(data_or_path)
end
-- this mess feels kinda wasteful/repetitive
local image_width, image_height = tile_image:getDimensions()
local tile_usage = {}
for x = 1, image_width / tile_size do
tile_usage[x] = {}
for y = 1, image_height / tile_size do
tile_usage[x][y] = false
end
end
if type(data_or_path) == "table" then
for name, tile_data in pairs(data_or_path.tiles) do
tile_usage[tile_data.x][tile_data.y] = true
end
end
tilesheet.active_sheet = {
image = tile_image,
size = tile_size,
tiles = tiles,
tile_usage = tile_usage,
}
return tiles
end
return setmetatable(tilesheet, {
__call = function(self, ...) return tilesheet.load(...) end
})