moved characters into the global tree

This commit is contained in:
Ivan Yuriev 2025-08-03 05:28:47 +03:00
parent 9abb55dd1d
commit 1be19bfb46
3 changed files with 38 additions and 32 deletions

View File

@ -14,15 +14,16 @@ local RUN_ROW = 2
local ATTACK_ROW = 3
--- @class Character
local Character = {}
Character.name = ""
local character = {}
character.__index = character
character.name = ""
---------- Animations -----
--- мы должны определиться со спрайтшитами и подобным, всё что здесь написано лишь пример
---
--- предполагается, что у всех будет одинаковое кол-во кадров в анимации и их скорость произведения
Character.animationTable = {
character.animationTable = {
idle = {},
run = {},
attack = {}
@ -31,10 +32,10 @@ Character.animationTable = {
--- чтобы не обновлять все анимации одновременно, храним нужную анимацию здесь
--- меняем вместе с Character.animation
Character.state = "idle"
character.state = "idle"
--- когда нужно сменить анимацию с idle на run например, меняем именно это поле
Character.spriteSheet = {
character.spriteSheet = {
animationSpeed = 0.1,
width = 96,
height = 64,
@ -47,16 +48,16 @@ Character.spriteSheet = {
---------- Statistics -----
Character.stats = {}
character.stats = {}
--- TODO: придумать формулу расчёта статов относительно уровня
Character.stats.level = 1
character.stats.level = 1
Character.stats.initiative = 10
Character.stats.damage = 5
Character.stats.defence = 0
Character.stats.hp = 30
character.stats.initiative = 10
character.stats.damage = 5
character.stats.defence = 0
character.stats.hp = 30
Character.player = {}
character.player = {}
--- TODO: мнимая надежда на спеллмейкинг
---
@ -64,11 +65,11 @@ Character.player = {}
--- в контексте рогалика, но посмотрим
---
--- мб это будет метаспеллмейкинг на овощах
Character.skills = {}
character.skills = {}
Character.class = ""
character.class = ""
Character.position = Vec3({})
character.position = Vec3({})
--- Обёртка над Character:Create
-- CreateCharacter = Character.create
@ -77,7 +78,7 @@ Character.position = Vec3({})
--- @param name string
--- @param spriteDir table
--- @param level? integer
function CreateCharacter(name, spriteDir, level) -- aka Character.create(self, name, imagePath, level)
local function spawn(name, spriteDir, level) -- aka Character.create(self, name, imagePath, level)
-- TODO: добавить asset_loader, где все необходимые ассеты будут грузиться в одном месте,
-- а здесь мы добавляем ассет на загрузку в очередь
-- local image = love.graphics.newImage(imagePath)
@ -102,11 +103,12 @@ function CreateCharacter(name, spriteDir, level) -- aka Character.create(self, n
char.animationTable.hurt = anim8.newAnimation(animationGrid["hurt"], ANIMATION_SPEED, function()
char.state = "idle"
end)
return setmetatable(char, { __index = Character })
char = setmetatable(char, character)
table.insert(Tree.level.characters, char)
return char
end
function Character:update(dt)
function character:update(dt)
if love.keyboard.isDown("r") then
self.state = "run"
end
@ -122,8 +124,10 @@ function Character:update(dt)
self.animationTable[self.state]:update(dt)
end
function Character:draw()
local camera = Tree.level.camera
self.animationTable[self.state]:draw(AssetBundle.files.sprites.character[self.state], self.position.x,
self.position.y, nil, 1 / camera.pixelsPerMeter, 1 / camera.pixelsPerMeter, 38, 47)
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 }

View File

@ -21,6 +21,12 @@ function level:update(dt)
self.camera:update(dt)
end
function level:draw()
utils.each(self.characters, function(el)
el:draw()
end)
end
return {
new = new
}

View File

@ -1,6 +1,6 @@
-- CameraLoader = require 'lib/camera'
require "character"
local character = require "character"
require "lib/tree"
function love.conf(t)
@ -8,12 +8,9 @@ function love.conf(t)
end
function love.load()
-- PlayerFaction = Faction
-- Hero1 = Character:create("Petya", 10)
-- Hero2 = Character:create("Andrysha", 12)
Hero = CreateCharacter("Hero", Tree.assets.files.sprites.character)
character.spawn("Hero", Tree.assets.files.sprites.character)
local hero2 = character.spawn("Hero2", Tree.assets.files.sprites.character)
hero2.position = Vec3 { 1, 1 }; -- вообще-то мы вообще не хотим как-то взаимодействовать с персонажем за пределами update, но это удобно для тестов
-- PlayerFaction.characters = { Hero1, Hero2 }
love.window.setMode(1080, 720, { resizable = true, msaa = 4, vsync = true })
@ -22,7 +19,6 @@ end
function love.update(dt)
Tree.panning:update(dt)
Tree.level:update(dt)
Hero:update(dt)
end
function love.draw()
@ -37,7 +33,7 @@ function love.draw()
love.graphics.setColor(244 / 255, 67 / 255, 54 / 255, 1)
love.graphics.rectangle('fill', 0, 0, 1, 1)
love.graphics.setColor(1, 1, 1, 1)
Hero:draw()
Tree.level:draw()
Tree.level.camera:detach()
end