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

View File

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

View File

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