streuner-game/src/engine/level.lua
Sebastian Hugentobler 814fc96669 update to love 0.10.1
2016-03-15 13:41:39 +01:00

151 lines
4.0 KiB
Lua

local sti = require 'engine/libs/sti'
local ui = require 'engine/ui'
local bump = require 'engine/libs/bump'
Level = class('Level')
Level.controllers = {}
function Level:init(name)
Level:load(name)
end
function Level:update(dt)
self.map:update(dt)
for _, controller in ipairs(self.controllers) do
controller.animation:update(dt)
end
end
function Level:draw(dt)
local translateX = 0
local translateY = 0
-- Draw Range culls unnecessary tiles
self.map:setDrawRange(
translateX,
translateY,
love.graphics.getWidth(),
love.graphics.getHeight())
self.map:draw()
ui:draw()
-- debugging
-- self.map:bump_draw(self.bumpworld)
end
function Level:showMessage(message)
ui:showMessage(message)
end
function Level:checkObjectAnimation(input)
for _, controller in ipairs(self.controllers) do
if controller.info.relevantInputs then
for _, relevantInput in ipairs(controller.info.relevantInputs) do
if relevantInput == input then
controller:stopAnimation()
end
end
end
end
end
function Level:checkObjectKeys(dt, input)
if not ui.active then
for _, controller in ipairs(self.controllers) do
if controller.info.relevantInputs then
for _, relevantInput in ipairs(controller.info.relevantInputs) do
if relevantInput == input then
controller:sendMovement(input)
break
end
end
end
end
else
for _, relevantInput in ipairs(ui.relevantInputs) do
if relevantInput == input then
ui:sendInput(input)
end
end
end
end
function Level:load(name)
local mapName = 'levels/' .. name
self.map = sti.new(mapName, { 'bump' })
self.bumpworld = bump.newWorld()
self.map:bump_init(self.bumpworld)
Level:initObjects()
end
function Level:startAnimate(objectName, animationName)
for _, controller in ipairs(self.controllers) do
if controller.info.name == objectName then
controller:startAnimation(animationName)
break
end
end
end
function Level:stopAnimate(objectName)
for _, controller in ipairs(self.controllers) do
if controller.info.name == objectName then
controller:stopAnimation()
break
end
end
end
function Level:initObjects()
self.controllers = {}
self.map:addCustomLayer('object layer', 5)
local objectLayer = self.map.layers['object layer']
objectLayer.controllers = {}
for _, obj in pairs(self.map.layers['objects'].objects) do
if obj.properties.has_controller then
local filename = 'objects/' .. obj.name .. '.lua'
local objectinfo = love.filesystem.load(filename)()
objectinfo.x = obj.x - Global.tilewidth / 4
objectinfo.y = obj.y
objectinfo.name = obj.name
objectinfo.image = love.graphics.newImage(objectinfo.spritesheet)
if obj.properties.collision then
for _, collisionObj in pairs(self.map.bump_collidables) do
if collisionObj.name == obj.properties.collision then
objectinfo.collision = collisionObj
break
end
end
end
local controller = Engine.controllers[objectinfo.controller](objectinfo, self.bumpworld)
table.insert(self.controllers, controller)
table.insert(objectLayer.controllers, controller)
end
end
-- Draw callback for Custom Layer
function objectLayer:draw()
table.sort(self.controllers, function(a, b) return a.info.y < b.info.y end)
for _, controller in pairs(self.controllers) do
controller:draw()
end
end
self.map.layers['objects'].visible = false
end
return Level