From 1c29ae0dfac6a60e84925bfc18b81515d09b3ae3 Mon Sep 17 00:00:00 2001 From: Kazhnuz Date: Mon, 17 Jun 2019 13:01:04 +0200 Subject: [PATCH] refactor(levels): let the player manage itself how it respawn --- .../scenes/levels/entities/player.lua | 35 ++++++++++++++++--- .../scenes/levels/players.lua | 13 +------ .../scenes/levels/world.lua | 7 ++++ 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/imperium-porcorum.love/scenes/levels/entities/player.lua b/imperium-porcorum.love/scenes/levels/entities/player.lua index db7da5e..877409b 100644 --- a/imperium-porcorum.love/scenes/levels/entities/player.lua +++ b/imperium-porcorum.love/scenes/levels/entities/player.lua @@ -1,15 +1,17 @@ local Entity = require "scenes.levels.entities.parent" local Player = Entity:extend() -local PLAYER_W, PLAYER_H = 32, 24 +local PLAYER_W, PLAYER_H = 32, 24 +local TEMP_PLAYERID = 1 -- INIT functions -- Initialize the player -function Player:new(world, x, y, playerID) +function Player:new(world, x, y) self.direction = 1 self.startx, self.starty = x, y + self:setSpawnPoint(x, y) Player.super.new(self, world, "player", x, y, PLAYER_W, PLAYER_H) @@ -21,7 +23,7 @@ function Player:new(world, x, y, playerID) } self.stats = {} - self:initStats(playerID) + self:initStats(TEMP_PLAYERID) self:initWeapon() self:initHUD() @@ -100,6 +102,12 @@ function Player:updateEnd(dt) self:setAnimation() end +function Player:timerResponse(timer) + if (timer == "respawn") then + self:respawn() + end +end + function Player:setFilter() self.filter = function(item, other) if (other.type == "wall") then return 'slide' @@ -293,6 +301,23 @@ end -- DEATH and HIT functions -- All function related to damage management +function Player:setSpawnPoint(x, y) + self.spawn = {} + self.spawn.x = x + self.spawn.y = y +end + +function Player:goToSpawnPoint( ) + self.x = self.spawn.x + self.y = self.spawn.y + self.world:changeActorData(self) +end + +function Player:respawn() + self.isAlive = true + self:goToSpawnPoint( ) +end + function Player:resetLife() self.hp = self.stats.maxHP self.mp = self.stats.maxMP @@ -309,8 +334,8 @@ function Player:takeHit(damage) end function Player:die() - self.manager:setDeathTimer(1) - self:destroy() + self:addTimer("respawn", 1) + self.isAlive = false end diff --git a/imperium-porcorum.love/scenes/levels/players.lua b/imperium-porcorum.love/scenes/levels/players.lua index 83df232..e790498 100644 --- a/imperium-porcorum.love/scenes/levels/players.lua +++ b/imperium-porcorum.love/scenes/levels/players.lua @@ -4,8 +4,6 @@ local Obj = require "scenes.levels.entities" function PlayerManager:new(scene) self.scene = scene self.players = {} - self.deathTimer = -100 - self.activePlayer = -1 self.startx, self.starty = self.scene.world:getStartPosition() end @@ -65,10 +63,6 @@ function PlayerManager:playerExist(id) return (self.players[id] ~= nil) end -function PlayerManager:setDeathTimer(timer) - self.deathTimer = timer -end - function PlayerManager:playerHaveObject(id) player = self:getPlayerByID(id) @@ -83,12 +77,7 @@ end -- Update the death timer and respawn the player when it's done function PlayerManager:update(dt) - if (self.deathTimer > 0) then - self.deathTimer = self.deathTimer - dt - elseif (self.deathTimer > -100) then - self:spawnPlayer(self.activePlayer) - self.deathTimer = -100 - end + end -- DRAW FUNCTIONS diff --git a/imperium-porcorum.love/scenes/levels/world.lua b/imperium-porcorum.love/scenes/levels/world.lua index b79e988..9bff7fe 100644 --- a/imperium-porcorum.love/scenes/levels/world.lua +++ b/imperium-porcorum.love/scenes/levels/world.lua @@ -43,6 +43,13 @@ function World:getStartPosition() return startx, starty end +-- ACTORS FUNCTIONS +-- Some Bump2D Wrapper not handled by gamecore + +function World:changeActorData(actor) + self.actors:update(actor, actor.x, actor.y, actor.w, actor.h) +end + -- MAP FUNCTIONS -- All map wrappers