From 340a3a4b92de5495b47e8e1e102178edfd97514f Mon Sep 17 00:00:00 2001 From: Aki Date: Sun, 19 Mar 2017 00:21:02 +0100 Subject: Night commit, added PhysicalBody, newImage to sprite --- not/Sprite.lua | 66 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 22 deletions(-) (limited to 'not/Sprite.lua') diff --git a/not/Sprite.lua b/not/Sprite.lua index 1cc46f7..905816b 100644 --- a/not/Sprite.lua +++ b/not/Sprite.lua @@ -1,32 +1,54 @@ -- `Sprite` -- Abstract class for drawable animated entities. - --- Metatable Sprite = { - animations--[[table with animations]], - current--[[animations.default]], - image--[[love.graphics.newImage()]], + animations =--[[table with animations]]nil, + current =--[[animations.default]]nil, + image =--[[love.graphics.newImage]]nil, frame = 1, delay = .1, } Sprite.__index = Sprite +-- Constructor of `Sprite`. +function Sprite:new (imagePath) + local o = setmetatable({}, self) + if type(imagePath) == "string" then + o:setImage(self.newImage(imagePath)) + end + return o +end + -- Cleans up reference to image on deletion. -function Sprite:delete() +function Sprite:delete () self.image = nil end --- Sets an Image as a image. -function Sprite:setImage(image) +-- Creates new Image object from path. Key-colours two shades of green. Static. +function Sprite.newImage (path) + local imagedata = love.image.newImageData(path) + local transparency = function(x, y, r, g, b, a) + if (r == 0 and g == 128 and b == 64) or + (r == 0 and g == 240 and b == 6) then + a = 0 + end + return r, g, b, a + end + imagedata:mapPixel(transparency) + local image = love.graphics.newImage(imagedata) + return image +end + +-- Sets an Image as an image. +function Sprite:setImage (image) self.image = image end -- Returns current image Image. -function Sprite:getImage() +function Sprite:getImage () return self.image end -- Sets new animations list. -function Sprite:setAnimationsList(t) +function Sprite:setAnimationsList (t) if t then self.animations = t self:setAnimation("default") @@ -34,45 +56,45 @@ function Sprite:setAnimationsList(t) end -- Sets current animation by table key. -function Sprite:setAnimation(animation) +function Sprite:setAnimation (animation) self.frame = 1 self.delay = Sprite.delay -- INITIAL from metatable self.current = self.animations[animation] end -- Returns current animation table. -function Sprite:getAnimation() +function Sprite:getAnimation () return self.current end -- Get frame quad for drawing. -function Sprite:getQuad() +function Sprite: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 image. -function Sprite:draw(...) - local s, q = self:getImage(), self:getQuad() - if s then +-- If there is no Quad, it will draw entire image. It won't draw anything if there is no image. +function Sprite:draw (...) + local i, q = self:getImage(), self:getQuad() + if i then love.graphics.setColor(255,255,255,255) - if q then love.graphics.draw(s, q, ...) - else love.graphics.draw(s, ...) end + if q then love.graphics.draw(i, q, ...) + else love.graphics.draw(i, ...) end end end -- Animation updating. -function Sprite:update(dt) +function Sprite:update (dt) if self.animations and self.current then self.delay = self.delay - dt if self.delay < 0 then self.delay = self.delay + Sprite.delay -- INITIAL from metatable - self:nextFrame() + self:goToNextFrame() end end end -- Moving to the next frame. -function Sprite:nextFrame() +function Sprite:goToNextFrame () if self.current.repeated or not (self.frame == self.current.frames) then self.frame = (self.frame % self.current.frames) + 1 else -- cgit v1.1