local anim8 = require "lib/anim8" require 'lib/vec3' --- Скорость между кадрами в анимации local ANIMATION_SPEED = 0.1 local characterId = 1 --- @class Character --- @field id integer --- @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 --- @field size Vec3 local character = {} character.__index = character --- Создаёт персонажа, которым будет управлять или игрок или компьютер --- @param name string --- @param spriteDir table --- @param level? integer local function spawn(name, spriteDir, level) local animationGrid = {} -- n: name; i: image for n, i in pairs(spriteDir) do local aGrid = anim8.newGrid(96, 64, i:getWidth(), i:getHeight()) local tiles = '1-' .. math.ceil(i:getWidth() / 96) animationGrid[n] = aGrid(tiles, 1) end local char = { name = name, animationTable = {} } char.id = characterId characterId = characterId + 1 char.position = Vec3({}) char.size = Vec3({ 1, 1 }) 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() char.state = "idle" end) 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 char = setmetatable(char, character) Tree.level.characters[char.id] = char return char end function character:update(dt) if love.keyboard.isDown("r") then self.state = "run" end if love.keyboard.isDown("i") then self.state = "idle" end if love.keyboard.isDown("u") then self.state = "attack" end if love.keyboard.isDown("h") then self.state = "hurt" end self.animationTable[self.state]:update(dt) end function character:draw() local ppm = Tree.level.camera.pixelsPerMeter self.animationTable[self.state]:draw(Tree.assets.files.sprites.character[self.state], self.position.x, self.position.y, nil, 1 / ppm, 1 / ppm, 38, 47) end return { spawn = spawn }