SmokeCloud = {} class('SmokeCloud').extends(playdate.graphics.sprite) function SmokeCloud:init(x, y) SmokeCloud.super.init(self) self.radius = 25 self.maxLife = 150 self.life = self.maxLife local size = self.radius * 2 + 4 self:setSize(size, size) self:setCenter(0.5, 0.5) self:setZIndex(ZIndex.fx - 1) self:moveTo(x, y) self:add() self:markDirty() end function SmokeCloud:update() if not BomberScene.instance then self:remove() return end self:moveBy(0, BomberScene.instance.scrollSpeed) self.life = self.life - 1 if self.life <= 0 or self.y > 280 then self:remove() return end self:markDirty() end function SmokeCloud:draw() local t = self.life / self.maxLife local r = self.radius * t local cx = self.width / 2 local cy = self.height / 2 local dither = playdate.graphics.image.kDitherTypeBayer4x4 if t < 0.3 then dither = playdate.graphics.image.kDitherTypeBayer8x8 elseif t < 0.6 then dither = playdate.graphics.image.kDitherTypeBayer4x4 end playdate.graphics.setColor(playdate.graphics.kColorBlack) playdate.graphics.setDitherPattern(1 - t * 0.6, dither) playdate.graphics.fillCircleAtPoint(cx, cy, r) playdate.graphics.setColor(playdate.graphics.kColorBlack) end