Skip to content

Instantly share code, notes, and snippets.

@konsumer
Created March 17, 2021 19:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save konsumer/df3cccafda21248eb69d52742294cd2b to your computer and use it in GitHub Desktop.
Save konsumer/df3cccafda21248eb69d52742294cd2b to your computer and use it in GitHub Desktop.
example using shironecko/LuaMaze in love2d
local maze = require "lib.maze"
local Camera = require "lib.hump.camera"
math.randomseed(os.time())
--[[
generators:
sidewinder
recursive_backtracker
aldous_broder
binary_tree
eller
growing_tree
hunt_and_kill
kruskal
prim
recursive_division
wilson
]]
local Maze = Class {
player = {
x = 0,
y = 0
},
speed = 120
}
function Maze:init(width, height, image, tile_size, algo)
self.width = width or 10
self.height = height or 10
self.algo = algo or "eller"
self.image = love.graphics.newImage(image or "assets/tiles/maze.png")
self.tileSize = tile_size or 128
assert(maze.generators[self.algo], "Algorythm " .. self.algo .. " is not supported.")
self.maze = maze:new(self.width, self.height, true)
maze.generators[self.algo](self.maze)
-- print(self.maze)
self:build()
self.camera = Camera(self.player.x, self.player.y)
end
function Maze:build()
local quads = {
N = love.graphics.newQuad(self.tileSize * 0, 0, self.tileSize, self.tileSize, self.image:getWidth(), self.image:getHeight()),
S = love.graphics.newQuad(self.tileSize * 1, 0, self.tileSize, self.tileSize, self.image:getWidth(), self.image:getHeight()),
W = love.graphics.newQuad(self.tileSize * 2, 0, self.tileSize, self.tileSize, self.image:getWidth(), self.image:getHeight()),
E = love.graphics.newQuad(self.tileSize * 3, 0, self.tileSize, self.tileSize, self.image:getWidth(), self.image:getHeight()),
floor = love.graphics.newQuad(self.tileSize * 4, 0, self.tileSize, self.tileSize, self.image:getWidth(), self.image:getHeight())
}
self.batches = {}
for k,v in pairs(quads) do
self.batches[k] = love.graphics.newSpriteBatch( self.image, self.width*self.height )
end
-- TODO: add collisions
for yi = 1, #self.maze do
for xi = 1, #self.maze[1] do
self.batches.floor:add( quads.floor, (xi-1) * self.tileSize, (yi-1) * self.tileSize)
if self.maze[yi][xi].north:IsClosed() then
self.batches.N:add( quads.N, (xi-1) * self.tileSize, (yi-1) * self.tileSize)
end
if self.maze[yi][xi].east:IsClosed() then
self.batches.E:add( quads.E, (xi-1) * self.tileSize, (yi-1) * self.tileSize)
end
if self.maze[yi][xi].south:IsClosed() then
self.batches.S:add( quads.S, (xi-1) * self.tileSize, (yi-1) * self.tileSize)
end
if self.maze[yi][xi].west:IsClosed() then
self.batches.W:add( quads.W, (xi-1) * self.tileSize, (yi-1) * self.tileSize)
end
end
end
end
function Maze:update(dt)
if input_down("right") then
self.player.x = self.player.x + (self.speed * dt)
end
if input_down("left") then
self.player.x = self.player.x - (self.speed * dt)
end
if input_down("down") then
self.player.y = self.player.y + (self.speed * dt)
end
if input_down("up") then
self.player.y = self.player.y - (self.speed * dt)
end
local dx,dy = self.player.x - self.camera.x, self.player.y - self.camera.y
self.camera:move(dx/2, dy/2)
end
function Maze:draw()
self.camera:attach()
love.graphics.draw(self.batches.floor, 0, 0)
love.graphics.draw(self.batches.N, 0, 0)
love.graphics.draw(self.batches.S, 0, 0)
love.graphics.draw(self.batches.W, 0, 0)
love.graphics.draw(self.batches.E, 0, 0)
self.camera:detach()
end
return Maze
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment