local anim8 = require "lib/anim8" require 'lib/vec3' local CHARACTER_SIZE = 64 --- Для anim8, представляет из себя с какого по какого представлены спрайты для анимации local ANIMATION_SIZE = '1-8' --- Скорость между кадрами в анимации local ANIMATION_SPEED = 0.1 -- Константы ниже представляют из себя номер строки (с единицы), в которой находится та или иная анимация local IDLE_ROW = 1 local RUN_ROW = 2 local ATTACK_ROW = 3 --- @class Character local Character = {} Character.name = "" ---------- Animations ----- --- мы должны определиться со спрайтшитами и подобным, всё что здесь написано лишь пример --- --- предполагается, что у всех будет одинаковое кол-во кадров в анимации и их скорость произведения Character.animationTable = { idle = {}, run = {}, attack = {} -- etc etc } --- чтобы не обновлять все анимации одновременно, храним нужную анимацию здесь --- --- когда нужно сменить анимацию с idle на run например, меняем именно это поле Character.animation = Character.animationTable.idle ---------- 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 -- ты клоун же -- какого черта у тебя конструктор объекта принимает ссылку на объект -- -- хз -- ща я в душ -- :clown: --- Создаёт персонажа, которым будет управлять или игрок или компьютер --- @param name string --- @param imagePath string --- @param level? integer function CreateCharacter(name, imagePath, level) -- aka Character.create(self, name, imagePath, level) -- TODO: добавить asset_loader, где все необходимые ассеты будут грузиться в одном месте, -- а здесь мы добавляем ассет на загрузку в очередь local image = love.graphics.newImage(imagePath) local animationGrid = anim8.newGrid(CHARACTER_SIZE, CHARACTER_SIZE, image:getWidth(), image:getHeight()) return Character { name = name, animationTable = { idle = anim8.newAnimation(animationGrid(ANIMATION_SIZE, IDLE_ROW), ANIMATION_SPEED), run = anim8.newAnimation(animationGrid(ANIMATION_SIZE, RUN_ROW), ANIMATION_SPEED), attack = anim8.newAnimation(animationGrid(ANIMATION_SIZE, ATTACK_ROW), ANIMATION_SPEED) } } end function Character:update(dt) self.animation:update(dt) end