diff options
Diffstat (limited to 'animated.lua')
-rw-r--r-- | animated.lua | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/animated.lua b/animated.lua new file mode 100644 index 0000000..160ee44 --- /dev/null +++ b/animated.lua @@ -0,0 +1,81 @@ +-- `Animated` +-- Abstract class for drawable animated entities. + +-- Metatable +Animated = { + animations--[[table with animations]], + current--[[animations.default]], + sprite--[[love.graphics.newImage()]], + frame = 1, + delay = .1, +} +Animated.__index = Animated + +-- Cleans up reference to sprite on deletion. +function Animated:delete() + self.sprite = nil +end + +-- Sets an Image as a sprite. +function Animated:setSprite(image) + self.sprite = image +end +-- Returns current sprite Image. +function Animated:getSprite() + return self.sprite +end + +-- Sets new animations list. +function Animated:setAnimationsList(t) + if t then + self.animations = t + self:setAnimation("default") + end +end + +-- Sets current animation by table key. +function Animated:setAnimation(animation) + self.frame = 1 + self.delay = Animated.delay -- INITIAL from metatable + self.current = self.animations[animation] +end +-- Returns current animation table. +function Animated:getAnimation() + return self.current +end + +-- Get frame quad for drawing. +function Animated:getQuad() + if self.animations and self.current then + return self.current[self.frame] + end +end + +-- Drawing self to LOVE2D buffer. +-- If there is no Quad, it will draw entire sprite. +function Animated:draw(...) + local s, q = self:getSprite(), self:getQuad() + if s then + love.graphics.setColor(255,255,255,255) + if q then love.graphics.draw(s, q, ...) + else love.graphics.draw(s, ...) end + end +end +-- Animation updating. +function Animated:update(dt) + if self.animations and self.current then + self.delay = self.delay - dt + if self.delay < 0 then + self.delay = self.delay + Animated.delay -- INITIAL from metatable + self:nextFrame() + end + end +end +-- Moving to the next frame. +function Animated:nextFrame() + if self.current.repeated or not (self.frame == self.current.frames) then + self.frame = (self.frame % self.current.frames) + 1 + else + self:setAnimation("default") + end +end
\ No newline at end of file |