I'm using the anim8 library to move a sprite around - https://github.com/kikito/anim8. The problem I encounter is when I hold onto a key to move sprite in a particular direction, the animation freezes on the very last frame called. I want continous animation flow as I hold onto a key. Very similar to this posters request - viewtopic.php?f=4&t=24768, but using the anim8 lib. The difference here is that I'm guessing love.keyboard.isDown IS checking for a boolean value? Here's my code:
local anim8 = require('lib.anim8.anim8')
local player, animation, g
function love.load()
player = {}
player.spritesheet = love.graphics.newImage('sprites/hero.png')
player. x = 200
player.y = 200
player.speed = 50
g = anim8.newGrid(16, 24, player.spritesheet:getWidth(), player.spritesheet:getHeight())
animation = anim8.newAnimation('loop', g('1-8,1-5'), 1.0)
end
function love.update(dt)
if love.keyboard.isDown("w") then
player.y = player.y - player.speed * dt
animation = anim8.newAnimation('loop', g('4-6,1'), 1.0)
elseif love.keyboard.isDown("s") then
player.y = player.y + player.speed * dt
animation = anim8.newAnimation('loop', g('1-3,1'), 1.0)
elseif love.keyboard.isDown("a") and player.x > 0 then
player.x = player.x - player.speed * dt
animation = anim8.newAnimation('loop', g('7-8,1'), 1.0)
elseif love.keyboard.isDown("d") and player.x < 10000 then
player.x = player.x + player.speed * dt
animation = anim8.newAnimation('loop', g('4,2'), 1.0)
end
animation:update(dt)
end
function love.draw()
animation:draw(player.spritesheet, player.x, player.y)
end
function love.keypressed(key)
if love.keyboard.isDown("escape") then
love.event.quit("quit")
end
end
"Imagination is more important that knowledge...." - Einstein
You are creating animations on each frame. Instead of doing that, you should create them once (in love.load, for example) and then reuse them inside love.update.
local anim8 = require('lib.anim8.anim8')
local player
function love.load()
local spritesheet = love.graphics.newImage('sprites/hero.png');
local g = anim8.newGrid(16, 24, spritesheet:getWidth(), spritesheet:getHeight())
player = {
spritesheet = spritesheet,
x = 200,
y = 200,
speed = 50,
animations = {
up = anim8.newAnimation('loop', g('4-6,1'), 1.0),
down = anim8.newAnimation('loop', g('1-3,1'), 1.0),
left = anim8.newAnimation('loop', g('7-8,1'), 1.0),
right = anim8.newAnimation('loop', g('4,2'), 1.0)
}
}
player.animation = player.animations.down -- player starts looking down
end
function love.update(dt)
if love.keyboard.isDown("w") then
player.y = player.y - player.speed * dt
player.animation = player.animations.up
elseif love.keyboard.isDown("s") then
player.y = player.y + player.speed * dt
player.animation = player.animations.down
elseif love.keyboard.isDown("a") and player.x > 0 then
player.x = player.x - player.speed * dt
player.animation = player.animations.left
elseif love.keyboard.isDown("d") and player.x < 10000 then
player.x = player.x + player.speed * dt
player.animation = player.animations.right
end
player.animation:update(dt)
end
function love.draw()
animation:draw(player.spritesheet, player.x, player.y)
end
function love.keypressed(key)
if love.keyboard.isDown("escape") then
love.event.quit("quit")
end
end
The one above is just easier to read and write, since it has less letters.
i also noticed that you have commas in the wrong...
The syntax for expressing animations has changed since I answered.
* g('4-6,1') is how you did animations in anim8 1.x (when I answered this question)
* g('4-6',1) is how you do animations in anim8 2.x (it's what you should use now)