Skip to content

Instantly share code, notes, and snippets.

@mebens mebens/Sheet.lua
Created Dec 14, 2012

Embed
What would you like to do?
A Tilemap class. Unsure if the collision code works.
Sheet = class("Sheet")
function Sheet:initialize(img, tileWidth, tileHeight)
self.x = 0
self.y = 0
self.image = img
self.tw = tileWidth
self.th = tileHeight
self.quads = {}
local i = 1
local iw, ih = img:getWidth(), img:getHeight()
for y = 0, ih, tileHeight do
for x = 0, iw, tileWidth do
self.quads[i] = love.graphics.newQuad(x, y, tileWidth, tileHeight, iw, ih)
i = i + 1
end
end
end
Tilemap = class("Tilemap", Sheet)
function Tilemap:initialize(img, columns, rows, tileWidth, tileHeight, solid)
Sheet.initialize(self, img, tileWidth, tileHeight)
self.cols = columns
self.rows = rows
self.batch = love.graphics.newSpriteBatch(img)
self.solid = solid
if solid then self.map = {} end
end
function Tilemap:draw()
love.graphics.draw(self.batch, self.x, self.y)
end
function Tilemap:set(x, y, index)
if index > 0 then self.batch:addq(self.quads[index], x * self.tw, y * self.th) end
if self.solid then self.map[y * self.cols + x] = index > 0 end
end
function Tilemap:load(t)
local i = 1
for y = 0, self.rows - 1 do
for x = 0, self.cols - 1 do
if t[i] > 0 then self:set(x, y, t[i]) end
i = i + 1
end
end
end
function Tilemap:collideRect(x, y, width, height)
x = math.floor((x - self.x) / self.tw)
y = math.floor((y - self.y) / self.th)
width = math.floor(width / self.tw)
height = math.floor(height / self.th)
for ix = x, width - 1 do
for iy = y, height - 1 do
if self.map[iy * self.cols + ix] then return true end
end
end
return false
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.