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 })