Compare commits

...

6 Commits

Author SHA1 Message Date
187b8b3c74 Merge pull request 'feature/animateTo' (#21) from feature/animateTo into main
Reviewed-on: #21
2025-11-11 17:45:15 +03:00
e7e4071931 deleted tests 2025-11-11 00:01:42 +03:00
123885b2b3 Reset camera velocity when starting animation 2025-11-10 05:09:56 +03:00
c566d1669e Add mouse wheel support for zoom control in camera module (the dumb way) 2025-11-10 05:07:40 +03:00
331aefb0f6 i love easing4d
Co-authored-by: Ivan Yuriev <ivanyr44@gmail.com>
2025-11-09 22:16:40 +03:00
cdffff59c3 init camera:animateTo 2025-11-09 18:58:01 +03:00
2 changed files with 34 additions and 8 deletions

View File

@ -1,5 +1,3 @@
local utils = require "lib.utils.utils"
--- @alias Device "mouse" | "key" | "pad"
--- @param device Device
@ -17,6 +15,7 @@ controls.keymap = {
cameraMoveRight = control("key", "d"),
cameraMoveDown = control("key", "s"),
cameraMoveScroll = control("mouse", "3"),
cameraAnimateTo = control('key', 't'),
fullMana = control("key", "m"),
select = control("mouse", "1"),
endTurnTest = control("key", "e"),
@ -26,6 +25,12 @@ controls.keymap = {
local currentKeys = {}
local cachedKeys = {}
--- @type number
controls.mouseWheelY = 0
love.wheelmoved = function(x, y)
controls.mouseWheelY = y
end
--- polling controls in O(n)
--- should be called at the beginning of every frame
function controls:poll()
@ -49,6 +54,7 @@ function controls:cache()
for k, v in pairs(currentKeys) do
cachedKeys[k] = v
end
controls.mouseWheelY = 0
end
--- marks a control consumed for the current frame

View File

@ -9,6 +9,9 @@ local EPSILON = 0.001
--- @field speed number
--- @field pixelsPerMeter integer
--- @field scale number
--- @field animationNode AnimationNode?
--- @field animationEndPosition Vec3
--- @field animationBeginPosition Vec3
local camera = {
position = Vec3 {},
velocity = Vec3 {},
@ -27,12 +30,6 @@ camera.scale = camera:getDefaultScale()
---------------------------------------------------
love.wheelmoved = function(x, y)
if camera.scale > camera:getDefaultScale() * 5 and y > 0 then return end;
if camera.scale < camera:getDefaultScale() / 5 and y < 0 then return end;
camera.scale = camera.scale + (camera.scale * 0.1 * y)
end
local controlMap = {
cameraMoveUp = Vec3({ 0, -1 }),
cameraMoveLeft = Vec3({ -1 }),
@ -41,6 +38,19 @@ local controlMap = {
}
function camera:update(dt)
if self.animationNode and not (self.animationNode.t >= 1) then
self.animationNode:update(dt) -- тик анимации
self.position = utils.lerp(self.animationBeginPosition, self.animationEndPosition, self.animationNode:getValue())
return
end
-------------------- зум на колесо ---------------------
local y = Tree.controls.mouseWheelY
if camera.scale > camera:getDefaultScale() * 5 and y > 0 then return end;
if camera.scale < camera:getDefaultScale() / 5 and y < 0 then return end;
camera.scale = camera.scale + (camera.scale * 0.1 * y)
--------------------------------------------------------
local ps = Tree.panning
if ps.delta:length() > 0 then
local worldDelta = ps.delta:scale(1 / (self.pixelsPerMeter * self.scale)):scale(dt):scale(self.speed)
@ -87,6 +97,16 @@ function camera:detach()
love.graphics.pop()
end
--- @param position Vec3
--- @param animationNode AnimationNode
function camera:animateTo(position, animationNode)
if self.animationNode then self.animationNode:finish() end
self.animationNode = animationNode
self.animationEndPosition = position
self.animationBeginPosition = self.position
self.velocity = Vec3 {}
end
--- @return Camera
local function new()
return setmetatable({