From 5cead3c28291a1785797ec0741342437535a0013 Mon Sep 17 00:00:00 2001 From: Ivan Yuriev Date: Sun, 7 Sep 2025 14:27:20 +0300 Subject: [PATCH] fixed character z-ordering while moving --- lib/level/grid/character_grid.lua | 10 ++++++++++ lib/level/level.lua | 6 +++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/level/grid/character_grid.lua b/lib/level/grid/character_grid.lua index 1c51d2c..0192f1e 100644 --- a/lib/level/grid/character_grid.lua +++ b/lib/level/grid/character_grid.lua @@ -1,6 +1,8 @@ local utils = require "lib.utils.utils" +local pQueue = require "lib.utils.priority_queue" --- @class CharacterGrid : Grid --- @field __grid {string: Id|nil} +--- @field yOrderQueue PriorityQueue очередь отрисовки сверху вниз local grid = setmetatable({}, require "lib.level.grid.base") grid.__index = grid @@ -21,13 +23,21 @@ function grid:add(id) end end +--- @param a Character +--- @param b Character +local function drawCmp(a, b) + return a.logic.mapLogic.displayedPosition.y < b.logic.mapLogic.displayedPosition.y +end + --- fills the grid with the actual data --- --- should be called as early as possible during every tick function grid:reload() self:reset() + self.yOrderQueue = pQueue.new(drawCmp) utils.each(Tree.level.characters, function(c) self:add(c.id) + self.yOrderQueue:insert(c) end) end diff --git a/lib/level/level.lua b/lib/level/level.lua index 1c603ff..6362402 100644 --- a/lib/level/level.lua +++ b/lib/level/level.lua @@ -39,9 +39,9 @@ end function level:draw() self.tileGrid:draw() - utils.each(self.characters, function(el) - el:draw() - end) + while not self.characterGrid.yOrderQueue:is_empty() do -- по сути это сортировка кучей за n log n, но линейное + self.characterGrid.yOrderQueue:pop():draw() + end end return {