You know.. maybe that "setting up a new one" stuff shouldn't be IN the library at all. It's just clunking up loading.
64 lines
1.6 KiB
Lua
64 lines
1.6 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, tile_usage
|
|
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
|
|
|
|
local image_width, image_height = tile_image:getDimensions()
|
|
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
|
|
|
|
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)
|
|
|
|
tile_usage[tile_data.x][tile_data.y] = true
|
|
end
|
|
|
|
else
|
|
tile_image = load_image(data_or_path)
|
|
end
|
|
|
|
tilesheet.active_sheet = {
|
|
image = tile_image,
|
|
size = tile_size, -- unset on new
|
|
tiles = tiles, -- empty on new
|
|
tile_usage = tile_usage, -- unset on new
|
|
}
|
|
|
|
return tiles
|
|
end
|
|
|
|
return setmetatable(tilesheet, {
|
|
__call = function(self, ...) return tilesheet.load(...) end
|
|
})
|