89 lines
2.6 KiB
Lua
89 lines
2.6 KiB
Lua
local anim8 = require "lib/anim8"
|
|
require 'lib/vec3'
|
|
|
|
--- Скорость между кадрами в анимации
|
|
local ANIMATION_SPEED = 0.1
|
|
|
|
--- @class Character
|
|
--- @field name string
|
|
--- @field animationTable table<string, table>
|
|
--- @field state "idle"|"run"|"attack"|"hurt"
|
|
--- @field stats table<string, integer>
|
|
--- @field player table
|
|
--- @field skills table
|
|
--- @field class "warrior"|"mage"
|
|
--- @field position 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.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()
|
|
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
|
|
|
|
print(char)
|
|
|
|
char = setmetatable(char, character)
|
|
table.insert(Tree.level.characters, 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 }
|