From df22b9ea3f32963c4843e72e6a1990472fd7f532 Mon Sep 17 00:00:00 2001 From: PeaAshMeter Date: Fri, 15 Aug 2025 06:12:53 +0300 Subject: [PATCH] refactor lerp --- lib/character/logic.lua | 11 ++++++----- lib/utils/utils.lua | 5 +++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/character/logic.lua b/lib/character/logic.lua index 73453f4..1466cc0 100644 --- a/lib/character/logic.lua +++ b/lib/character/logic.lua @@ -1,3 +1,5 @@ +local utils = require "lib.utils.utils" + --- @alias State "idle"|"run"|"attack"|"hurt" --- @class Logic @@ -35,10 +37,9 @@ end function logic:update(dt) if self.state == "run" and self.mapLogic.runTarget then - local vel = self.mapLogic.runTarget:subtract(self.mapLogic.position) --[[@as Vec3]] local delta = love.timer.getTime() - self.mapLogic.t0 or love.timer.getTime() - local fraction = delta / 0.5 - if fraction >= 1 then -- мы добежали до цели и сейчас в целевой клетке (возможно, промежуточной) + local fraction = delta / 0.5 -- бежим одну клетку за 500 мс + if fraction >= 1 then -- анимация перемещена завершена self.mapLogic.position = self.mapLogic.runTarget if not self.mapLogic.path:is_empty() then -- еще есть, куда бежать self:runTo(self.mapLogic.path:peek_front()) @@ -47,8 +48,8 @@ function logic:update(dt) self.state = "idle" self.mapLogic.runTarget = nil end - else -- мы не добежали до цели - self.mapLogic.displayedPosition = self.mapLogic.position:add(vel:scale(fraction)) + else -- анимация перемещения не завершена + self.mapLogic.displayedPosition = utils.lerp(self.mapLogic.position, self.mapLogic.runTarget, fraction) -- линейный интерполятор end end diff --git a/lib/utils/utils.lua b/lib/utils/utils.lua index c0700b6..e39d03e 100644 --- a/lib/utils/utils.lua +++ b/lib/utils/utils.lua @@ -69,4 +69,9 @@ function P.keys(t) return _t end +--- Linear interpolation +function P.lerp(from, to, t) + return from + (to - from) * t +end + return P