diff --git a/character.lua b/character.lua index a1e3179..06379ad 100644 --- a/character.lua +++ b/character.lua @@ -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 } diff --git a/lib/level.lua b/lib/level.lua index d0a2043..417f240 100644 --- a/lib/level.lua +++ b/lib/level.lua @@ -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 } diff --git a/main.lua b/main.lua index e348b46..dd1cc21 100644 --- a/main.lua +++ b/main.lua @@ -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