Enemy = {} class('Enemy').extends(NobleSprite) function Enemy:init(x,y) Enemy.super.init(self) self:moveTo(x, y) self:setZIndex(4) self:add(x,y) self.markImage = Graphics.image.new("assets/sprites/enemy"..math.random(1,2)) -- TODO: make it random self.deadImage = Graphics.image.new("assets/sprites/enemy1_3") self.hitSound = playdate.sound.fileplayer.new("assets/audio/hit1") self:setImage(self.markImage) self.removed = false self:setGroups(CollideGroups.enemy) self:setCollidesWithGroups({ CollideGroups.granade, CollideGroups.enemy }) self:setCollideRect(-6, -6, 46, 46) self:setSize(32, 32) self.vx = 0 self.vy = 0 self.isDying = false self.friction = 0.95 end function Enemy:update() if not BomberScene.instance then return end local speed = 0 if self.isDying then self.vx = self.vx * self.friction self.vy = self.vy * self.friction self:moveBy(self.vx, self.vy + BomberScene.instance.scrollSpeed) if math.abs(self.vx) < 0.1 and math.abs(self.vy) < 0.1 then self.isDying = false self.removed = true end elseif not self.removed then speed = math.random(0, 7)/10 self:moveBy(0, BomberScene.instance.scrollSpeed + speed) else self:moveBy(0, BomberScene.instance.scrollSpeed) end local actualX, actualY, collisions, numberOfCollisions = self:checkCollisions(self.x, self.y) if numberOfCollisions > 0 then for i, collision in ipairs(collisions) do if collision.other:getTag() == 154 and collision.other.currentRadius <= 0.05 and not self.isDying then print("Collision with granade") self:setImage(self.deadImage) self.hitSound:play() self:applyExplosionForce(collision.other.x, collision.other.y) end end end if self.y > 240 + 10 then if not self.removed then print("Removing enemy") self:remove() self:superRemove() self.removed = true end end end function Enemy:applyExplosionForce(explosionX, explosionY) local dx = self.x - explosionX local dy = self.y - explosionY local dist = math.sqrt(dx*dx + dy*dy) if dist == 0 then dist = 0.001 end dx = dx / dist dy = dy / dist local maxForce = 5 local maxRadius = 100 local force = maxForce * (1 - math.min(dist, maxRadius) / maxRadius) force = math.max(force, 1) self.vx = dx * force self.vy = dy * force * 0.5 self.isDying = true self:setRotation(math.random() * 360) end