I have an image which is width 150 and height 50 that contains 3 frames of animation. Each frame is 50 x 50.
I want to mask the other frames while just showing one to give the illusion of animation.
I made a Countdown class that extends Sprites
The way I did it was I added a ClipRect to the image and I move the image while the ClipRect stays still.
The problem is i can't use moveTo and i feel like i'm losing out on other sprite functions because if I move the sprite it goes out of sync with the mask. I had to write a custom move. here is the code
class("Countdown").extends(gfx.sprite) --frameW and frameH are the width and height of a frame --the image is an image map of multiple frames function Countdown:init(frameW, frameH,image) Scene.super.init(self) self.currentFrame = 1 --Load Image local newImage = playdate.graphics.image.new(image) self.frameW = frameX self.frameH = frameY --Get Image Data for calculations self:setImage(newImage) self.newImageW, self.newImageH = self:getImage():getSize() self:setCenter(0, 0) end function Countdown:setFrame(frame) self.currentFrame = frame end function Countdown:drawUpdate(x,y) local frame = self.currentFrame - 1 local spriteX = x - (self.frameW * frame) local spriteY = y self:moveTo(spriteX,y) local clipBoxCord = playdate.geometry.rect.new(x , y, self.frameW , self.frameH) self:setClipRect(clipBoxCord) end
And in the main file
I just call :add() and :setFrame(1) or 2 3 etc. And :drawUpdate in the update script
This thing works but i just dont like how its written there must be a better way