diff --git a/assets/sprites/character/attack.png b/assets/sprites/character/attack.png new file mode 100644 index 0000000..8e9b7b0 Binary files /dev/null and b/assets/sprites/character/attack.png differ diff --git a/assets/sprites/character/conf.lua b/assets/sprites/character/conf.lua new file mode 100644 index 0000000..b30bcbd --- /dev/null +++ b/assets/sprites/character/conf.lua @@ -0,0 +1,3 @@ +return { + +} diff --git a/assets/sprites/character/hurt.png b/assets/sprites/character/hurt.png new file mode 100644 index 0000000..533cd55 Binary files /dev/null and b/assets/sprites/character/hurt.png differ diff --git a/assets/sprites/character/idle.png b/assets/sprites/character/idle.png new file mode 100644 index 0000000..2068a96 Binary files /dev/null and b/assets/sprites/character/idle.png differ diff --git a/assets/sprites/character/run.png b/assets/sprites/character/run.png new file mode 100644 index 0000000..9ca77fa Binary files /dev/null and b/assets/sprites/character/run.png differ diff --git a/character.lua b/character.lua index 3c0289f..14858d2 100644 --- a/character.lua +++ b/character.lua @@ -1,10 +1,11 @@ local anim8 = require "lib/anim8" require 'lib/vec3' +local AssetBundle = require "lib/asset_bundle" local CHARACTER_SIZE = 64 --- Для anim8, представляет из себя с какого по какого представлены спрайты для анимации -local ANIMATION_SIZE = '1-8' +local ANIMATION_SIZE = '1-6' --- Скорость между кадрами в анимации local ANIMATION_SPEED = 0.1 -- Константы ниже представляют из себя номер строки (с единицы), в которой находится та или иная анимация @@ -28,9 +29,21 @@ Character.animationTable = { -- etc etc } --- чтобы не обновлять все анимации одновременно, храним нужную анимацию здесь ---- + +--- меняем вместе с Character.animation +Character.state = "idle" --- когда нужно сменить анимацию с idle на run например, меняем именно это поле -Character.animation = Character.animationTable.idle + +Character.spriteSheet = { + animationSpeed = 0.1, + width = 96, + height = 64, + idle = '1-6', + run = '1-8', + attack = '1-11', + hurt = '1-6' +} + ---------- Statistics ----- @@ -60,31 +73,56 @@ Character.position = Vec3({}) --- Обёртка над Character:Create -- CreateCharacter = Character.create --- ты клоун же --- какого черта у тебя конструктор объекта принимает ссылку на объект --- --- хз --- ща я в душ --- :clown: --- Создаёт персонажа, которым будет управлять или игрок или компьютер --- @param name string ---- @param imagePath string +--- @param spriteDir table --- @param level? integer -function CreateCharacter(name, imagePath, level) -- aka Character.create(self, name, imagePath, level) +function CreateCharacter(name, spriteDir, level) -- aka Character.create(self, name, imagePath, level) -- TODO: добавить asset_loader, где все необходимые ассеты будут грузиться в одном месте, -- а здесь мы добавляем ассет на загрузку в очередь - local image = love.graphics.newImage(imagePath) - local animationGrid = anim8.newGrid(CHARACTER_SIZE, CHARACTER_SIZE, image:getWidth(), image:getHeight()) - return Character { + -- local image = love.graphics.newImage(imagePath) + 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 animationGrid = anim8.newGrid(96, 64, image:getWidth(), image:getHeight()) + local char = { name = name, animationTable = { - idle = anim8.newAnimation(animationGrid(ANIMATION_SIZE, IDLE_ROW), ANIMATION_SPEED), - run = anim8.newAnimation(animationGrid(ANIMATION_SIZE, RUN_ROW), ANIMATION_SPEED), - attack = anim8.newAnimation(animationGrid(ANIMATION_SIZE, ATTACK_ROW), ANIMATION_SPEED) } } + 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) + + return setmetatable(char, { __index = Character }) end function Character:update(dt) - self.animation: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(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) end diff --git a/lib/camera.lua b/lib/camera.lua index 7ef7bca..7e2f1b0 100644 --- a/lib/camera.lua +++ b/lib/camera.lua @@ -13,13 +13,13 @@ local camera = { velocity = Vec3 {}, acceleration = 0.2, speed = 5, - pixelsPerMeter = 100, - scale = 1 + pixelsPerMeter = 24, + scale = 2 } love.wheelmoved = function(x, y) - if camera.scale > 2 and y > 0 then return end; - if camera.scale < 0.5 and y < 0 then return end; + if camera.scale > 50 and y > 0 then return end; + if camera.scale < 0.005 and y < 0 then return end; camera.scale = camera.scale + 0.1 * y end diff --git a/main.lua b/main.lua index 6ccc444..155e902 100644 --- a/main.lua +++ b/main.lua @@ -5,12 +5,15 @@ require "character" local camera = require 'lib/camera' local Vec3 = require "lib/vec3" local tree = require "lib/tree" +local AssetBundle = require "lib/asset_bundle" function love.conf(t) t.console = true end function love.load() + AssetBundle:load() + Camera = camera.new() Camera.position = Vec3({}) -- PlayerFaction = Faction @@ -18,6 +21,8 @@ function love.load() -- Hero1 = Character:create("Petya", 10) -- Hero2 = Character:create("Andrysha", 12) + Hero = CreateCharacter("Hero", AssetBundle.files.sprites.character) + -- PlayerFaction.characters = { Hero1, Hero2 } love.window.setMode(1080, 720, { resizable = true, msaa = 4, vsync = true }) end @@ -29,6 +34,8 @@ end function love.update(dt) Camera:update(dt) tree.instance().panning:update(dt) + + Hero:update(dt) end function love.draw() @@ -46,6 +53,8 @@ function love.draw() love.graphics.rectangle('fill', 0, 0, width, height) 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(Camera) Camera:detach() end