Bangle.setLCDMode("doublebuffered"); var W = g.getWidth(); var H = g.getHeight(); g.setFontAlign(0,-1); var BTNL = BTN4; var BTNR = BTN5; var BTNU = BTN1; var BTNA = BTN2; function newAst(x,y) { var a = { x:x,y:y, vx:Math.random()-0.5, vy:Math.random()-0.5, rad:3+Math.random()*5 }; return a; } var running = true; var ship = {}; var ammo = []; var ast = []; var score = 0; var level = 4; var timeSinceFired = 0; var lastFrame; function gameStop() { running = false; g.clear(); g.drawString("Game Over!",120,(H-6)/2); g.flip(); } function addAsteroids() { for (var i=0;i=W) ship.x-=W; if (ship.y>=H) ship.y-=H; timeSinceFired+=d; if (BTNA.read() && timeSinceFired>4) { // fire! Bangle.beep(10); timeSinceFired = 0; ammo.push({ x:ship.x+Math.cos(ship.r)*4, y:ship.y+Math.sin(ship.r)*4, vx:Math.cos(ship.r)*3, vy:Math.sin(ship.r)*3, }); } g.clear(); g.drawString(score,120,0); var rs = Math.PI*0.8; g.drawPoly([ ship.x+Math.cos(ship.r)*4, ship.y+Math.sin(ship.r)*4, ship.x+Math.cos(ship.r+rs)*3, ship.y+Math.sin(ship.r+rs)*3, ship.x+Math.cos(ship.r-rs)*3, ship.y+Math.sin(ship.r-rs)*3, ],true); var na = []; ammo.forEach(function(a) { a.x += a.vx*d; a.y += a.vy*d; g.fillRect(a.x-1, a.y, a.x+1, a.y); g.fillRect(a.x, a.y-1, a.x, a.y+1); var hit = false; ast.forEach(function(b) { var dx = a.x-b.x; var dy = a.y-b.y; var d = Math.sqrt(dx*dx+dy*dy); if (d=0 && a.y>=0 && a.x=W) a.x-=W; if (a.y>=H) a.y-=H; if (!a.hit) { na.push(a); } else if (a.rad>4) { Bangle.buzz(100); a.hit = false; var vx = 1*(Math.random()-0.5); var vy = 1*(Math.random()-0.5); a.rad/=2; na.push({ x:a.x, y:a.y, vx:a.vx-vx, vy:a.vy-vy, rad:a.rad, }); a.vx += vx; a.vy += vy; na.push(a); } var dx = a.x-ship.x; var dy = a.y-ship.y; var d = Math.sqrt(dx*dx+dy*dy); if (d < a.rad) crashed = true; }); ast=na; if (!ast.length) { level++; addAsteroids(); } g.flip(); if (crashed) { Bangle.buzz(500); gameStop(); } } gameStart(); setInterval(onFrame, 50);