From 8762ba3d858758fbf5558a423447d2d74785f77d Mon Sep 17 00:00:00 2001 From: Neckrat Date: Sun, 3 Aug 2025 19:32:24 +0300 Subject: [PATCH] rafactor character.lua --- character.lua | 101 ++++++++++++++------------------------------------ 1 file changed, 28 insertions(+), 73 deletions(-) diff --git a/character.lua b/character.lua index 06379ad..02702e3 100644 --- a/character.lua +++ b/character.lua @@ -1,87 +1,26 @@ local anim8 = require "lib/anim8" require 'lib/vec3' -local AssetBundle = require "lib/asset_bundle" -local CHARACTER_SIZE = 64 - ---- Для anim8, представляет из себя с какого по какого представлены спрайты для анимации -local ANIMATION_SIZE = '1-6' --- Скорость между кадрами в анимации local ANIMATION_SPEED = 0.1 --- Константы ниже представляют из себя номер строки (с единицы), в которой находится та или иная анимация -local IDLE_ROW = 1 -local RUN_ROW = 2 -local ATTACK_ROW = 3 --- @class Character +--- @field name string +--- @field animationTable table +--- @field state "idle"|"run"|"attack"|"hurt" +--- @field stats table +--- @field player table +--- @field skills table +--- @field class "warrior"|"mage" +--- @field position Vec3 local character = {} character.__index = character -character.name = "" - ----------- Animations ----- - ---- мы должны определиться со спрайтшитами и подобным, всё что здесь написано лишь пример ---- ---- предполагается, что у всех будет одинаковое кол-во кадров в анимации и их скорость произведения -character.animationTable = { - idle = {}, - run = {}, - attack = {} - -- etc etc -} ---- чтобы не обновлять все анимации одновременно, храним нужную анимацию здесь - ---- меняем вместе с Character.animation -character.state = "idle" ---- когда нужно сменить анимацию с idle на run например, меняем именно это поле - -character.spriteSheet = { - animationSpeed = 0.1, - width = 96, - height = 64, - idle = '1-6', - run = '1-8', - attack = '1-11', - hurt = '1-6' -} - - ----------- Statistics ----- - -character.stats = {} ---- TODO: придумать формулу расчёта статов относительно уровня -character.stats.level = 1 - -character.stats.initiative = 10 -character.stats.damage = 5 -character.stats.defence = 0 -character.stats.hp = 30 - -character.player = {} - ---- TODO: мнимая надежда на спеллмейкинг ---- ---- правда я абсолютно хз, как он будет смотреться ---- в контексте рогалика, но посмотрим ---- ---- мб это будет метаспеллмейкинг на овощах -character.skills = {} - -character.class = "" - -character.position = Vec3({}) - ---- Обёртка над Character:Create --- CreateCharacter = Character.create --- Создаёт персонажа, которым будет управлять или игрок или компьютер --- @param name string --- @param spriteDir table --- @param level? integer -local function spawn(name, spriteDir, level) -- aka Character.create(self, name, imagePath, level) - -- TODO: добавить asset_loader, где все необходимые ассеты будут грузиться в одном месте, - -- а здесь мы добавляем ассет на загрузку в очередь - -- local image = love.graphics.newImage(imagePath) +local function spawn(name, spriteDir, level) local animationGrid = {} -- n: name; i: image for n, i in pairs(spriteDir) do @@ -89,12 +28,16 @@ local function spawn(name, spriteDir, level) -- aka Character.create(self, name, local tiles = '1-' .. math.ceil(i:getWidth() / 96) animationGrid[n] = aGrid(tiles, 1) end - --local animationGrid = anim8.newGrid(96, 64, image:getWidth(), image:getHeight()) + local char = { name = name, - animationTable = { - } + animationTable = {} } + + char.position = Vec3({}) + + char.state = "idle" + char.animationTable.idle = anim8.newAnimation(animationGrid["idle"], ANIMATION_SPEED) char.animationTable.run = anim8.newAnimation(animationGrid["run"], ANIMATION_SPEED) char.animationTable.attack = anim8.newAnimation(animationGrid["attack"], ANIMATION_SPEED, function() @@ -103,6 +46,18 @@ local function spawn(name, spriteDir, level) -- aka Character.create(self, name, char.animationTable.hurt = anim8.newAnimation(animationGrid["hurt"], ANIMATION_SPEED, function() char.state = "idle" end) + + char.stats = {} + --- @todo придумать формулу расчёта статов относительно уровня + char.stats.level = 1 + + char.stats.initiative = 10 + char.stats.damage = 5 + char.stats.defence = 0 + char.stats.hp = 30 + + print(char) + char = setmetatable(char, character) table.insert(Tree.level.characters, char) return char