58 lines
1.4 KiB
Lua
58 lines
1.4 KiB
Lua
--- @class TileAtlasData
|
||
--- @field x number
|
||
--- @field y number
|
||
--- @field tileSize number
|
||
--- @field atlas love.Image
|
||
--- @field isClip boolean
|
||
--- @field quad love.Quad | nil
|
||
local tileAtlasData = {}
|
||
tileAtlasData.__index = tileAtlasData
|
||
|
||
function tileAtlasData:getQuad()
|
||
if self.quad then return self.quad end
|
||
self.quad = love.graphics.newQuad(self.x, self.y, self.tileSize, self.tileSize, self.atlas)
|
||
return self.quad
|
||
end
|
||
|
||
-----------------------------------------------------------------
|
||
|
||
--- @class Tile
|
||
--- @field atlasData TileAtlasData
|
||
--- @field position Vec3
|
||
local tile = {}
|
||
tile.__index = tile
|
||
|
||
--- TODO: сделать как love.graphics.draw несколько сигнатур у функции
|
||
--- @param atlasData TileAtlasData
|
||
local function new(atlasData)
|
||
return setmetatable({
|
||
atlasData = setmetatable(atlasData, tileAtlasData)
|
||
}, tile)
|
||
end
|
||
|
||
function tile:draw()
|
||
love.graphics.draw(self.atlasData.atlas, self.atlasData:getQuad(), self.position.x,
|
||
self.position.y,
|
||
nil, 1 / 32, 1 / 32)
|
||
end
|
||
|
||
--- @param values table
|
||
--- @return Tile
|
||
function tile:copyWith(values)
|
||
for k, v in pairs(self) do
|
||
values[k] = v
|
||
end
|
||
return setmetatable(values, tile)
|
||
end
|
||
|
||
--- @param quad love.Quad
|
||
--- @param isClip boolean
|
||
local function fromQuad(quad, isClip)
|
||
return setmetatable({
|
||
isClip = isClip,
|
||
quad = quad
|
||
})
|
||
end
|
||
|
||
return { new = new }
|