You're right, I might copy-paste similar configs for new animations and just tweak some parameters, then compile to see how it's doing...
There was "pdxinfo is missing" problem with playdate sideload feature caused by this lib.
I've fixed that, I highly recommend updating from git repo or not adding test/ folder into your game.
First off, thanks for making such an incredible resource. I'm not sure if I'm thinking about it wrong, but I'm having a hard time figuring out how to use it to draw multiple instances of the same animation.
For example, in my game there are items scattered randomly around the level. Previously, I implemented this using the built-in Playdate animation loops, something like (using pseudocode)
if tile is onscreen then
if tile.item ~= nil then
draw tile.item at tile.position
I was planning on doing something similar with AnimatedSprite, however I don't see a way to not draw an AnimatedSprite once it's been created. My concern is I don't want to draw the animations when they're not on screen (since you mentioned there are performance concerns and I may have hundreds of items on the map). I suppose I could play and pause the animations when they enter/exit the screen, but would there still be a performance hit even if the animation is paused? Or is there a way of doing this that I'm missing?
This is new use case for me, I didn't think about it before. For my endless runner game I just create new instance of the AnimatedSprite and delete it when it's out of the screen...
You can override default :update()
function to empty function (don't call :updateAnimation()
), you need to call :updateAnimation()
manually then. + Maybe removing AnimatedSprite(32 line): self:add()
will help with performance, but you need to call:updateAnimation()
every frame (idk if it'll work)~
Mind if I ask how you delete it? I think that could work for my case as well.
Edit: Actually I think I see, you just add and delete from the list of sprites. But is there a good way to add the same Animated Sprite multiple times at different positions?
By delete I mean open AnimatedSprite.lua file and delete code) You can create copy of the original class and have AnimatedSprite.lua and AnimatedStaticSprite.lua (without automatic :add()). For normal animations use AnimatedSprite
that will automatically animate and for your tile animations you can use AnimatedStaticSprite
and invoke :updateAnimation()
manually.
But is there a good way to add the same Animated Sprite multiple times at different positions?
I don't know what you're talking concterly, but you can use for
cycle to create multiple sprites...
Thanks @Whitebrim for this library, I have an issue while using it
main.lua
function playdate.update()
gfx.sprite.update()
playdate.timer.updateTimers()
end
but this update is not calling the update function in the player.lua , as I can't able to move my sprite
class("Player").extends(AnimatedSprite)
function Player:init(x, y)
imgtable = pd.graphics.imagetable.new("Images/flight-table-24-24")
playerSprite = AnimatedSprite.new(imgtable) -- creating animated sprite
playerSprite:addState('idle', 1, 2, {tickStep = 2})
playerSprite:playAnimation()
playerSprite:setCollideRect(0, 0, playerSprite:getImage(1):getSize())
playerSprite:moveTo(x, y)
playerSprite:add()
end
function Player:update()
print("update called ...")
if pd.buttonIsPressed( pd.kButtonUp ) then
playerSprite:moveBy( 0, -2 )
end
if pd.buttonIsPressed( pd.kButtonRight ) then
playerSprite:moveBy( 2, 0 )
end
if pd.buttonIsPressed( pd.kButtonDown ) then
playerSprite:moveBy( 0, 2 )
end
if pd.buttonIsPressed( pd.kButtonLeft ) then
playerSprite:moveBy( -2, 0 )
end
end
As the class AnimatedSprite is extending sprites, I thought this will work, but its not getting called, any ideas ?
(edited : 26Jul)
Hi, @jae, here's:
You don't need to call playerSprite:add()
Timers aren't used in AnimatedSprite, if you don't use them too, you can remove playdate.timer.updateTimers()
too.
I assume Player
is not animated sprite class, Player:update()
is not handled by this lib, if it was playerSprite:update()
instead, then it will be handled by gfx.sprite.update()
because playerSprite
is sprite. I'm not sure if Player
is sprite, therefore nobody invokes Player:update()
. Your problem was that "update called ..." never appears in the logs, right?
Thanks @Whitebrim for your quick answer , I missed the vital part of the code where the Player class is extending AnimatedSprite class.
Thanks to your answer , I figured out I need to use (updated code)
function AnimatedSprite:update()
print("update is called")
if pd.buttonIsPressed( pd.kButtonUp ) then
playerSprite:moveBy( 0, -2 )
end
.
.
.
end
And now the update function is called.
Also, are there any examples available to use collision along with the AnimatedSprite component ?