179 lines
4.5 KiB
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
|