mirror of https://github.com/espruino/BangleApps
Add files via upload
parent
a5ed2385d4
commit
c3055367e6
|
@ -1,10 +1,10 @@
|
||||||
# App Name
|
# App Name
|
||||||
|
|
||||||
Invader - I'm creating this demo to learn JavaScript with the Bangle.js 2
|
Invader
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
For fun!
|
For fun! - I'm creating this demo to learn JavaScript with the Bangle.js 2
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ Shoot the Alien, you have three lives
|
||||||
|
|
||||||
## Controls
|
## 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
|
## Requests
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,9 @@
|
||||||
|
|
||||||
|
|
||||||
// to do:
|
// to do:
|
||||||
// add buzz
|
// random invader restart x
|
||||||
|
// stop auto fire
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// - variables -----------------------------------------
|
// - variables -----------------------------------------
|
||||||
|
@ -19,21 +21,29 @@ var inv_frame = 1; // invader start animation frame
|
||||||
var ix_speed = 6; // march speed
|
var ix_speed = 6; // march speed
|
||||||
var i_dir = 1; // 1 = right, 0 = left
|
var i_dir = 1; // 1 = right, 0 = left
|
||||||
var been_hit = false; // invader hit state
|
var been_hit = false; // invader hit state
|
||||||
//// shoot variables
|
// - shoot variables
|
||||||
var inv_shot_x = -32;
|
var inv_shot_x = -32;
|
||||||
var inv_shot_y = -32;
|
var inv_shot_y = -32;
|
||||||
var inv_fire_pause = 30;
|
var inv_fire_pause = 30;
|
||||||
var inv_fired = false; // invader fired state
|
var inv_fired = false; // invader fired state
|
||||||
//// explode variables
|
// - explode variables
|
||||||
var been_hit = false; // invader hit state
|
var been_hit = false; // invader hit state
|
||||||
var bx = -32; // blast x
|
var bx = -32; // blast x
|
||||||
var by = -32; // blast y
|
var by = -32; // blast y
|
||||||
var blast_delay = 60; // invader blast delay - pause after explosion
|
var blast_delay = 15; // invader blast delay - pause after explosion
|
||||||
var boom_play = false;
|
var boom_play = false;
|
||||||
|
|
||||||
// turret variables
|
// turret variables
|
||||||
var tur_x = 77;
|
var tur_x = 77;
|
||||||
var tur_y = 148;
|
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
|
// misc variables
|
||||||
var score = 0;
|
var score = 0;
|
||||||
|
@ -41,13 +51,14 @@ var lives = 3;
|
||||||
var game_over = false;
|
var game_over = false;
|
||||||
|
|
||||||
// input(screen controller) variables
|
// input(screen controller) variables
|
||||||
var BTNL, BTNR, BTNF;
|
var BTNL, BTNR, BTNF, BTNS; // button - left, right, fire, start
|
||||||
var tap = {};
|
var tap = {};
|
||||||
// use tapping on screen for left and right
|
// use tapping on screen for left and right
|
||||||
Bangle.on('drag',e=>tap=e);
|
Bangle.on('drag',e=>tap=e);
|
||||||
BTNL = { read : _=>tap.b && tap.x < 88 && tap.y > 88};
|
BTNL = { read : _=>tap.b && tap.x < 88 && tap.y > 88};
|
||||||
BTNR = { 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};
|
BTNF = { read : _=>tap.b && tap.x > 88 && tap.y < 88};
|
||||||
|
BTNS = { read : _=>tap.b && tap.x < 88 && tap.y < 88};
|
||||||
|
|
||||||
|
|
||||||
// - sprites -------------------------------------------
|
// - sprites -------------------------------------------
|
||||||
|
@ -74,58 +85,112 @@ var shot =
|
||||||
|
|
||||||
// function to move and animate invader
|
// function to move and animate invader
|
||||||
function move_anim_inv() {
|
function move_anim_inv() {
|
||||||
// invader anim code
|
// invader anim code
|
||||||
i_anim_delay -= 1;
|
i_anim_delay -= 1;
|
||||||
if ((i_anim_delay < 0) && !(been_hit)) {
|
if ((i_anim_delay < 0) && !(been_hit)) {
|
||||||
i_anim_delay = 10;
|
i_anim_delay = 10;
|
||||||
|
|
||||||
inv_frame += 1;
|
inv_frame += 1;
|
||||||
if (inv_frame > 2) {
|
if (inv_frame > 2) {
|
||||||
inv_frame = 1;
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
// 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 to make invader fire
|
||||||
function invader_fire() {
|
function invader_fire() {
|
||||||
inv_fire_pause -= 1;
|
inv_fire_pause -= 1;
|
||||||
|
|
||||||
if (!(inv_fired)) { // so once invader shot is fired it doesn't follow the invader still
|
if (!(inv_fired)) { // so once invader shot is fired it doesn't follow the invader still
|
||||||
inv_shot_x = inv_x + 8;
|
inv_shot_x = inv_x + 8;
|
||||||
inv_shot_y = inv_y + 18;
|
inv_shot_y = inv_y + 18;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inv_fire_pause < 0) {
|
if (inv_fire_pause < 0) {
|
||||||
inv_fired = true;
|
inv_fired = true;
|
||||||
inv_shot_y += 8;
|
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 ---------------------------------------
|
// - setup stuff ---------------------------------------
|
||||||
|
@ -134,11 +199,49 @@ function gameStart() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// - main loop -----------------------------------------
|
// - main loop -----------------------------------------
|
||||||
function onFrame() {
|
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();
|
g.clear();
|
||||||
|
|
||||||
// call function to move and animate invader
|
// call function to move and animate invader
|
||||||
|
@ -149,65 +252,118 @@ function onFrame() {
|
||||||
|
|
||||||
|
|
||||||
// check input (screen presses)
|
// check input (screen presses)
|
||||||
if(BTNL.read() && tur_x >= 12) {
|
if(BTNL.read() && tur_x >= 12 && !(turret_been_hit)) {
|
||||||
tur_x -= 6;
|
tur_x -= 6;
|
||||||
}
|
}
|
||||||
else if(BTNR.read() && tur_x <= 140) {
|
else if(BTNR.read() && tur_x <= 140 && !(turret_been_hit)) {
|
||||||
tur_x += 6;
|
tur_x += 6;
|
||||||
}
|
}
|
||||||
else if(BTNF.read()) {
|
else if(BTNF.read() && !(turret_been_hit)) {
|
||||||
tur_y -= 5;
|
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
|
// check for invader shot going off screen before allowing to fire again
|
||||||
if (inv_shot_y > 150
|
if (inv_shot_y > 150
|
||||||
) {
|
) {
|
||||||
inv_fired = false;
|
inv_fired = false;
|
||||||
inv_shot_x = inv_x - 1;
|
inv_shot_x = inv_x - 1;
|
||||||
inv_shot_y = inv_y + 7;
|
inv_shot_y = inv_y + 7;
|
||||||
inv_fire_pause = 30;
|
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 sprites ----------------------------------
|
||||||
// draw invader sprites
|
// invader sprites
|
||||||
if(inv_frame == 1) {
|
if(!(been_hit)) {
|
||||||
g.drawImage(invader_a, inv_x, inv_y, {scale:2});
|
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 if(inv_frame == 2) {
|
else {
|
||||||
g.drawImage(invader_b, inv_x, inv_y, {scale:2});
|
// - invader explosion
|
||||||
|
g.drawImage(boom, 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
|
// - invader shot
|
||||||
if (inv_fired) {
|
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});
|
g.drawImage(inv_shot, inv_shot_x, inv_shot_y, {scale:2});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//DrawTexture(inv_shot, -32, -32, WHITE);
|
|
||||||
g.drawImage(inv_shot, -32, -32, {scale:2});
|
g.drawImage(inv_shot, -32, -32, {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});
|
||||||
|
|
||||||
// draw turret sprites
|
|
||||||
g.drawImage(turret, tur_x, tur_y, {scale:2});
|
// call function to make invader explode then randomly start somewhere else
|
||||||
//g.drawImage(tur_exp_a, tur_x + 30, tur_y, {scale:2});
|
invader_hit();
|
||||||
//g.drawImage(tur_exp_b, tur_x + 60, tur_y, {scale:2});
|
|
||||||
//g.drawImage(shot, tur_x - 30, tur_y, {scale:2});
|
|
||||||
|
// call function to make turret explode (when hit) then start back in center
|
||||||
|
turret_hit();
|
||||||
|
|
||||||
|
|
||||||
// - draw text -------------------------------------
|
// - draw text -------------------------------------
|
||||||
g.setFont("4x6", 2);
|
g.setFont("4x6", 2); // set font and size x 2
|
||||||
g.setColor(0,0,0);
|
g.setColor(0,0,0); // set color (black)
|
||||||
g.drawString("SCORE:" + score ,5,5); //
|
g.drawString("SCORE:" + score ,5,5);
|
||||||
g.drawString("LIVES:" + lives ,117,5); //
|
g.drawString("LIVES:" + lives ,117,5);
|
||||||
|
|
||||||
|
|
||||||
g.flip();
|
g.flip();
|
||||||
|
@ -215,7 +371,6 @@ function onFrame() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
gameStart();
|
gameStart();
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{ "id": "invader",
|
{ "id": "invader",
|
||||||
"name": "Invader",
|
"name": "Invader",
|
||||||
"shortName":"Invader",
|
"shortName":"Invader",
|
||||||
"version":"0.02",
|
"version":"0.03",
|
||||||
"description": "A Space Invader game-like demo - work in progress",
|
"description": "A Space Invader game-like demo - work in progress",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"screenshots" : [ { "url":"screenshot.png" } ],
|
"screenshots" : [ { "url":"screenshot.png" } ],
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
Loading…
Reference in New Issue