From e088fddf48b64938a93b37e549327c1c28370883 Mon Sep 17 00:00:00 2001 From: PeaAshMeter Date: Sat, 17 Jan 2026 17:43:29 +0300 Subject: [PATCH] implement character:die() --- lib/character/behaviors/behavior.lua | 5 +++++ lib/character/character.lua | 12 ++++++++++++ lib/level/level.lua | 7 +++++++ main.lua | 7 +++++++ 4 files changed, 31 insertions(+) diff --git a/lib/character/behaviors/behavior.lua b/lib/character/behaviors/behavior.lua index 37e6775..0dec6bb 100644 --- a/lib/character/behaviors/behavior.lua +++ b/lib/character/behaviors/behavior.lua @@ -11,6 +11,11 @@ behavior.id = "behavior" function behavior.new() return setmetatable({}, behavior) end +--- это деструктор с крутым названием +function behavior:die() + +end + function behavior:update(dt) end function behavior:draw() end diff --git a/lib/character/character.lua b/lib/character/character.lua index d64f9d0..b9d9a50 100644 --- a/lib/character/character.lua +++ b/lib/character/character.lua @@ -80,6 +80,18 @@ function character:addBehavior(behaviors) return self end +--- Добавляет персонажа в очередь на удаление. +--- В конце фрейма он умирает. Ужасной смертью. +--- +--- Ещё этот метод должен освобождать ресурсы в поведениях. Мы против утечек памяти! +function character:die() + for _, b in ipairs(self.behaviors) do + if b.die then b:die() end + end + + table.insert(Tree.level.deadIds, self.id) +end + function character:update(dt) for _, b in ipairs(self.behaviors) do if b.update then b:update(dt) end diff --git a/lib/level/level.lua b/lib/level/level.lua index 13be418..17ddb34 100644 --- a/lib/level/level.lua +++ b/lib/level/level.lua @@ -3,6 +3,7 @@ local utils = require "lib.utils.utils" --- @class Level --- @field size Vec3 --- @field characters Character[] +--- @field deadIds Id[] --- @field characterGrid CharacterGrid --- @field lightGrid LightGrid --- @field selector Selector @@ -21,6 +22,7 @@ local function new(type, template) return setmetatable({ size = size, characters = {}, + deadIds = {}, characterGrid = (require "lib.level.grid.character_grid").new(), lightGrid = (require "lib.level.grid.light_grid").new(), tileGrid = (require "lib.level.grid.tile_grid").new(type, template, size), @@ -33,6 +35,11 @@ local function new(type, template) end function level:update(dt) + utils.each(self.deadIds, function(id) + self.characters[id] = nil + end) + self.deadIds = {} + self.characterGrid:reload() self.lightGrid:reload() utils.each(self.characters, function(el) diff --git a/main.lua b/main.lua index b291035..846cac0 100644 --- a/main.lua +++ b/main.lua @@ -61,6 +61,13 @@ function love.update(dt) Tree.controls:cache() + if t1 > 2 then + local foodor = Tree.level.characters[1] + if not foodor then return end + print("Killing Foodor") + foodor:die() + end + local t2 = love.timer.getTime() lt = string.format("%.3f", (t2 - t1) * 1000) end