import "CoreLibs/animator" import "CoreLibs/animation" local gfx = playdate.graphics local imgSaw = gfx.imagetable.new("gfx/sawblades") local imgFuel = gfx.imagetable.new("gfx/fuel") local imgTarget = gfx.image.new("gfx/target") assert(imgSaw) assert(imgTarget) local loopSaws = gfx.animation.loop.new(200, imgSaw) local loopFuel = gfx.animation.loop.new(400, imgFuel) local blades = {} local spinblades = {} local fuels = {} function loadBlades(_blades) for i = 1, #_blades,1 do local b = _blades[i] b.start = playdate.geometry.point.new(b.start.x+8,b.start.y+8) b.ends = playdate.geometry.point.new(b.ends.x+8,b.ends.y+8) b.saw = gfx.sprite.new(loopSaws:image()) b.saw:moveTo(b.start) b.saw:setCollideRect(0,0,16,16) b.saw:add() local a = gfx.animator.new(b.speed*1000, b.start, b.ends) b.saw:setAnimator(a) b.t1 = gfx.sprite.new(imgTarget) b.t1:moveTo(b.start) b.t2 = gfx.sprite.new(imgTarget) b.t2:moveTo(b.ends) b.t1:add() b.t2:add() blades[i] = b end end function loadSpins(_spins) for i = 1, #_spins, 1 do local s = _spins[i] if s.middle then s.middle = gfx.sprite.new(loopSaws:image()) s.middle:setCollideRect(0,0,16,16) else s.middle = gfx.sprite.new(imgTarget) end s.middle:moveTo(s.x,s.y) s.middle:setZIndex(2) s.middle:add() local sb = {speed=s.speed,arms={},mid=s.middle,time=0} for i = 1, s.arms, 1 do sb.arms[i] = {} for p = 1, s.armlen, 1 do local degrees = (360 / s.arms) * i local position = {x=math.sin(math.rad(degrees)) * 20 * p,y=math.cos(math.rad(degrees)) * 20 * p} sb.arms[i][p] = gfx.sprite.new(loopSaws:image()) sb.arms[i][p]:moveTo(s.x + position.x, s.y + position.y) sb.arms[i][p]:setCollideRect(0,0,16,16) sb.arms[i][p]:setZIndex(2) sb.arms[i][p]:add() end end spinblades[#spinblades+1] = sb end end function loadFuel(_fuel) for i = 1, #_fuel, 1 do local fuel = _fuel[i] fuels[i] = gfx.sprite.new() fuels[i]:moveTo(fuel.x+15,fuel.y+15) fuels[i]:setGroups({2}) fuels[i]:setCollidesWithGroups({3}) fuels[i].active = true fuels[i]:setZIndex(1) fuels[i]:setCollideRect(-6,-6 ,30,30) fuels[i]:add() totalEnergy += 1 showEnergy = true end end function updateSaws() local ox, oy = gfx.getDrawOffset() for fuel = 1, #fuels, 1 do fuels[fuel]:setImage(loopFuel:image()) if #fuels[fuel]:overlappingSprites() > 0 and fuels[fuel].active then fuels[fuel].active = false fuels[fuel]:remove() energy += 1 end end for b=1, #blades, 1 do b = blades[b] b.saw:setImage(loopSaws:image()) local pos = playdate.geometry.point.new(b.saw:getPosition()) if pos == b.start then local a = gfx.animator.new(b.speed*1000, b.start, b.ends) b.saw:setAnimator(a) elseif pos == b.ends then local a = gfx.animator.new(b.speed*1000, b.ends, b.start) b.saw:setAnimator(a) end end for spinner = 1, #spinblades, 1 do for arm = 1, #spinblades[spinner].arms do for blade = 1, #spinblades[spinner].arms[arm] do spinblades[spinner].time += spinblades[spinner].speed local degrees = (360 / #spinblades[spinner].arms * arm + spinblades[spinner].time) local position = {x=math.sin(math.rad(degrees)) * 20 * blade,y=math.cos(math.rad(degrees)) * 20 * blade} spinblades[spinner].arms[arm][blade]:setImage(loopSaws:image()) spinblades[spinner].arms[arm][blade]:moveTo(spinblades[spinner].mid.x + position.x, spinblades[spinner].mid.y + position.y) end end end end function killBlades() for fuel = 1, #fuels, 1 do fuels[fuel]:remove() end fuels = {} for i = 1, #blades, 1 do blades[i].t1:remove() blades[i].t2:remove() blades[i].saw:remove() end blades = {} for i = 1, #spinblades, 1 do spinblades[i].mid:remove() for arm = 1, #spinblades[i].arms do for blade = 1, #spinblades[i].arms[arm] do spinblades[i].arms[arm][blade]:remove() end end end spinblades = {} end