diff --git a/apps.json b/apps.json index aa1f751a0..976c3c8ad 100644 --- a/apps.json +++ b/apps.json @@ -33,6 +33,17 @@ {"name":"*trex","url":"trex-icon.js","evaluate":true} ] }, + { "id": "astroid", + "name": "Asteroids!", + "icon": "asteroids.png", + "description": "Retro asteroids game", + "tags": "game", + "storage": [ + {"name":"+astroid","url":"asteroids.json"}, + {"name":"-astroid","url":"asteroids.js"}, + {"name":"*astroid","url":"asteroids-icon.js","evaluate":true} + ] + }, { "id": "compass", "name": "Compass", "icon": "compass.png", diff --git a/apps/asteroids-icon.js b/apps/asteroids-icon.js new file mode 100644 index 000000000..7e6afcfdb --- /dev/null +++ b/apps/asteroids-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwghC/ADkN6APN7oDGC64AWDRw9DIIgXVLh/eAYQtEFxsN7oqCCQQDBC5oOBC4IDHFxgmBAY4uvGJQuMC5IuLhpdWMBQuMSBQuMF5IubhqHDFyIfGX5giFkWQGYa/KEQcCkQACmA6KFwwWDkUgNJJVGFwgABFwoXGBYIuGC4jrL8AuBmczJAgLBRhAXCFwQXGRhIXGkUjI4i/CapReHC4KEEC6a/KC48jmQXCfQoXNX44XJawx3CX5gXHXwQuJcYYXHFxaaEhIXEFxiyFGIeQFxqEIFxy0HhwuOFAgAFCxowDAAguODA4WRAH4ADA==")) diff --git a/apps/asteroids.js b/apps/asteroids.js new file mode 100644 index 000000000..cb44db904 --- /dev/null +++ b/apps/asteroids.js @@ -0,0 +1,171 @@ +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); diff --git a/apps/asteroids.json b/apps/asteroids.json new file mode 100644 index 000000000..87dedc86d --- /dev/null +++ b/apps/asteroids.json @@ -0,0 +1,5 @@ +{ + "name":"Asteroids!", + "icon":"*astroid", + "src":"-astroid" +} diff --git a/apps/asteroids.png b/apps/asteroids.png new file mode 100644 index 000000000..fa678a5ea Binary files /dev/null and b/apps/asteroids.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 000000000..24ae65966 Binary files /dev/null and b/favicon.ico differ