From 208ac30a3931d6f880bc41db8af83bb7ed78a3c7 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 11:28:06 -0800 Subject: [PATCH 01/21] Add files via upload --- apps/invader/ChangeLog | 1 + apps/invader/README.md | 25 ++++++++ apps/invader/app-icon.js | 1 + apps/invader/app.js | 110 ++++++++++++++++++++++++++++++++++++ apps/invader/app.png | Bin 0 -> 665 bytes apps/invader/metadata.json | 14 +++++ apps/invader/screenshot.png | Bin 0 -> 1707 bytes 7 files changed, 151 insertions(+) create mode 100644 apps/invader/ChangeLog create mode 100644 apps/invader/README.md create mode 100644 apps/invader/app-icon.js create mode 100644 apps/invader/app.js create mode 100644 apps/invader/app.png create mode 100644 apps/invader/metadata.json create mode 100644 apps/invader/screenshot.png diff --git a/apps/invader/ChangeLog b/apps/invader/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/invader/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/invader/README.md b/apps/invader/README.md new file mode 100644 index 000000000..dc139bc9a --- /dev/null +++ b/apps/invader/README.md @@ -0,0 +1,25 @@ +# App Name + +Describe the app... + +Add screen shots (if possible) to the app folder and link then into this file with ![](.png) + +## Usage + +Describe how to use it + +## Features + +Name the function + +## Controls + +Name the buttons and what they are used for + +## Requests + +Name who should be contacted for support/update requests + +## Creator + +Your name diff --git a/apps/invader/app-icon.js b/apps/invader/app-icon.js new file mode 100644 index 000000000..dc7003c84 --- /dev/null +++ b/apps/invader/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwhHXAH4A/AH4A/AH4AYgAACC/4X/C/YbTFbYv/F/4rTAC4v/F/4vfC5YnPGaYv/F/4vLc7b3TF/4v/F/4v/F/4vTA5YAPE64v/F/4fTa55DXF/4v/AH4A/AH4A/AH4A/AHIA==")) diff --git a/apps/invader/app.js b/apps/invader/app.js new file mode 100644 index 000000000..aabc0022a --- /dev/null +++ b/apps/invader/app.js @@ -0,0 +1,110 @@ +// Brian Kumanchik +// Started 05-25-22 +// My Invader Demo, for Bangle.js 2, written JavaScript - using Espruino Web IDE + + + +// - variables ----------------------------------------- +// invader variables +var inv_x = 77; +var inv_y = 20; + +// turret variables +var tur_x = 77; +var tur_y = 138; + +// misc variables +var score = 999; +var lives = 3; +var game_over = false; + +// input(screen controller) variables +var BTNL, BTNR, BTNF; +var tap = {}; +// use tapping on screen for left and right +Bangle.on('drag',e=>tap=e); +BTNL = { read : _=>tap.b && tap.x < 88 && tap.y > 88}; +BTNR = { read : _=>tap.b && tap.x > 88 && tap.y > 88}; +BTNF = { read : _=>tap.b && tap.x > 88 && tap.y < 88}; + + + +// - sprites ------------------------------------------- +// invader sprites +var invader_a = + require("heatshrink").decompress(atob("kEgwkBiMRgACBAAQFFBJIPJBQgOKB55MGB64JCBoYQIB5yOKB+qvIA6pxHX5YPOAH4A/AH4A8A==")); +var invader_b = + require("heatshrink").decompress(atob("kEgxH+AAYJBAwgLQCaYfPB4oVHBpofnSpofvCY4HND9oAPD9IhTDpYfhd6IftN6IPtAH4A/AH4A/AH4A/AH4A9A=")); +var boom = + require("heatshrink").decompress(atob("kEgxH+AH4AFJYIHND9YTFAoYJJD9YRNMLKhbX/IRBV6JvND7p//f/4RHAoYJJD9a//AH4A/AH4A/AH4A9A==")); +var inv_shot = + require("heatshrink").decompress(atob("kEgxH+AH4A/ABaRBD/pB/Hv69/IP4A/AH4A/AH4A/AH4A/AH4AzA")); + +// turret sprites +var turret = + require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/ABcAgAf7DoIADD/4fxC4oAPD84dVEJIf/D/4f/D74=")); +var tur_exp_a = + require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/AAcAgATdD7YbJBJYLFAoYffDKqLXD6qlVB86lHLYoFDS5offA5YbRD8YZHABLbRD7aZLD5IlJD7YA=")); +var tur_exp_b = + require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/AAcAgATdD7YbJBJYLFAoYffDKqLXD6qlVB86lHLYoFDS5offA5YbRD8YZHABLbRD7aZLD5IlJD7YA=")); +var shot = + require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/ABcAgAf/D/4f9AH4A/AH4A/AH4A/AH4A/AGY")); + + + +// - setup stuff --------------------------------------- +function gameStart() { + setInterval(onFrame, 50); +} + + + +// - main loop ----------------------------------------- +function onFrame() { + // if not game over + if(game_over == false) { + g.clear(); + + + // check input (screen presses) + if(BTNL.read()) { + tur_x -= 5; + } + else if(BTNR.read()) { + tur_x += 5; + } + else if(BTNF.read()) { + tur_y -= 5; + } + + + // - draw sprites ---------------------------------- + // draw invader sprites + g.drawImage(invader_a, inv_x, inv_y); + //g.drawImage(invader_b, inv_x + 30, inv_y); + //g.drawImage(boom, inv_x + 60, inv_y); + //g.drawImage(inv_shot, inv_x - 30, inv_y); + + // draw turret sprites + g.drawImage(turret, tur_x, tur_y); + //g.drawImage(tur_exp_a, tur_x + 30, tur_y); + //g.drawImage(tur_exp_b, tur_x + 60, tur_y); + //g.drawImage(shot, tur_x - 30, tur_y); + + + // - draw text ------------------------------------- + g.setFont("4x6", 2); + g.setColor(0,0,0); + g.drawString("SCORE:" + score ,5,5); // + g.drawString("LIVES:" + lives ,117,5); // + + + g.flip(); + } +} + + + +gameStart(); + + diff --git a/apps/invader/app.png b/apps/invader/app.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9f822056531de84e9fe8641d57c4ab7e43c300 GIT binary patch literal 665 zcmV;K0%rY*P)EX>4Tx04R}tkv&MmKpe$iQ%gl!MC>5ykfAzRkSgLRRV;#q(pG5I!Q|2}Xws0h zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi)x!1rQVA7g-j7icvs>-*TUS|@<_8Mx9q{%RAL{Up87 z(ZWYS|2A-O-O=Pd;Bp5TdeS9BvL!D~p-=$c&*+n`u^?e6X0GwuF<0Hy{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&GE5i~ng^xj1P005OqL_t(&-tCx63cw%?L{0Jj zS5DUz#L#@&z?+>Q!ox|%D5|QXv98fv0000$b4}|;5qYemyYJicu@C@NHL!ZpTN6<= zg@pj{wqNUWdi89!$N>Pp&ViHXPr2aD6>CmlApoLspt{dT{gk(LU(SP%HFop!|0#d)WR+w3 zw

r=6?}^4FYys8yf7tJ}v&lbnU=$u^$Exjz9jmU;O*8%J+XiE_kM95NciAm|UGv1ecuvFpd-u}n8U9}_IREcK z?azku|5(odJF?EM-fYI^_X_26&%gN@U;FRHuU@D5U#o5JZ~lFL-?{#0f4|CBlrU}9 z|M2Sb`F$4_a~GHXKau?HPnrGyH$VIGKA!v6@V}Vx{J)mIxC2=Z>%XThwsr59KP!1R zyI1bM?4wtIb~E|K&ez^vu>4))`nn3?4_RH=$2or-%{4u6as7ge){oz8=UeQ*b+!G= z^yY}uy7gCXewMxKBvX63pzPlZ^Pe}v?P~dLeud8EiaL<4|M1S|b8O#IneD3In>R@@ z&aG{a_@t#IZ&Reug?*57nyk=e5)eSg^JMBR41 z2Xmgjw7(%xz!!VK(t9!&6O-P8=$XO-1?Mg;X=-TTei8PJg=NlWla&ez514jMwPa*` zuH&o4!Lg$uFV)XsRLf|H4dn#GuWl>XKfm90{(0$bwd+Nh_C2iPu8`l<@crh#z3snu z9kMP2WsB4HYMd3y@77;rx|gBzpmzt;KF06Y+s(HN{9dz{Ievp}Rr_9pOWQ>!S1`?E z`Th4L)4m3AtB?cS6LudeU2Rxz$YPUU_T%e~Lo4|CKbGE(2sx0v_;P%|ZjaChR})5k zhFz@@4!27>8pIP=_dv5QFuUho2Il4l(GN_wmN~QRVbFfSy2ZDhqe6Ji#_t>)KjhM* f%{cM#{;)rs6=x$HfA9&g_F?dJ^>bP0l+XkKTNVEM literal 0 HcmV?d00001 From d89d15ec78714567a1a90b78b5822579c432c4c9 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 11:56:40 -0800 Subject: [PATCH 02/21] Add files via upload --- apps/invader/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index e211ac3f6..43b832cb8 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -2,9 +2,9 @@ "name": "Invader", "shortName":"Invader", "version":"0.01", - "description": "A Space Invader game-like demo", + "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", - "tags": "", + "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ From a8e348dd59c197564f06d1e15f095fcfa774a2fa Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 12:03:35 -0800 Subject: [PATCH 03/21] Add files via upload --- apps/invader/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/invader/README.md b/apps/invader/README.md index dc139bc9a..1b04e585e 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -6,20 +6,20 @@ Add screen shots (if possible) to the app folder and link then into this file wi ## Usage -Describe how to use it +For fun, I'm learning js with the Bangle ## Features -Name the function +Shoot the Alien ## Controls -Name the buttons and what they are used for +Lower Left and Right hand sides of the screen to move turret left or right, upper Right hand part of screen to fire ## Requests -Name who should be contacted for support/update requests +Brian Kumanchik ## Creator -Your name +Brian Kumanchik From 8574ef736a97242e80686c017ea079337494b826 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 12:17:31 -0800 Subject: [PATCH 04/21] Add files via upload --- apps/invader/README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/invader/README.md b/apps/invader/README.md index 1b04e585e..7941deafa 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -1,24 +1,22 @@ # App Name -Describe the app... - -Add screen shots (if possible) to the app folder and link then into this file with ![](.png) +Invader, I'm creating this demo to learn JavaScript with the Bangle.js 2 ## Usage -For fun, I'm learning js with the Bangle +For fun! ## Features -Shoot the Alien +Shoot the Alien, you have three lives ## Controls -Lower Left and Right hand sides of the screen to move turret left or right, upper Right hand part of screen to fire +Touch the lower Left or Right hand sides of the screen to move turret left or right, tap upper Right hand part of screen to fire ## Requests -Brian Kumanchik +bkumanchik on Espruino Forums ## Creator From cae5f1b9277312a84aa05cb9a9449f4fc0227907 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 12:35:00 -0800 Subject: [PATCH 05/21] Add files via upload --- apps/invader/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 43b832cb8..b1c1805d3 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -4,6 +4,7 @@ "version":"0.01", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", + "screenshots" : "screenshot.png", "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", From 1c9f6e7879ef3c3f04657ea1f22838c7231202b3 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 12:40:57 -0800 Subject: [PATCH 06/21] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index b1c1805d3..f3beedb50 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -4,7 +4,7 @@ "version":"0.01", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", - "screenshots" : "screenshot.png", + "screenshots" : [ { "url":"screenshot.png" } ], "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", From e6fe23211609f9caab3cf3228b7ae96b1240ddd7 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 13:41:12 -0800 Subject: [PATCH 07/21] Add files via upload --- apps/invader/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/README.md b/apps/invader/README.md index 7941deafa..d7c091ebf 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -1,6 +1,6 @@ # App Name -Invader, I'm creating this demo to learn JavaScript with the Bangle.js 2 +Invader - I'm creating this demo to learn JavaScript with the Bangle.js 2 ## Usage From 94d97f8d8d232aaacb04cf89c44fafc86a199929 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 15:42:20 -0800 Subject: [PATCH 08/21] Add files via upload --- apps/invader/app.js | 169 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 140 insertions(+), 29 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index aabc0022a..9a06b6f41 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -3,18 +3,40 @@ // My Invader Demo, for Bangle.js 2, written JavaScript - using Espruino Web IDE +// resolution 176x176 + + +// to do: +// add buzz + // - variables ----------------------------------------- // invader variables -var inv_x = 77; -var inv_y = 20; +var inv_x = 77; +var inv_y = 20; +var i_anim_delay = 10; // invader animation (and move) delay +var inv_frame = 1; // invader start animation frame +var ix_speed = 6; // march speed +var i_dir = 1; // 1 = right, 0 = left +var been_hit = false; // invader hit state +//// shoot variables +var inv_shot_x = -32; +var inv_shot_y = -32; +var inv_fire_pause = 30; +var inv_fired = false; // invader fired state +//// explode variables +var been_hit = false; // invader hit state +var bx = -32; // blast x +var by = -32; // blast y +var blast_delay = 60; // invader blast delay - pause after explosion +var boom_play = false; // turret variables var tur_x = 77; -var tur_y = 138; +var tur_y = 148; // misc variables -var score = 999; +var score = 0; var lives = 3; var game_over = false; @@ -28,27 +50,81 @@ BTNR = { read : _=>tap.b && tap.x > 88 && tap.y > 88}; BTNF = { read : _=>tap.b && tap.x > 88 && tap.y < 88}; - // - sprites ------------------------------------------- // invader sprites var invader_a = - require("heatshrink").decompress(atob("kEgwkBiMRgACBAAQFFBJIPJBQgOKB55MGB64JCBoYQIB5yOKB+qvIA6pxHX5YPOAH4A/AH4A8A==")); + require("heatshrink").decompress(atob("hcIwkBiIBBAQoECCQQFBgEQAIMBEhUBDoYWDAYI=")); var invader_b = - require("heatshrink").decompress(atob("kEgxH+AAYJBAwgLQCaYfPB4oVHBpofnSpofvCY4HND9oAPD9IhTDpYfhd6IftN6IPtAH4A/AH4A/AH4A/AH4A9A=")); + require("heatshrink").decompress(atob("hcIwkBiIBBAQMQAoQEBgISCAYUQAIQAEB4YEBEAgEDAYIA==")); var boom = - require("heatshrink").decompress(atob("kEgxH+AH4AFJYIHND9YTFAoYJJD9YRNMLKhbX/IRBV6JvND7p//f/4RHAoYJJD9a//AH4A/AH4A/AH4A9A==")); + require("heatshrink").decompress(atob("hcJwkBiMQAIURgMQAgIKBAIICFAIMAAwIWBBAYSIEAgrDiA=")); var inv_shot = - require("heatshrink").decompress(atob("kEgxH+AH4A/ABaRBD/pB/Hv69/IP4A/AH4A/AH4A/AH4A/AH4AzA")); + require("heatshrink").decompress(atob("gcFwkBiERiAABAYQ")); // turret sprites -var turret = - require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/ABcAgAf7DoIADD/4fxC4oAPD84dVEJIf/D/4f/D74=")); -var tur_exp_a = - require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/AAcAgATdD7YbJBJYLFAoYffDKqLXD6qlVB86lHLYoFDS5offA5YbRD8YZHABLbRD7aZLD5IlJD7YA=")); -var tur_exp_b = - require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/AAcAgATdD7YbJBJYLFAoYffDKqLXD6qlVB86lHLYoFDS5offA5YbRD8YZHABLbRD7aZLD5IlJD7YA=")); +var turret = + require("heatshrink").decompress(atob("h8IwkBiIABAYYACgAHFiEABggADCAInFgITBAAgOPA==")); +var tur_exp_a = + require("heatshrink").decompress(atob("h8IwkBiMRiACBAAwJEiAABBQgZCAAkAiAJBBoIUBgIABBgQACDIQ9ECQIA==")); +var tur_exp_b = + require("heatshrink").decompress(atob("h8IwkBiIBBAAUBiADCiMQAwQFDCIYXEB4IABgMAEYQXBiEAAQIQBAoIABDAQUCAAIVBA")); var shot = - require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/ABcAgAf/D/4f9AH4A/AH4A/AH4A/AH4A/AGY")); + require("heatshrink").decompress(atob("gMDwkBAoIA==")); + + +// function to move and animate invader +function move_anim_inv() { + // invader anim code + i_anim_delay -= 1; + if ((i_anim_delay < 0) && !(been_hit)) { + i_anim_delay = 10; + + inv_frame += 1; + if (inv_frame > 2) { + inv_frame = 1; + } + + // move right + if (i_dir == 1){ + inv_x += ix_speed; + if (inv_x >= 142) { + inv_y += 8; // step down + i_dir = -1; + } + } + + // move left + if (i_dir < 1){ + inv_x -= ix_speed; + if (inv_x <= 10) { + inv_y += 8; // step down + i_dir = 1; + } + } + } +} + + + +// function to make invader fire +function invader_fire() { + inv_fire_pause -= 1; + + if (!(inv_fired)) { // so once invader shot is fired it doesn't follow the invader still + inv_shot_x = inv_x + 8; + inv_shot_y = inv_y + 18; + } + + if (inv_fire_pause < 0) { + inv_fired = true; + inv_shot_y += 8; + } +} + + + + + @@ -64,32 +140,67 @@ function onFrame() { // if not game over if(game_over == false) { g.clear(); + + // call function to move and animate invader + move_anim_inv(); + + // call function to make invader fire + invader_fire(); // check input (screen presses) - if(BTNL.read()) { - tur_x -= 5; + if(BTNL.read() && tur_x >= 12) { + tur_x -= 6; } - else if(BTNR.read()) { - tur_x += 5; + else if(BTNR.read() && tur_x <= 140) { + tur_x += 6; } else if(BTNF.read()) { tur_y -= 5; } + + + + // check for invader shot going off screen before allowing to fire again + if (inv_shot_y > 150 + ) { + inv_fired = false; + inv_shot_x = inv_x - 1; + inv_shot_y = inv_y + 7; + inv_fire_pause = 30; + } + + + + // - draw sprites ---------------------------------- // draw invader sprites - g.drawImage(invader_a, inv_x, inv_y); - //g.drawImage(invader_b, inv_x + 30, inv_y); - //g.drawImage(boom, inv_x + 60, inv_y); - //g.drawImage(inv_shot, inv_x - 30, inv_y); + if(inv_frame == 1) { + g.drawImage(invader_a, inv_x, inv_y, {scale:2}); + } + else if(inv_frame == 2) { + g.drawImage(invader_b, inv_x, inv_y, {scale:2}); + } + //g.drawImage(invader_b, inv_x + 30, inv_y, {scale:2}); + //g.drawImage(boom, inv_x + 60, inv_y, {scale:2}); + // - invader shot + if (inv_fired) { + //DrawTexture(inv_shot, inv_shot_x, inv_shot_y, WHITE); + g.drawImage(inv_shot, inv_shot_x, inv_shot_y, {scale:2}); + } + else { + //DrawTexture(inv_shot, -32, -32, WHITE); + g.drawImage(inv_shot, -32, -32, {scale:2}); + } + - // draw turret sprites - g.drawImage(turret, tur_x, tur_y); - //g.drawImage(tur_exp_a, tur_x + 30, tur_y); - //g.drawImage(tur_exp_b, tur_x + 60, tur_y); - //g.drawImage(shot, tur_x - 30, tur_y); + // draw turret sprites + g.drawImage(turret, tur_x, tur_y, {scale:2}); + //g.drawImage(tur_exp_a, tur_x + 30, tur_y, {scale:2}); + //g.drawImage(tur_exp_b, tur_x + 60, tur_y, {scale:2}); + //g.drawImage(shot, tur_x - 30, tur_y, {scale:2}); // - draw text ------------------------------------- From a5ed2385d47807d8ea2ea6dc84212e562a5d351b Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 15:48:02 -0800 Subject: [PATCH 09/21] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index f3beedb50..7e7f5dee2 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.01", + "version":"0.02", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot.png" } ], From c3055367e61d9e7cc3e565e0ce723f969bd34383 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 09:53:00 -0800 Subject: [PATCH 10/21] Add files via upload --- apps/invader/README.md | 6 +- apps/invader/app.js | 361 ++++++++++++++++++++++++---------- apps/invader/metadata.json | 2 +- apps/invader/screenshot_2.png | Bin 0 -> 1878 bytes 4 files changed, 262 insertions(+), 107 deletions(-) create mode 100644 apps/invader/screenshot_2.png diff --git a/apps/invader/README.md b/apps/invader/README.md index d7c091ebf..e0036cb8a 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -1,10 +1,10 @@ # App Name -Invader - I'm creating this demo to learn JavaScript with the Bangle.js 2 +Invader ## Usage -For fun! +For fun! - I'm creating this demo to learn JavaScript with the Bangle.js 2 ## Features @@ -12,7 +12,7 @@ Shoot the Alien, you have three lives ## Controls -Touch the lower Left or Right hand sides of the screen to move turret left or right, tap upper Right hand part of screen to fire +Touch the lower Left or Right hand sides of the screen to move turret left or right, tap upper Right hand part of screen to fire, tap upper Left hand part of screen to restart ## Requests diff --git a/apps/invader/app.js b/apps/invader/app.js index 9a06b6f41..59dbb8d42 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -1,4 +1,4 @@ -// Brian Kumanchik +// Brian Kumanchik // Started 05-25-22 // My Invader Demo, for Bangle.js 2, written JavaScript - using Espruino Web IDE @@ -7,7 +7,9 @@ // to do: -// add buzz +// random invader restart x +// stop auto fire + // - variables ----------------------------------------- @@ -19,21 +21,29 @@ var inv_frame = 1; // invader start animation frame var ix_speed = 6; // march speed var i_dir = 1; // 1 = right, 0 = left var been_hit = false; // invader hit state -//// shoot variables +// - shoot variables var inv_shot_x = -32; var inv_shot_y = -32; var inv_fire_pause = 30; var inv_fired = false; // invader fired state -//// explode variables +// - explode variables var been_hit = false; // invader hit state var bx = -32; // blast x var by = -32; // blast y -var blast_delay = 60; // invader blast delay - pause after explosion -var boom_play = false; +var blast_delay = 15; // invader blast delay - pause after explosion +var boom_play = false; // turret variables -var tur_x = 77; -var tur_y = 148; +var tur_x = 77; +var tur_y = 148; +var shot_fired = false; // turret fired state +var sx = -20; // turret shot starting x - off screen +var sy = -20; // turret shot starting y - off screen +var turret_been_hit = false; +var turret_blast_delay = 21; // keep blast active on screen for 60 frames +var turret_exp_frame = 1; // turret explode start animation frame +var turret_anim_delay = 3; // turret explode animation delay +var explosion_play = false; // misc variables var score = 0; @@ -41,20 +51,21 @@ var lives = 3; var game_over = false; // input(screen controller) variables -var BTNL, BTNR, BTNF; +var BTNL, BTNR, BTNF, BTNS; // button - left, right, fire, start var tap = {}; // use tapping on screen for left and right Bangle.on('drag',e=>tap=e); BTNL = { read : _=>tap.b && tap.x < 88 && tap.y > 88}; BTNR = { read : _=>tap.b && tap.x > 88 && tap.y > 88}; BTNF = { read : _=>tap.b && tap.x > 88 && tap.y < 88}; +BTNS = { read : _=>tap.b && tap.x < 88 && tap.y < 88}; // - sprites ------------------------------------------- // invader sprites -var invader_a = - require("heatshrink").decompress(atob("hcIwkBiIBBAQoECCQQFBgEQAIMBEhUBDoYWDAYI=")); -var invader_b = +var invader_a = + require("heatshrink").decompress(atob("hcIwkBiIBBAQoECCQQFBgEQAIMBEhUBDoYWDAYI=")); +var invader_b = require("heatshrink").decompress(atob("hcIwkBiIBBAQMQAoQEBgISCAYUQAIQAEB4YEBEAgEDAYIA==")); var boom = require("heatshrink").decompress(atob("hcJwkBiMQAIURgMQAgIKBAIICFAIMAAwIWBBAYSIEAgrDiA=")); @@ -62,152 +73,297 @@ var inv_shot = require("heatshrink").decompress(atob("gcFwkBiERiAABAYQ")); // turret sprites -var turret = +var turret = require("heatshrink").decompress(atob("h8IwkBiIABAYYACgAHFiEABggADCAInFgITBAAgOPA==")); -var tur_exp_a = +var tur_exp_a = require("heatshrink").decompress(atob("h8IwkBiMRiACBAAwJEiAABBQgZCAAkAiAJBBoIUBgIABBgQACDIQ9ECQIA==")); -var tur_exp_b = +var tur_exp_b = require("heatshrink").decompress(atob("h8IwkBiIBBAAUBiADCiMQAwQFDCIYXEB4IABgMAEYQXBiEAAQIQBAoIABDAQUCAAIVBA")); var shot = require("heatshrink").decompress(atob("gMDwkBAoIA==")); // function to move and animate invader -function move_anim_inv() { - // invader anim code - i_anim_delay -= 1; - if ((i_anim_delay < 0) && !(been_hit)) { - i_anim_delay = 10; - - inv_frame += 1; - if (inv_frame > 2) { - inv_frame = 1; - } - - // move right - if (i_dir == 1){ - inv_x += ix_speed; - if (inv_x >= 142) { - inv_y += 8; // step down - i_dir = -1; - } - } - - // move left - if (i_dir < 1){ - inv_x -= ix_speed; - if (inv_x <= 10) { - inv_y += 8; // step down - i_dir = 1; - } - } - } -} +function move_anim_inv() { + // invader anim code + i_anim_delay -= 1; + if ((i_anim_delay < 0) && !(been_hit)) { + i_anim_delay = 10; + inv_frame += 1; + if (inv_frame > 2) { + inv_frame = 1; + } + + // move right + if (i_dir == 1){ + inv_x += ix_speed; + if (inv_x >= 142) { + inv_y += 8; // step down + i_dir = -1; + } + } + + // move left + if (i_dir < 1){ + inv_x -= ix_speed; + if (inv_x <= 10) { + inv_y += 8; // step down + i_dir = 1; + } + } + } +} // function to make invader fire -function invader_fire() { - inv_fire_pause -= 1; +function invader_fire() { + inv_fire_pause -= 1; - if (!(inv_fired)) { // so once invader shot is fired it doesn't follow the invader still - inv_shot_x = inv_x + 8; - inv_shot_y = inv_y + 18; - } - - if (inv_fire_pause < 0) { - inv_fired = true; - inv_shot_y += 8; - } + if (!(inv_fired)) { // so once invader shot is fired it doesn't follow the invader still + inv_shot_x = inv_x + 8; + inv_shot_y = inv_y + 18; + } + + if (inv_fire_pause < 0) { + inv_fired = true; + inv_shot_y += 8; + } } +// function to make turret explode (when hit) then start back in center +function turret_hit() { + if (turret_been_hit) { + if (!(explosion_play)) { + Bangle.buzz(); + //Bangle.beep(); + } + + explosion_play = true; + turret_anim_delay -= 1; + turret_blast_delay -= 1; + + if (turret_anim_delay < 0) { + turret_exp_frame += 1; + if (turret_exp_frame > 2) { + turret_exp_frame = 1; + } + turret_anim_delay = 3; + } + + if (turret_blast_delay < 0) { + turret_blast_delay = 21; + turret_been_hit = false; + explosion_play = false; + tur_x = 77; // reset turret x + tur_y = 148; // reset turret y + } + } +} +// function to make invader explode (when hit) then randomly start somewhere else +function invader_hit() { + if (been_hit) { + if (!(boom_play)) { + Bangle.buzz(); + //Bangle.beep(); + } + inv_shot_x = -32; // hide shot + inv_shot_y = -32; // hide shot + inv_fire_pause = 30; // and reset pause + boom_play = true; + blast_delay -= 1; + + if (blast_delay < 0) { + blast_delay = 15; + boom_play = false; + been_hit = false; + bx = -32; // move boom off screen (following invader) + by = -32; + //inv_x = rand() % (464 - 16) + 4; // move invader to random x position + inv_x = 77; // move invader back up after being hit + inv_y = 20; // move invader back up after being hit + i_dir = 1; // reset invader direction + } + } +} // - setup stuff --------------------------------------- function gameStart() { - setInterval(onFrame, 50); + setInterval(onFrame, 50); } - // - main loop ----------------------------------------- function onFrame() { - // if not game over - if(game_over == false) { + + // game over state + if(game_over) { g.clear(); - + + // draw text during game over state + g.setFont("4x6", 2); // set font and size x 2 + g.setColor(0,0,0); // set color (black) + g.drawString("SCORE:" + score ,5, 5); + g.drawString("LIVES:" + lives ,117, 5); + g.drawString("GAME OVER", 52, 80); + + + // draw sprites during game over state + // - invader frame 2 + g.drawImage(invader_b, inv_x, inv_y, {scale:2}); + g.drawImage(tur_exp_b, tur_x, tur_y, {scale:2}); + g.drawImage(inv_shot, inv_shot_x, inv_shot_y, {scale:2}); + + + // reset stuff + if(BTNS.read()) { + turret_been_hit = false; + tur_x = 77; // reset turret to center of screen + tur_y = 148; // reset turret y + inv_x = 77; // reset invader to center of screen + inv_y = 20; // reset invader back to top + i_dir = 1; // reset invader direction + lives = 3; // reset lives + score = 0; // reset score + explosion_play = false; + game_over = false; + } + + + g.flip(); + } + + + // not game over state (game running) + if(!(game_over)) { + g.clear(); + // call function to move and animate invader move_anim_inv(); - + // call function to make invader fire invader_fire(); // check input (screen presses) - if(BTNL.read() && tur_x >= 12) { + if(BTNL.read() && tur_x >= 12 && !(turret_been_hit)) { tur_x -= 6; } - else if(BTNR.read() && tur_x <= 140) { + else if(BTNR.read() && tur_x <= 140 && !(turret_been_hit)) { tur_x += 6; } - else if(BTNF.read()) { - tur_y -= 5; + else if(BTNF.read() && !(turret_been_hit)) { + shot_fired = true; + sx=tur_x + 12; + sy=tur_y - 7; + } + + + // check for turret shot going off screen before allowing to fire again + if (shot_fired) { + sy -= 8; + if (sy < 22) { + shot_fired = false; + sx = -32; + sy = -32; + } } - - - // check for invader shot going off screen before allowing to fire again if (inv_shot_y > 150 ) { - inv_fired = false; - inv_shot_x = inv_x - 1; - inv_shot_y = inv_y + 7; - inv_fire_pause = 30; + inv_fired = false; + inv_shot_x = inv_x - 1; + inv_shot_y = inv_y + 7; + inv_fire_pause = 30; } - - - - + + + // check for turret shot and invader collision + if ((sx >= inv_x) && (sx <= inv_x + 20) && (sy <= inv_y + 14)) { + sx = -32; + sy = -32; + been_hit = true; + score += 10; + } + + + // check for invader shot and turret collision + if ((inv_shot_x + 4) >= (tur_x) && (inv_shot_x) <= (tur_x + 24) && (inv_shot_y + 8) >= (tur_y + 6)) { + if (!(turret_been_hit)) { + lives -= 1; + + if (lives == 0) { + game_over = true; + } + turret_been_hit = true; + } + } + + // - draw sprites ---------------------------------- - // draw invader sprites - if(inv_frame == 1) { - g.drawImage(invader_a, inv_x, inv_y, {scale:2}); - } - else if(inv_frame == 2) { - g.drawImage(invader_b, inv_x, inv_y, {scale:2}); - } - //g.drawImage(invader_b, inv_x + 30, inv_y, {scale:2}); - //g.drawImage(boom, inv_x + 60, inv_y, {scale:2}); - // - invader shot - if (inv_fired) { - //DrawTexture(inv_shot, inv_shot_x, inv_shot_y, WHITE); - g.drawImage(inv_shot, inv_shot_x, inv_shot_y, {scale:2}); + // invader sprites + if(!(been_hit)) { + if(inv_frame == 1) { + // - invader frame 1 + g.drawImage(invader_a, inv_x, inv_y, {scale:2}); + } + else if(inv_frame == 2) { + // - invader frame 2 + g.drawImage(invader_b, inv_x, inv_y, {scale:2}); + } + } + else { + // - invader explosion + g.drawImage(boom, inv_x, inv_y, {scale:2}); + } + // - invader shot + if (inv_fired) { + g.drawImage(inv_shot, inv_shot_x, inv_shot_y, {scale:2}); } else { - //DrawTexture(inv_shot, -32, -32, WHITE); g.drawImage(inv_shot, -32, -32, {scale:2}); - } - + } - // draw turret sprites - g.drawImage(turret, tur_x, tur_y, {scale:2}); - //g.drawImage(tur_exp_a, tur_x + 30, tur_y, {scale:2}); - //g.drawImage(tur_exp_b, tur_x + 60, tur_y, {scale:2}); - //g.drawImage(shot, tur_x - 30, tur_y, {scale:2}); + // turret sprites + if(!(turret_been_hit)) { + // - undamaged turret + g.drawImage(turret, tur_x, tur_y, {scale:2}); + } + else { + if(turret_exp_frame == 1) { + // - turret explosion frame 1 + g.drawImage(tur_exp_a, tur_x, tur_y, {scale:2}); + } + else if(turret_exp_frame == 2) { + // - turret explosion frame 2 + g.drawImage(tur_exp_b, tur_x, tur_y, {scale:2}); + } + } + // - turret shot + g.drawImage(shot, sx, sy, {scale:2}); + + + // call function to make invader explode then randomly start somewhere else + invader_hit(); + + + // call function to make turret explode (when hit) then start back in center + turret_hit(); // - draw text ------------------------------------- - g.setFont("4x6", 2); - g.setColor(0,0,0); - g.drawString("SCORE:" + score ,5,5); // - g.drawString("LIVES:" + lives ,117,5); // + g.setFont("4x6", 2); // set font and size x 2 + g.setColor(0,0,0); // set color (black) + g.drawString("SCORE:" + score ,5,5); + g.drawString("LIVES:" + lives ,117,5); g.flip(); @@ -215,7 +371,6 @@ function onFrame() { } - gameStart(); diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 7e7f5dee2..bae9baea4 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.02", + "version":"0.03", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot.png" } ], diff --git a/apps/invader/screenshot_2.png b/apps/invader/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6ade79ce4026276af3b84aa01c8e60babe17dc GIT binary patch literal 1878 zcmd^A=~Gh&5Px~TghwnTK|ltPfQW#AFl|+)sRSYzX&h1PfCLG65fPQ7))GR3Nh&&^ zf(HdeE)TRd5WpyR;AuUv615G8NO(=~;tn(+7!vyY2l}}){jmG{u(R{q-P!$Z?v~9A zJEAKQ006tFjS(>z)_*dXfcd(nAvOlM!!ZmxAn$hj001_msEF|I`0TOrzrHUE{)}*V zV*Xk0g-sV)T6xQv;((5^PRC%lEsdUgpZ47EERX3GO%Hx6Tn0Fn4Vd2XSX0pP=bN!}3jw zWU`UMW$NJ$6N7lba_!D=Q0}t7MRa)z9kt)JRUdarF`o%7hbk-tX%5fG{596Cf5JC^yJkj8vPV zDlmwb-Ya$pLu2Nat1t)%*D^64zwC3I{{&ru6MwF#TTj)dB%xneEu-&v`!y3)RIR)# z-H^DyAODzavRG~W!KCEAoD;$_q$h6oUi|I+^ru}H=bJAlmYuh37KBwpz&*9}*Z>8RPS&((Xm;{d}IT_SLKL zz(LkU)n;{bIZGXOH471kgf#y%Mp2aSh@>pzmW z?+}lVd2wfK^Lh&qE%-w^MbZ|%r9B&RUR;%BhF^=MT7y@8GceH4K*tw3)=?z)@$WUE zU`AyX-vS4$3Y#&Ko6XSu5k@i(*V16|91A6{I8yfrqRPhDHB$*!Ml3rosD}+ zPNx~&``RAJd#lp%@SMT0SLv>Ja1wF8G}6c<3ej8gGcx=19=&|YmGQIK#W#`Q_W4}T zPwJ4LKT@NLiJ10(=sEe&HDo0SG9JItUBy?3iagEE(%W42rU^31^wXd5b Date: Sat, 28 May 2022 10:05:25 -0800 Subject: [PATCH 11/21] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index bae9baea4..445d165f2 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -4,7 +4,7 @@ "version":"0.03", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", - "screenshots" : [ { "url":"screenshot.png" } ], + "screenshots" : [ { "url":"screenshot.png" }, { "url":"screenshot_2.png" } ], "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", From 32b72e1c1675ce605f3d01ff6dd6bc700a91a3a1 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 10:06:21 -0800 Subject: [PATCH 12/21] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 445d165f2..36dbdf9fc 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.03", + "version":"0.04", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot.png" }, { "url":"screenshot_2.png" } ], From f9df01f8cda4607321927dd4f6b57b3d5e45008b Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 11:23:50 -0800 Subject: [PATCH 13/21] Add files via upload --- apps/invader/metadata.json | 4 ++-- apps/invader/screenshot_0.png | Bin 0 -> 1598 bytes apps/invader/screenshot_1.png | Bin 0 -> 1707 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 apps/invader/screenshot_0.png create mode 100644 apps/invader/screenshot_1.png diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 36dbdf9fc..c84271925 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,10 +1,10 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.04", + "version":"0.05", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", - "screenshots" : [ { "url":"screenshot.png" }, { "url":"screenshot_2.png" } ], + "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", diff --git a/apps/invader/screenshot_0.png b/apps/invader/screenshot_0.png new file mode 100644 index 0000000000000000000000000000000000000000..804f3e435fba61068f3902cddd6255f1fc2487dc GIT binary patch literal 1598 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlf%S){i(^Pd z+}k^Mr(HJSaeeshul%kxtap4Q1Ln->(D=J!tM19@-F?4}ZQ|EofBjIN$(hrJ(`HNY zsehgg2V5k48xAbKy}W{{IKhOGsXuT2BhE987g;!LcGY&N8?d_xD|~qIO>^D>nUSDS zPw~U&k1o1kg-@x+k*OAq~E?d51DP#Kok!6+N8$ZX@G1CQhSWWD=Yg*kF zqWzwJu>_V`}$2D%|o9q|NVv^t=OC=kB*+2#bG^&J}f3&7d(>aaH)qR~279 zR{KrRy8ntZ_-gUiLiK{w11BF(6=3=IJ^Uq$UE~F=KmWyctXgk%uz%h9N9+5-zlOxS zhR;77{_(s_Is3n7d@+pcS*&*L>)LM>ch&hp*M&zrge`t&@8+^^)OPBA%%b)oELE?t zb%kHUD_>958q>JFnrq%Qg#NkuF>8P5-q6qC>lH%(hVBFUgWyPV~czUvpFM=Sc!h z{}Q{S_jH-Rcm26NyC-z(t9&@dCRm}o;#nrkJ&rjCq#aHDl|Q&W0CHAUN;Upx+9UMs zZ(r2edjHM4?#=!2+f8uBfwSppX0nZ(b4*uRN;PucSrY@~)qjrJdpPa(2D!6ye~241 z30M5RTD(vc81AhlG5W0sSmL%nbJFJUdBFX0M;uop=bpT?tziN)4v1eW+$#c9eRmf3 zT7?hsEbHo4PxvRZ?N?*9X`SNoC~rlB#^_dWb!CIb%YIvr0Vy!=gWsa7`Rc2zzf|A) zGPmmawqsyl3RbA^_+Z5Jp2h3I+y{qFbLkf&SW&Q-h2zfY=xqj!Ozn+a q*S#AK?A?>fEvzsqMeopfz^;6V&E~Y|UqN7nz~JfX=d#Wzp$PyM9^8Te literal 0 HcmV?d00001 diff --git a/apps/invader/screenshot_1.png b/apps/invader/screenshot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae936f6c7adf3ca353f737179adfab9fa5a1c80e GIT binary patch literal 1707 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfi2b3#WAEJ z?(OZ1MVCE9Trd9kZ+|N|U`dyu#@f8O*A!3A+O8S>{gk(LU(SP%HFop!|0#d)WR+w3 zw

r=6?}^4FYys8yf7tJ}v&lbnU=$u^$Exjz9jmU;O*8%J+XiE_kM95NciAm|UGv1ecuvFpd-u}n8U9}_IREcK z?azku|5(odJF?EM-fYI^_X_26&%gN@U;FRHuU@D5U#o5JZ~lFL-?{#0f4|CBlrU}9 z|M2Sb`F$4_a~GHXKau?HPnrGyH$VIGKA!v6@V}Vx{J)mIxC2=Z>%XThwsr59KP!1R zyI1bM?4wtIb~E|K&ez^vu>4))`nn3?4_RH=$2or-%{4u6as7ge){oz8=UeQ*b+!G= z^yY}uy7gCXewMxKBvX63pzPlZ^Pe}v?P~dLeud8EiaL<4|M1S|b8O#IneD3In>R@@ z&aG{a_@t#IZ&Reug?*57nyk=e5)eSg^JMBR41 z2Xmgjw7(%xz!!VK(t9!&6O-P8=$XO-1?Mg;X=-TTei8PJg=NlWla&ez514jMwPa*` zuH&o4!Lg$uFV)XsRLf|H4dn#GuWl>XKfm90{(0$bwd+Nh_C2iPu8`l<@crh#z3snu z9kMP2WsB4HYMd3y@77;rx|gBzpmzt;KF06Y+s(HN{9dz{Ievp}Rr_9pOWQ>!S1`?E z`Th4L)4m3AtB?cS6LudeU2Rxz$YPUU_T%e~Lo4|CKbGE(2sx0v_;P%|ZjaChR})5k zhFz@@4!27>8pIP=_dv5QFuUho2Il4l(GN_wmN~QRVbFfSy2ZDhqe6Ji#_t>)KjhM* f%{cM#{;)rs6=x$HfA9&g_F?dJ^>bP0l+XkKTNVEM literal 0 HcmV?d00001 From f3ff034439d87e6c8567ad5bd9af9ad362d7e064 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 12:22:44 -0800 Subject: [PATCH 14/21] Add files via upload --- apps/invader/app.js | 112 +++++++++++++++++++++++++++++-------- apps/invader/metadata.json | 2 +- 2 files changed, 89 insertions(+), 25 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index 59dbb8d42..af73aaeb3 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -6,12 +6,6 @@ // resolution 176x176 -// to do: -// random invader restart x -// stop auto fire - - - // - variables ----------------------------------------- // invader variables var inv_x = 77; @@ -22,10 +16,10 @@ var ix_speed = 6; // march speed var i_dir = 1; // 1 = right, 0 = left var been_hit = false; // invader hit state // - shoot variables -var inv_shot_x = -32; -var inv_shot_y = -32; +var inv_shot_x = -32; +var inv_shot_y = -32; var inv_fire_pause = 30; -var inv_fired = false; // invader fired state +var inv_fired = false; // invader fired state // - explode variables var been_hit = false; // invader hit state var bx = -32; // blast x @@ -42,13 +36,16 @@ var sy = -20; // turret shot starting y - off screen var turret_been_hit = false; var turret_blast_delay = 21; // keep blast active on screen for 60 frames var turret_exp_frame = 1; // turret explode start animation frame -var turret_anim_delay = 3; // turret explode animation delay +var turret_anim_delay = 3; // turret explode animation delay var explosion_play = false; // misc variables -var score = 0; -var lives = 3; -var game_over = false; +var score = 0; // starting score +var lives = 3; // starting lives +var game_state = 0; // game state - 0 = game not started, 1 = game running, 3 = game over +var ang = 0.1; +var start_been_pressed = false; // stops double press on restart +var fire_been_pressed = false; // stops auto fire // input(screen controller) variables var BTNL, BTNR, BTNF, BTNS; // button - left, right, fire, start @@ -184,8 +181,9 @@ function invader_hit() { been_hit = false; bx = -32; // move boom off screen (following invader) by = -32; - //inv_x = rand() % (464 - 16) + 4; // move invader to random x position - inv_x = 77; // move invader back up after being hit + // to gerate a random rounded number between 10 and 142; + inv_x = Math.floor(Math.random() * 142) + 10; + //inv_x = 77; // move invader back up after being hit inv_y = 20; // move invader back up after being hit i_dir = 1; // reset invader direction } @@ -199,11 +197,68 @@ function gameStart() { } -// - main loop ----------------------------------------- +// - main loop ------------------------------------------------------------- function onFrame() { + // game not started state (title screen) + if(game_state == 0) { + g.clear(); + + + if (!(BTNS.read())) { + start_been_pressed = false; // stops double press on restart + } + + + // draw text during game over state + g.setFont("4x6", 4); // set font and size x 2 + g.setColor(0,1,0); // set color (black) + g.drawString("INVADER", 33, 55); + + + // just animate invader + // invader anim code + i_anim_delay -= 1; + if(i_anim_delay < 0) { + i_anim_delay = 25; + + inv_frame += 1; + if (inv_frame > 2) { + inv_frame = 1; + } + } + + + // draw sprites during game over state + //ang += 0.1; + //g.drawImage(invader_a, 88, 98, {scale:4, rotate:ang}); + if(inv_frame == 1) { + g.drawImage(invader_a, 88-22, 85, {scale:4}); + } + else if(inv_frame == 2) { + g.drawImage(invader_b, 88-22, 85, {scale:4}); + } + + // reset stuff + if(BTNS.read() && !(start_been_pressed)) { + turret_been_hit = false; + tur_x = 77; // reset turret to center of screen + tur_y = 148; // reset turret y + inv_x = 77; // reset invader to center of screen + inv_y = 20; // reset invader back to top + i_dir = 1; // reset invader direction + lives = 3; // reset lives + score = 0; // reset score + explosion_play = false; + game_state = 1; + } + + + g.flip(); + } + // game over state - if(game_over) { + if(game_state == 3) { g.clear(); // draw text during game over state @@ -232,7 +287,8 @@ function onFrame() { lives = 3; // reset lives score = 0; // reset score explosion_play = false; - game_over = false; + game_state = 0; + start_been_pressed = true; } @@ -241,9 +297,15 @@ function onFrame() { // not game over state (game running) - if(!(game_over)) { + if(game_state == 1) { g.clear(); + + if (!(BTNF.read())) { + fire_been_pressed = false; // stops auto fire + } + + // call function to move and animate invader move_anim_inv(); @@ -258,8 +320,9 @@ function onFrame() { else if(BTNR.read() && tur_x <= 140 && !(turret_been_hit)) { tur_x += 6; } - else if(BTNF.read() && !(turret_been_hit)) { + else if(BTNF.read() && !(turret_been_hit) && !(fire_been_pressed) && !(shot_fired)) { shot_fired = true; + fire_been_pressed = true; // stops auto fire sx=tur_x + 12; sy=tur_y - 7; } @@ -301,7 +364,7 @@ function onFrame() { lives -= 1; if (lives == 0) { - game_over = true; + game_state = 3; } turret_been_hit = true; } @@ -332,7 +395,7 @@ function onFrame() { g.drawImage(inv_shot, -32, -32, {scale:2}); } - // turret sprites + // turret sprites if(!(turret_been_hit)) { // - undamaged turret g.drawImage(turret, tur_x, tur_y, {scale:2}); @@ -363,12 +426,13 @@ function onFrame() { g.setFont("4x6", 2); // set font and size x 2 g.setColor(0,0,0); // set color (black) g.drawString("SCORE:" + score ,5,5); - g.drawString("LIVES:" + lives ,117,5); + g.drawString("LIVES:" + lives ,117,5); g.flip(); } -} + +} // end main loop --------------------------------------------------------- gameStart(); diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index c84271925..b7f6b0c88 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.05", + "version":"0.06", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From 21fdba71d345a44dafc79d1b26647d6633806783 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 12:50:18 -0800 Subject: [PATCH 15/21] Add files via upload --- apps/invader/screenshot_1.png | Bin 1707 -> 1719 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/invader/screenshot_1.png b/apps/invader/screenshot_1.png index ae936f6c7adf3ca353f737179adfab9fa5a1c80e..14164bc6e2a46a8df943511f499278884afbcf66 100644 GIT binary patch literal 1719 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfvwQf#WAEJ z?(N-&MRTlp93Fo9$A5P2Y%^oc*lUMQZ1dRn@3n&WqZbdDZu)Moz5hM_pTdU#Ch10b zE6dz^0R;m=Ip2l@{c`i4ah_>(7p~C$ur0TK?wya7??3;zS^VJU$BcW*H&>sZz4o7+ z?N0Nv+t2+z@!$BW`u)ehHt*m5?DDM7H#K7--5=y%^tN>U)s5HqicIfc zeiZ%rx6S-(`zKtil>O=Q+I{D~)8C8O^Gq)Ysr;_^;&Pttveo?6KUW`jKmYwUSIt+h z+}OswPV(>1MwN2>nSDT~vHJPtPuf*~9>?7OtDs!fy6uS4hdZ{j53t|c%e3v?!gK2$ zykLm(-IA0q(?9qfUBPfa?7@rb9bzlQ z7QEoQyE}OMuieU?Pq!ZbDf@G4-}bU|*M9B(x8>9StAi~giJcdn|G3xl@ z&)IjAzSuo+{he)hr1zkFP>rlFT*pd zKTb~nv-Y&$j062*a}MP1W4U=Na9|FwmRG|8SN6qgB^XC}gC->Q_TJj|_VJH>?>TQS+2Pc1AUtF4 z5g`l4q;xK(@}}yoJtsO1npbkju!wRh7qkTB@iYoo2$@5rfA8u!z$suIEU-iP&i~UL z)y#31f|%|zcs`K+Flidl5S59-3T4X_3e+vWAK-i-6eM85xJcwRhd_mF^;BVw5ywl? zZvB6Bh3ks{7LC7ewuTE?^t>ukXw+Bk*8d^$eMi#$?-fE5^Em}77AUaDaeVjBV&YHn zdC*wEX~Xz#+g_bVVoLpcWq+`p-Yomg?Nt9#mVRNCf;m_1C$j8g)X&sxw07tdx_-Os z^{gk(LU(SP%HFop!|0#d)WR+w3 zw

r=6?}^4FYys8yf7tJ}v&lbnU=$u^$Exjz9jmU;O*8%J+XiE_kM95NciAm|UGv1ecuvFpd-u}n8U9}_IREcK z?azku|5(odJF?EM-fYI^_X_26&%gN@U;FRHuU@D5U#o5JZ~lFL-?{#0f4|CBlrU}9 z|M2Sb`F$4_a~GHXKau?HPnrGyH$VIGKA!v6@V}Vx{J)mIxC2=Z>%XThwsr59KP!1R zyI1bM?4wtIb~E|K&ez^vu>4))`nn3?4_RH=$2or-%{4u6as7ge){oz8=UeQ*b+!G= z^yY}uy7gCXewMxKBvX63pzPlZ^Pe}v?P~dLeud8EiaL<4|M1S|b8O#IneD3In>R@@ z&aG{a_@t#IZ&Reug?*57nyk=e5)eSg^JMBR41 z2Xmgjw7(%xz!!VK(t9!&6O-P8=$XO-1?Mg;X=-TTei8PJg=NlWla&ez514jMwPa*` zuH&o4!Lg$uFV)XsRLf|H4dn#GuWl>XKfm90{(0$bwd+Nh_C2iPu8`l<@crh#z3snu z9kMP2WsB4HYMd3y@77;rx|gBzpmzt;KF06Y+s(HN{9dz{Ievp}Rr_9pOWQ>!S1`?E z`Th4L)4m3AtB?cS6LudeU2Rxz$YPUU_T%e~Lo4|CKbGE(2sx0v_;P%|ZjaChR})5k zhFz@@4!27>8pIP=_dv5QFuUho2Il4l(GN_wmN~QRVbFfSy2ZDhqe6Ji#_t>)KjhM* f%{cM#{;)rs6=x$HfA9&g_F?dJ^>bP0l+XkKTNVEM From c00820190c50ef343a857e7fa483e662c90003d4 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 13:00:06 -0800 Subject: [PATCH 16/21] Add files via upload --- apps/invader/README.md | 2 +- apps/invader/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/invader/README.md b/apps/invader/README.md index e0036cb8a..7ed98defb 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -20,4 +20,4 @@ bkumanchik on Espruino Forums ## Creator -Brian Kumanchik +Brian Kumanchik 2022 diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index b7f6b0c88..add8a05e1 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.06", + "version":"0.07", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From 3d296473d4a15b2083122bf5f8ce188b0d49f599 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 13:15:33 -0800 Subject: [PATCH 17/21] Add files via upload --- apps/invader/app.js | 50 +++++++++++++++++++++++--------------- apps/invader/metadata.json | 2 +- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index af73aaeb3..fa53c608d 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -3,7 +3,12 @@ // My Invader Demo, for Bangle.js 2, written JavaScript - using Espruino Web IDE -// resolution 176x176 +// note: resolution is 176x176 + + +// to do: +// make invader clock +// upload to official app page // - variables ----------------------------------------- @@ -34,7 +39,7 @@ var shot_fired = false; // turret fired state var sx = -20; // turret shot starting x - off screen var sy = -20; // turret shot starting y - off screen var turret_been_hit = false; -var turret_blast_delay = 21; // keep blast active on screen for 60 frames +var turret_blast_delay = 25; // keep blast active on screen for 60 frames var turret_exp_frame = 1; // turret explode start animation frame var turret_anim_delay = 3; // turret explode animation delay var explosion_play = false; @@ -50,7 +55,7 @@ var fire_been_pressed = false; // stops auto fire // input(screen controller) variables var BTNL, BTNR, BTNF, BTNS; // button - left, right, fire, start var tap = {}; -// use tapping on screen for left and right +// use tapping on screen for left, right, fire, start Bangle.on('drag',e=>tap=e); BTNL = { read : _=>tap.b && tap.x < 88 && tap.y > 88}; BTNR = { read : _=>tap.b && tap.x > 88 && tap.y > 88}; @@ -133,7 +138,7 @@ function invader_fire() { function turret_hit() { if (turret_been_hit) { if (!(explosion_play)) { - Bangle.buzz(); + //Bangle.buzz(); //Bangle.beep(); } @@ -144,6 +149,7 @@ function turret_hit() { if (turret_anim_delay < 0) { turret_exp_frame += 1; if (turret_exp_frame > 2) { + Bangle.buzz(); turret_exp_frame = 1; } turret_anim_delay = 3; @@ -181,9 +187,8 @@ function invader_hit() { been_hit = false; bx = -32; // move boom off screen (following invader) by = -32; - // to gerate a random rounded number between 10 and 142; - inv_x = Math.floor(Math.random() * 142) + 10; - //inv_x = 77; // move invader back up after being hit + // generate a random rounded number between 10 and 142; + inv_x = Math.floor(Math.random() * 142) + 10; inv_y = 20; // move invader back up after being hit i_dir = 1; // reset invader direction } @@ -200,7 +205,7 @@ function gameStart() { // - main loop ------------------------------------------------------------- function onFrame() { - // game not started state (title screen) + // game not started state (title screen) *************************** if(game_state == 0) { g.clear(); @@ -230,6 +235,7 @@ function onFrame() { // draw sprites during game over state + // next 2 line for a rotating invader on the title screen //ang += 0.1; //g.drawImage(invader_a, 88, 98, {scale:4, rotate:ang}); if(inv_frame == 1) { @@ -251,13 +257,15 @@ function onFrame() { score = 0; // reset score explosion_play = false; game_state = 1; + turret_blast_delay = 25; } g.flip(); } - // game over state + + // game over state ************************************************* if(game_state == 3) { g.clear(); @@ -278,17 +286,18 @@ function onFrame() { // reset stuff if(BTNS.read()) { - turret_been_hit = false; - tur_x = 77; // reset turret to center of screen - tur_y = 148; // reset turret y - inv_x = 77; // reset invader to center of screen - inv_y = 20; // reset invader back to top - i_dir = 1; // reset invader direction - lives = 3; // reset lives - score = 0; // reset score - explosion_play = false; + //turret_been_hit = false; + //tur_x = 77; // reset turret to center of screen + //tur_y = 148; // reset turret y + //inv_x = 77; // reset invader to center of screen + //inv_y = 20; // reset invader back to top + //i_dir = 1; // reset invader direction + //lives = 3; // reset lives + //score = 0; // reset score + //explosion_play = false; game_state = 0; start_been_pressed = true; + //turret_blast_delay = 25; } @@ -296,7 +305,7 @@ function onFrame() { } - // not game over state (game running) + // not game over state (game running) ****************************** if(game_state == 1) { g.clear(); @@ -364,7 +373,8 @@ function onFrame() { lives -= 1; if (lives == 0) { - game_state = 3; + game_state = 3; + Bangle.buzz(); } turret_been_hit = true; } diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index add8a05e1..9ef8d7f31 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.07", + "version":"0.08", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From e564efbcea74f5df4467428c612d6be5f15e60d6 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sun, 29 May 2022 07:21:23 -0800 Subject: [PATCH 18/21] Add files via upload --- apps/invader/app.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index fa53c608d..e4aef423d 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -7,8 +7,9 @@ // to do: -// make invader clock // upload to official app page +// make invader clock + // - variables ----------------------------------------- @@ -225,7 +226,7 @@ function onFrame() { // invader anim code i_anim_delay -= 1; if(i_anim_delay < 0) { - i_anim_delay = 25; + i_anim_delay = 15; inv_frame += 1; if (inv_frame > 2) { From fcde17946da3add20468a7a6b1d2ecfc790c3d5c Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sun, 29 May 2022 07:22:40 -0800 Subject: [PATCH 19/21] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 9ef8d7f31..d3a70728b 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.08", + "version":"0.09", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From 4f807796f4aa47f09626d48a21c7a50eae098c93 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Tue, 31 May 2022 08:18:39 -0800 Subject: [PATCH 20/21] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index d3a70728b..168d83235 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.09", + "version":"0.10", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From 37cd4a1f5e9bc357175272acc963e1a028bfe140 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Tue, 31 May 2022 09:00:45 -0800 Subject: [PATCH 21/21] Add files via upload --- apps/invader/app.js | 3 ++- apps/invader/metadata.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index e4aef423d..89e7462f6 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -207,7 +207,7 @@ function gameStart() { function onFrame() { // game not started state (title screen) *************************** - if(game_state == 0) { + if(game_state == 0) { g.clear(); @@ -308,6 +308,7 @@ function onFrame() { // not game over state (game running) ****************************** if(game_state == 1) { + Bangle.setLCDPower(1); // optional - this keeps the watch LCD lit up g.clear(); diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 168d83235..bb74f5122 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.10", + "version":"0.11", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ],