From a5ad1b98709a707d48c3a160ee80a08a396acc88 Mon Sep 17 00:00:00 2001 From: Neckrat Date: Fri, 1 Aug 2025 02:00:35 +0300 Subject: [PATCH] add camera Co-authored-by: Ivan Yuriev --- assets/sprites/test.png | Bin 0 -> 79209 bytes character.lua | 18 ++-- faction.lua | 36 ++++++- lib/asset_bundle.lua | 53 ++++++++++ lib/camera.lua | 215 +++++++++++++++++++++++++++++++++++++++ grid.lua => lib/grid.lua | 0 lib/level.lua | 5 + lib/tree.lua | 12 +++ lib/vec3.lua | 82 +++++++++++++++ main.lua | 75 +++++++++++++- 10 files changed, 483 insertions(+), 13 deletions(-) create mode 100644 assets/sprites/test.png create mode 100644 lib/asset_bundle.lua create mode 100644 lib/camera.lua rename grid.lua => lib/grid.lua (100%) create mode 100644 lib/level.lua create mode 100644 lib/tree.lua create mode 100644 lib/vec3.lua diff --git a/assets/sprites/test.png b/assets/sprites/test.png new file mode 100644 index 0000000000000000000000000000000000000000..0685450e39a22eabb913281d0416a71d61a0f564 GIT binary patch literal 79209 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 rM?7#2a(VB$2tr FactionList = {} -function addFaction(name) - FactionList[name] = {} - +--- @param name string +function AddFaction(name) + FactionList[name] = Faction { name = name } end +--- @param name string +--- @param character table +function AddCharacter(name, character) + if FactionList[name] == nil then + print("Cannot add character to faction ", name, "\nFaction does not exist!") + else + FactionList[name]:append(character) + end +end + +--- @param name string +--- @param character Character +function RemoveCharacter(name, character) + if FactionList[name].characters[character.name] == nil then + print("I cant remove character in Faction ", name, ", because this character doesnt exist!") + end + FactionList[name]:remove(character) +end + +--- @param character Character +function Faction:append(character) + self.characters[character.name] = character +end + +--- @param character Character +function Faction:remove(character) + self.characters[character.name] = nil +end diff --git a/lib/asset_bundle.lua b/lib/asset_bundle.lua new file mode 100644 index 0000000..7ff31b6 --- /dev/null +++ b/lib/asset_bundle.lua @@ -0,0 +1,53 @@ +local AssetBundle = { + root = "/assets", + files = {} +} + +function AssetBundle:load(onFileLoading) + local callback = onFileLoading or function(path) + print("[AssetBundle]: loading " .. path) + end + + local function enumerate(path) + local tree = {} + + local contents = love.filesystem.getDirectoryItems(path) + for _, v in pairs(contents) do + local newPath = path .. "/" .. v + local type = love.filesystem.getInfo(newPath).type + if type == "file" then + callback(newPath) + local data = self.loadFile(newPath) + tree[self.cutExtension(v)] = data + end + if type == "directory" then + tree[v] = enumerate(newPath) + end + end + + return tree + end + + self.files = enumerate(self.root) +end + +function AssetBundle.loadFile(path) + local filedata = love.filesystem.newFileData(path) + local ext = filedata:getExtension() + if (ext == "png") then + local img = love.graphics.newImage(path) + img:setFilter("nearest", "nearest") + return + img + elseif (ext == "glsl") then + return love.graphics.newShader(path); + end + + return nil +end + +function AssetBundle.cutExtension(filename) + return string.match(filename, '(.+)%.(.+)') +end + +return AssetBundle diff --git a/lib/camera.lua b/lib/camera.lua new file mode 100644 index 0000000..55a7e96 --- /dev/null +++ b/lib/camera.lua @@ -0,0 +1,215 @@ +--[[ +Copyright (c) 2010-2015 Matthias Richter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Except as contained in this notice, the name(s) of the above copyright holders +shall not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +]] -- + +local _PATH = (...):match('^(.*[%./])[^%.%/]+$') or '' +local cos, sin = math.cos, math.sin + +local camera = {} +camera.__index = camera + +-- Movement interpolators (for camera locking/windowing) +camera.smooth = {} + +function camera.smooth.none() + return function(dx, dy) return dx, dy end +end + +function camera.smooth.linear(speed) + assert(type(speed) == "number", "Invalid parameter: speed = " .. tostring(speed)) + return function(dx, dy, s) + -- normalize direction + local d = math.sqrt(dx * dx + dy * dy) + local dts = math.min((s or speed) * love.timer.getDelta(), d) -- prevent overshooting the goal + if d > 0 then + dx, dy = dx / d, dy / d + end + + return dx * dts, dy * dts + end +end + +function camera.smooth.damped(stiffness) + assert(type(stiffness) == "number", "Invalid parameter: stiffness = " .. tostring(stiffness)) + return function(dx, dy, s) + local dts = love.timer.getDelta() * (s or stiffness) + return dx * dts, dy * dts + end +end + +local function new(x, y, zoom, rot, smoother) + x, y = x or love.graphics.getWidth() / 2, y or love.graphics.getHeight() / 2 + zoom = zoom or 1 + rot = rot or 0 + smoother = smoother or camera.smooth.none() -- for locking, see below + return setmetatable({ x = x, y = y, scale = zoom, rot = rot, smoother = smoother }, camera) +end + +function camera:lookAt(x, y) + self.x, self.y = x, y + return self +end + +function camera:move(dx, dy) + self.x, self.y = self.x + dx, self.y + dy + return self +end + +function camera:position() + return self.x, self.y +end + +function camera:rotate(phi) + self.rot = self.rot + phi + return self +end + +function camera:rotateTo(phi) + self.rot = phi + return self +end + +function camera:zoom(mul) + self.scale = self.scale * mul + return self +end + +function camera:zoomTo(zoom) + self.scale = zoom + return self +end + +function camera:attach(x, y, w, h, noclip) + x, y = x or 0, y or 0 + w, h = w or love.graphics.getWidth(), h or love.graphics.getHeight() + + self._sx, self._sy, self._sw, self._sh = love.graphics.getScissor() + if not noclip then + love.graphics.setScissor(x, y, w, h) + end + + local cx, cy = x + w / 2, y + h / 2 + love.graphics.push() + love.graphics.translate(cx, cy) + love.graphics.scale(self.scale) + love.graphics.rotate(self.rot) + love.graphics.translate(-self.x, -self.y) +end + +function camera:detach() + love.graphics.pop() + love.graphics.setScissor(self._sx, self._sy, self._sw, self._sh) +end + +function camera:draw(...) + local x, y, w, h, noclip, func + local nargs = select("#", ...) + if nargs == 1 then + func = ... + elseif nargs == 5 then + x, y, w, h, func = ... + elseif nargs == 6 then + x, y, w, h, noclip, func = ... + else + error("Invalid arguments to camera:draw()") + end + + self:attach(x, y, w, h, noclip) + func() + self:detach() +end + +-- world coordinates to camera coordinates +function camera:cameraCoords(x, y, ox, oy, w, h) + ox, oy = ox or 0, oy or 0 + w, h = w or love.graphics.getWidth(), h or love.graphics.getHeight() + + -- x,y = ((x,y) - (self.x, self.y)):rotated(self.rot) * self.scale + center + local c, s = cos(self.rot), sin(self.rot) + x, y = x - self.x, y - self.y + x, y = c * x - s * y, s * x + c * y + return x * self.scale + w / 2 + ox, y * self.scale + h / 2 + oy +end + +-- camera coordinates to world coordinates +function camera:worldCoords(x, y, ox, oy, w, h) + ox, oy = ox or 0, oy or 0 + w, h = w or love.graphics.getWidth(), h or love.graphics.getHeight() + + -- x,y = (((x,y) - center) / self.scale):rotated(-self.rot) + (self.x,self.y) + local c, s = cos(-self.rot), sin(-self.rot) + x, y = (x - w / 2 - ox) / self.scale, (y - h / 2 - oy) / self.scale + x, y = c * x - s * y, s * x + c * y + return x + self.x, y + self.y +end + +function camera:mousePosition(ox, oy, w, h) + local mx, my = love.mouse.getPosition() + return self:worldCoords(mx, my, ox, oy, w, h) +end + +-- camera scrolling utilities +function camera:lockX(x, smoother, ...) + local dx, dy = (smoother or self.smoother)(x - self.x, self.y, ...) + self.x = self.x + dx + return self +end + +function camera:lockY(y, smoother, ...) + local dx, dy = (smoother or self.smoother)(self.x, y - self.y, ...) + self.y = self.y + dy + return self +end + +function camera:lockPosition(x, y, smoother, ...) + return self:move((smoother or self.smoother)(x - self.x, y - self.y, ...)) +end + +function camera:lockWindow(x, y, x_min, x_max, y_min, y_max, smoother, ...) + -- figure out displacement in camera coordinates + x, y = self:cameraCoords(x, y) + local dx, dy = 0, 0 + if x < x_min then + dx = x - x_min + elseif x > x_max then + dx = x - x_max + end + if y < y_min then + dy = y - y_min + elseif y > y_max then + dy = y - y_max + end + + -- transform displacement to movement in world coordinates + local c, s = cos(-self.rot), sin(-self.rot) + dx, dy = (c * dx - s * dy) / self.scale, (s * dx + c * dy) / self.scale + + -- move + self:move((smoother or self.smoother)(dx, dy, ...)) +end + +-- the module +return setmetatable({ new = new, smooth = camera.smooth }, + { __call = function(_, ...) return new(...) end }) diff --git a/grid.lua b/lib/grid.lua similarity index 100% rename from grid.lua rename to lib/grid.lua diff --git a/lib/level.lua b/lib/level.lua new file mode 100644 index 0000000..3addb26 --- /dev/null +++ b/lib/level.lua @@ -0,0 +1,5 @@ +local function new() + return { + characters = {} + } +end diff --git a/lib/tree.lua b/lib/tree.lua new file mode 100644 index 0000000..95edc48 --- /dev/null +++ b/lib/tree.lua @@ -0,0 +1,12 @@ +--- Дерево (таблица таблиц) для хранения всего состояния игры +--- Типа при запуске загружаем в него сейв и потом оно работает +--- В love.update обновлять, в love.draw читать + +local tree + +local function instance() + tree = tree or { + level = nil -- current level | nil + } + return tree +end diff --git a/lib/vec3.lua b/lib/vec3.lua new file mode 100644 index 0000000..79a6342 --- /dev/null +++ b/lib/vec3.lua @@ -0,0 +1,82 @@ +--- @class (exact) Vec3 +--- @field x number +--- @field y number +--- @field z number +local __Vec3 = { + x = 0, + y = 0, + z = 0, +} + +---Vec3 constructor +---@param vec number[] +---@return Vec3 +function Vec3(vec) + return setmetatable({ + x = vec[1] or 0, + y = vec[2] or 0, + z = vec[3] or 0, + }, { + __index = __Vec3, + __tostring = __Vec3.__tostring, + __add = __Vec3.add, + __mul = __Vec3.scale, + __unm = function(self) + return __Vec3.scale(self, -1) + end, + __sub = function(self, other) + return self + -other + end, + __eq = function(self, other) + return + self.x == other.x + and self.y == other.y + and self.z == other.z + end, + }) +end + +--- @param other Vec3 +--- @return Vec3 +function __Vec3:add(other) + return Vec3 { self.x + other.x, self.y + other.y, self.z + other.z } +end + +--- @param factor number +function __Vec3:scale(factor) + return Vec3 { self.x * factor, self.y * factor, self.z * factor } +end + +function __Vec3:length() + return math.sqrt(self.x ^ 2 + self.y ^ 2 + self.z ^ 2) +end + +function __Vec3:normalize() + local length = self:length() + if length == 0 then return nil end + return Vec3 { + self.x / length, + self.y / length, + self.z / length + } +end + +function __Vec3:direction() + return math.atan2(self.y, self.x) +end + +--- @param other Vec3 +function __Vec3:dot(other) + return self.x * other.x + self.y * other.y + self.z * other.z +end + +function __Vec3:__tostring() + return "Vec3{" .. self.x .. ", " .. self.y .. ", " .. self.z .. "}" +end + +--- @param other Vec3 +function __Vec3:angle_to(other) + return (other - self):direction() +end + +return Vec3 diff --git a/main.lua b/main.lua index 352716e..1b1cc26 100644 --- a/main.lua +++ b/main.lua @@ -1,26 +1,99 @@ +-- CameraLoader = require 'lib/camera' + require "character" +local Vec3 = require "lib/vec3" + +function love.conf(t) + t.console = true +end + +Camera = { + target = Vec3 {}, + position = Vec3 {}, + lerp_speed = 5.0, + max_offset = 1, -- на сколько метров камера может отдалиться от целевой позиции + max_offset_distance = 5 -- на сколько метров надо отвести мышь для максимального отдаления камеры +} +PIXELS_PER_METER = 100 + +function Camera:update(dt) + if not self.target then return end + + local mouse_offset = Vec3 { 0, 0, 0 } + local offset_distance = 0 + local adjusted_target = self.target * (self.max_offset * offset_distance / self.max_offset_distance) + + local to_target = adjusted_target - self.position + self.position = self.position + to_target * (dt * self.lerp_speed) +end + +-- Преобразует вектор мировых координат (в метрах) в вектоор экранных координат (в пикселях) +local function worldToScreen(worldPos) + return (worldPos - Camera.position) * PIXELS_PER_METER +end + function love.load() + Camera.target = Vec3({}) -- PlayerFaction = Faction -- Hero1 = Character:create("Petya", 10) -- Hero2 = Character:create("Andrysha", 12) -- PlayerFaction.characters = { Hero1, Hero2 } + love.window.setMode(1080, 720, { resizable = true, msaa = 4, vsync = true }) end -function love.update(dt) +---@todo Вынести это в свое поле в дереве глобального состояния уровня +-- local cameraPos = Vec3({}) +-- Camera:lockPosition(cameraPos.x, cameraPos.y, Camera.smooth.damped(10)) +function love.update(dt) + if love.keyboard.isDown("w") then Camera.target = Camera.target + Vec3({ 0, -dt }) end + if love.keyboard.isDown("a") then Camera.target = Camera.target + Vec3({ -dt }) end + if love.keyboard.isDown("s") then Camera.target = Camera.target + Vec3({ 0, dt }) end + if love.keyboard.isDown("d") then Camera.target = Camera.target + Vec3({ dt }) end + + Camera:update(dt) end function love.draw() + -- Camera:attach() + local uiSize = 0.2 + + local windowWidth = love.graphics.getWidth() + local windowHeight = love.graphics.getHeight() * (1 - uiSize) + local width = 20 + local height = 12 + + love.graphics.setColor(139 / 255, 195 / 255, 74 / 255, 1) + + love.graphics.rectangle('fill', worldToScreen(Vec3 {}).x, worldToScreen(Vec3 {}).y, width * PIXELS_PER_METER, + height * PIXELS_PER_METER) + love.graphics.setColor(244 / 255, 67 / 255, 54 / 255, 1) + love.graphics.rectangle('fill', worldToScreen(Vec3 {}).x, worldToScreen(Vec3 {}).y, 1 * PIXELS_PER_METER, + 1 * PIXELS_PER_METER) + + -- if windowWidth / windowHeight > width / height then + -- local fieldWidth = windowHeight * width / height + -- love.graphics.rectangle('fill', 0.5 * (windowWidth - fieldWidth), 0, + -- fieldWidth, windowHeight) + -- else + -- local fieldHeight = windowWidth * height / width + -- love.graphics.rectangle('fill', 0, 0.5 * (windowHeight - fieldHeight), + -- windowWidth, fieldHeight) + -- end + + -- Camera:detach() end local Level = {} Level.kakaya_ta_hren = 10 Level.map = {} +local v = Vec3({ 0, 1, 2 }) -- Faction -> Character -- calculate_order() +-- calculate_order()