implement character:die()

This commit is contained in:
PeaAshMeter 2026-01-17 17:43:29 +03:00
parent 7ff7e47a90
commit e088fddf48
4 changed files with 31 additions and 0 deletions

View File

@ -11,6 +11,11 @@ behavior.id = "behavior"
function behavior.new() return setmetatable({}, behavior) end function behavior.new() return setmetatable({}, behavior) end
--- это деструктор с крутым названием
function behavior:die()
end
function behavior:update(dt) end function behavior:update(dt) end
function behavior:draw() end function behavior:draw() end

View File

@ -80,6 +80,18 @@ function character:addBehavior(behaviors)
return self return self
end 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) function character:update(dt)
for _, b in ipairs(self.behaviors) do for _, b in ipairs(self.behaviors) do
if b.update then b:update(dt) end if b.update then b:update(dt) end

View File

@ -3,6 +3,7 @@ local utils = require "lib.utils.utils"
--- @class Level --- @class Level
--- @field size Vec3 --- @field size Vec3
--- @field characters Character[] --- @field characters Character[]
--- @field deadIds Id[]
--- @field characterGrid CharacterGrid --- @field characterGrid CharacterGrid
--- @field lightGrid LightGrid --- @field lightGrid LightGrid
--- @field selector Selector --- @field selector Selector
@ -21,6 +22,7 @@ local function new(type, template)
return setmetatable({ return setmetatable({
size = size, size = size,
characters = {}, characters = {},
deadIds = {},
characterGrid = (require "lib.level.grid.character_grid").new(), characterGrid = (require "lib.level.grid.character_grid").new(),
lightGrid = (require "lib.level.grid.light_grid").new(), lightGrid = (require "lib.level.grid.light_grid").new(),
tileGrid = (require "lib.level.grid.tile_grid").new(type, template, size), tileGrid = (require "lib.level.grid.tile_grid").new(type, template, size),
@ -33,6 +35,11 @@ local function new(type, template)
end end
function level:update(dt) function level:update(dt)
utils.each(self.deadIds, function(id)
self.characters[id] = nil
end)
self.deadIds = {}
self.characterGrid:reload() self.characterGrid:reload()
self.lightGrid:reload() self.lightGrid:reload()
utils.each(self.characters, function(el) utils.each(self.characters, function(el)

View File

@ -61,6 +61,13 @@ function love.update(dt)
Tree.controls:cache() 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() local t2 = love.timer.getTime()
lt = string.format("%.3f", (t2 - t1) * 1000) lt = string.format("%.3f", (t2 - t1) * 1000)
end end