project-witchy/imperium-porcorum.love/scenes/levels/world.lua

179 lines
4.5 KiB
Lua

local World2D = require "core.modules.world.world2D"
local World = World2D:extend()
local Obj = require "scenes.levels.entities"
local Sti = require "libs.sti"
-- INIT FUNCTIONS
-- All functions to init the world and the map
function World:new(scene, mapfile)
self.scene = scene
self.map = Sti("assets/maps/" .. mapfile .. ".lua")
self.obj = Obj
self:initActors()
self.backcolor = self.map.backgroundcolor or {0, 0, 0}
self.activeObjects = 0
end
function World:load()
self:loadCollisions()
self:loadEntities()
end
function World:loadEntities()
for k, objectlayer in pairs(self.map.layers) do
if (self:isEntityLayer(objectlayer.name)) then
for k, object in pairs(objectlayer.objects) do
self:addEntityByNameOnGrid( objectlayer.name, object.x, object.y,
object.width, object.height )
end
self.map:removeLayer(objectlayer.name)
end
end
end
function World:isEntityLayer(layername)
return (self.obj.index[layername] ~= nil)
end
function World:addEntityByNameOnGrid(name, x, y, w, h)
local objWidth, objHeight = 16, 16
local cellHor = math.ceil(w / objWidth)
local cellVert = math.ceil(h / objHeight)
for i=1, cellHor do
for j=1, cellVert do
self:addEntityByName(name, x + (i-1)*objWidth, y + (j-1)*objHeight)
end
end
end
function World:addEntityByName(name, x, y)
self.obj.index[name](self.scene, x, y)
end
function World:loadCollisions()
for k, objectlayer in pairs(self.map.layers) do
if self:isCollisionLayer(objectlayer.name) then
for k, object in pairs(objectlayer.objects) do
self:addCollision(object.x,object.y,object.width,object.height, objectlayer.name)
end
self.map:removeLayer(objectlayer.name)
end
end
end
function World:getStartPosition()
local startx, starty
for k, objectlayer in pairs(self.map.layers) do
if objectlayer.name == "playerstart" then
for k, object in pairs(objectlayer.objects) do
startx = object.x + (object.width/2)
starty = object.y + (object.height) - 12
end
self.map:removeLayer("playerstart")
end
end
return startx, starty
end
function World:isCollisionLayer(layername)
return (self.obj.collisions[layername] == true)
end
function World:addCollision(x, y, w, h, name)
-- Rajouter un block solide dans le monde physique
if w == 0 then
w = 1
end
self.obj.Collision(self.scene, x, y, w, h, name)
end
-- MAP FUNCTIONS
-- All map wrappers
function World:getDimensions()
return self.map.width * self.map.tilewidth,
self.map.height * self.map.tileheight
end
function World:setBackgroundColor(r, g, b)
self.backcolor = {r, g, b}
end
function World:getBackgroundColor()
return self.backcolor[1]/256, self.backcolor[2]/256, self.backcolor[3]/256
end
-- UPDATE FUNCTIONS
-- All update functions
function World:update(dt)
self:updateEntities(dt)
self:updateMap(dt)
end
function World:updateEntities(dt)
--l,t,w,h = l or 0, t or 0, w or self.width, h or self.height
local visibleThings, len = self.scene.camera:getVisibleEntities()
--table.sort(visibleThings, sortByUpdateOrder)
for i=1, len do
visibleThings[i]:update(dt)
end
self.activeObjects = len
end
function World:updateMap(dt)
self.map:update(dt)
end
-- DRAW FUNCTIONS
-- All function to draw the map, world and entities
function World:draw()
-- Ona attache puis détache la caméra pour dessiner le monde, afin que celui
-- reste "fixe" tandis que le jouer bouge.
self:drawBackgroundColor()
self.scene.camera:attach()
self:drawMap()
self:drawEntities()
self.scene.camera:detach()
end
function World:drawEntities()
--l,t,w,h = l or 0, t or 0, w or self.width, h or self.height
local visibleThings, len = self.scene.camera:getVisibleEntities()
--table.sort(visibleThings, sortByUpdateOrder)
for i=1, len do
visibleThings[i]:draw(dt)
end
end
function World:drawMap()
-- Du à la manière dont fonctionne STI, on est obligé de récupérer les info
-- de position de camera pour afficher la carte par rapport à ces infos
local tx, ty = self.scene.camera:getCoord()
local scale = self.scene.camera:getScale()
local tx = tx
local ty = ty
tx = math.floor(tx)
ty = math.floor(ty)
self.map:draw(-tx, -ty, scale, scale)
end
function World:drawBackgroundColor()
local r, g, b = self.backcolor[1], self.backcolor[2], self.backcolor[3]
love.graphics.setColor(r/256, g/256, b/256)
love.graphics.rectangle("fill", 0, 0, 480, 272)
utils.graphics.resetColor()
end
return World