mirror of https://github.com/espruino/BangleApps
commit
c1b15a3e87
13
apps.json
13
apps.json
|
@ -2127,6 +2127,19 @@
|
|||
{"name":"snake.img","url":"snake-icon.js","evaluate":true}
|
||||
]
|
||||
},
|
||||
{ "id": "snek",
|
||||
"name": "The snek game",
|
||||
"shortName":"Snek",
|
||||
"version": "0.01",
|
||||
"description": "A snek game where you control a snek to eat all the apples!",
|
||||
"icon": "snek-icon.js",
|
||||
"supports": ["BANGLEJS2"],
|
||||
"tags": "game,fun",
|
||||
"storage": [
|
||||
{"name":"snek.app.js","url":"snek.js"},
|
||||
{"name":"snek.img","url":"snek-icon.js","evaluate":true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "calculator",
|
||||
"name": "Calculator",
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
require("heatshrink").decompress(atob("pFIwkB+MRAEH/EUIA7i93u9xEUIABEf4AC+93/4CBETpDBv//gEHEf6MB9wkB/8HSDl3vwjCAAfnErIjiEQYdBAAXuAoSNXEYIdDAAoj4j/3DpN3v6NWAA3/fDYjgRgIjLu9xESj2BAAN/SQwLBEe4XDdwghDBQQjSCgN+C5D9FEebTDEZJEWEQSDVEdZpDZYPnETYhDAAhpeEbzREI0rTbEdXuETb4Bvz1BAYIj/EYxrg9yQDv/3JoS9WEcoaGAAQtBOwYABEaSMBWoYeFJKgjjiIUD9ySEEjwAJFogj0SQgAFBQ4jRABcfXoQj/TowjCOgIkeEf7lHvz+CEb93Ef4jHR8Rr/fY4jCuIifAAQj/EIojbeohGeEcQhHfLRFDeoIicEcQbDv3uEYiNXIgnu87SgEcf/DKnxBJEf/4ACESf/EcYA=="))
|
|
@ -0,0 +1,469 @@
|
|||
function init() {
|
||||
this.titleScreen = true;
|
||||
this.min = 0;
|
||||
this.max = 160;
|
||||
this.step = 20;
|
||||
this.scoreMultiplier = 25;
|
||||
this.totalGrid = this.max / this.step;
|
||||
|
||||
if (g.theme.dark) {
|
||||
this.textColor = 1;
|
||||
} else {
|
||||
this.textColor = 0;
|
||||
}
|
||||
|
||||
this.getNewPosistion = () => {
|
||||
let newPos;
|
||||
while (!newPos) {
|
||||
// random bonus points for bad luck / lag
|
||||
if (currentPosition.length > 10) {
|
||||
this.score += 1;
|
||||
}
|
||||
const x = Math.floor(Math.random() * this.totalGrid + 1) * this.step;
|
||||
const y = Math.floor(Math.random() * this.totalGrid + 1) * this.step;
|
||||
const found = currentPosition.find(pos => {
|
||||
return pos.x === x && pos.y === y;
|
||||
});
|
||||
if (!found) {
|
||||
newPos = {x: x, y: y};
|
||||
}
|
||||
}
|
||||
return newPos;
|
||||
};
|
||||
|
||||
this.restart = () => {
|
||||
g.clear();
|
||||
this.titleScreen = false;
|
||||
this.score = 0;
|
||||
this.paused = false;
|
||||
this.currentPosition = [{x: 2 * step, y: 3 * step},{x: 1 * step, y: 3 * step}];
|
||||
this.death = false;
|
||||
this.gameSpeed = 200;
|
||||
this.directionSet = null;
|
||||
this.direction = 1;
|
||||
this.createApple();
|
||||
};
|
||||
|
||||
const game = () => {
|
||||
if (this.death && !this.paused) {
|
||||
g.clear();
|
||||
this.showDeathScreen();
|
||||
} else if (this.titleScreen && !this.paused) {
|
||||
this.showTitleScreen();
|
||||
} else if (!this.paused) {
|
||||
g.clear();
|
||||
this.drawApple();
|
||||
this.drawSnake();
|
||||
this.boundries();
|
||||
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
game();
|
||||
}, this.gameSpeed);
|
||||
};
|
||||
|
||||
this.increaseDifficulity = () => {
|
||||
if (gameSpeed > 59) {
|
||||
gameSpeed -= 10;
|
||||
}
|
||||
};
|
||||
|
||||
this.createApple = () => {
|
||||
this.applePosition = getNewPosistion();
|
||||
};
|
||||
|
||||
this.drawApple = () => {
|
||||
g.setColor(0, 1, 0);
|
||||
|
||||
g.drawImage(this.appleLeaf, this.applePosition.x - 15, this.applePosition.y - 10);
|
||||
g.setColor(1, 0, 0);
|
||||
|
||||
g.drawImage(this.apple, this.applePosition.x - 15, this.applePosition.y - 2);
|
||||
};
|
||||
|
||||
this.checkmax = (x) => {
|
||||
if (x > this.max) {
|
||||
return this.min;
|
||||
} else if (x < this.min) {
|
||||
return this.max;
|
||||
}
|
||||
return x;
|
||||
};
|
||||
|
||||
this.movement = (lastItem) => {
|
||||
let newPosition;
|
||||
switch(this.direction) {
|
||||
case 3:
|
||||
newPosition = {
|
||||
x: checkmax(lastItem.x + this.step),
|
||||
y: lastItem.y
|
||||
};
|
||||
break;
|
||||
case 1:
|
||||
newPosition = {
|
||||
x: checkmax(lastItem.x - this.step),
|
||||
y: lastItem.y
|
||||
};
|
||||
break;
|
||||
case 2:
|
||||
newPosition = {
|
||||
x: lastItem.x,
|
||||
y: checkmax(lastItem.y + this.step)
|
||||
};
|
||||
break;
|
||||
case 0:
|
||||
newPosition = {
|
||||
x: lastItem.x,
|
||||
y: checkmax(lastItem.y - this.step)
|
||||
};
|
||||
break;
|
||||
}
|
||||
this.directionSet = false;
|
||||
this.checkDeath(newPosition);
|
||||
this.currentPosition.push(newPosition);
|
||||
|
||||
};
|
||||
|
||||
this.snakeHead = (props) => {
|
||||
switch (this.direction) {
|
||||
case 0:
|
||||
return [this.snakeUp, props.x - 9, props.y - 12];
|
||||
case 1:
|
||||
return [this.snakeLeft, props.x - 20, props.y - 10];
|
||||
case 3:
|
||||
return [this.snakeRight, props.x - 12, props.y - 12];
|
||||
case 2:
|
||||
return [this.snakeDown, props.x - 12, props.y - 7];
|
||||
default:
|
||||
return [this.snakeDown, props.x - 12, props.y - 7];
|
||||
}
|
||||
};
|
||||
|
||||
this.drawSnake = () => {
|
||||
const totalItems = this.currentPosition.length - 1;
|
||||
g.setColor(0, 1, 0);
|
||||
this.movement(this.currentPosition[totalItems]);
|
||||
this.currentPosition.forEach((props, index) => {
|
||||
if (index-1 === totalItems) {
|
||||
const head = this.snakeHead(props);
|
||||
|
||||
g.drawImage(head[0], head[1], head[2]);
|
||||
} else {
|
||||
g.fillCircle(props.x, props.y, 10);
|
||||
}
|
||||
});
|
||||
if (this.currentPosition[totalItems].x === this.applePosition.x && this.currentPosition[totalItems].y === this.applePosition.y) {
|
||||
this.createApple();
|
||||
this.increaseDifficulity();
|
||||
} else {
|
||||
this.currentPosition.shift();
|
||||
}
|
||||
};
|
||||
|
||||
this.checkDeath = (newPos) => {
|
||||
|
||||
const found = this.currentPosition.find((oldPos) => {
|
||||
return newPos.x === oldPos.x && newPos.y === oldPos.y;
|
||||
});
|
||||
if (found) {
|
||||
Bangle.buzz();
|
||||
g.clear();
|
||||
this.death = true;
|
||||
}
|
||||
};
|
||||
|
||||
this.boundries = () => {
|
||||
if (this.currentPosition.x >= this.maxPx) {
|
||||
this.currentPosition.x = this.maxPx;
|
||||
}
|
||||
else if (this.currentPosition.x < 10) {
|
||||
this.currentPosition.x = 10;
|
||||
}
|
||||
|
||||
if ( this.currentPosition.y >= this.maxPy) {
|
||||
this.currentPosition.y = this.maxPy;
|
||||
} else if (this.currentPosition.y < 10) {
|
||||
this.currentPosition.y = 10;
|
||||
}
|
||||
};
|
||||
|
||||
this.creatTopScrore = () => {
|
||||
require("Storage").writeJSON("snek_jd", {
|
||||
topScore: this.calculateScore()
|
||||
});
|
||||
};
|
||||
|
||||
this.calculateScore = () => {
|
||||
return currentPosition.length * this.scoreMultiplier + this.score;
|
||||
};
|
||||
|
||||
this.showDeathScreen = () => {
|
||||
this.paused = true;
|
||||
g.setFont('Vector', 25);
|
||||
g.setColor(1, 0, 0);
|
||||
g.drawString("GAME OVER",15, 50, "solid");
|
||||
g.setFont('Vector', 15);
|
||||
g.setColor(this.textColor, this.textColor, this.textColor);
|
||||
g.drawString("Score : " + this.calculateScore(), 50, 78, "solid");
|
||||
|
||||
let storage = require("Storage").readJSON("snek_jd");
|
||||
if (storage && storage.topScore) {
|
||||
if (storage.topScore < this.calculateScore()) {
|
||||
g.setColor(0, 1, 1);
|
||||
g.drawString("New top score!", 20, 95, "solid");
|
||||
g.setFont('Vector', 22);
|
||||
g.drawString(this.calculateScore(), 20, 115, "solid");
|
||||
|
||||
this.creatTopScrore();
|
||||
} else {
|
||||
g.setColor(this.textColor, this.textColor, this.textColor);
|
||||
g.drawString("Top score : " + storage.topScore, 20, 95, "solid");
|
||||
}
|
||||
} else {
|
||||
this.creatTopScrore();
|
||||
}
|
||||
g.setFont('Vector', 25);
|
||||
};
|
||||
|
||||
/* Events */
|
||||
Bangle.on('tap', (data) => {
|
||||
Bangle.setLCDPower(true);
|
||||
if (this.death) {
|
||||
this.showTitleScreen();
|
||||
} else if (this.titleScreen || this.paused) {
|
||||
this.restart();
|
||||
}
|
||||
});
|
||||
|
||||
Bangle.on('accel', (xyz) => {
|
||||
if (Math.abs(xyz.x) > Math.abs(xyz.y)) {
|
||||
if (xyz.x < 0) {
|
||||
if (!this.directionSet && this.direction !== 1) {
|
||||
Bangle.setLCDPower(true);
|
||||
this.direction = 3;
|
||||
}
|
||||
} else {
|
||||
if (!this.directionSet && this.direction !== 3) {
|
||||
Bangle.setLCDPower(true);
|
||||
this.direction = 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (xyz.y < 0) {
|
||||
if (!this.directionSet && this.direction !== 0) {
|
||||
Bangle.setLCDPower(true);
|
||||
this.direction = 2;
|
||||
}
|
||||
} else {
|
||||
if (!this.directionSet && this.direction !== 2) {
|
||||
Bangle.setLCDPower(true);
|
||||
this.direction = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.directionSet = true;
|
||||
});
|
||||
|
||||
this.showTitleScreen = () => {
|
||||
this.death = false;
|
||||
g.clear();
|
||||
g.setColor(0, 1, 0);
|
||||
g.setFont('Vector', 50);
|
||||
g.drawString("nek", 70, 15, "solid");
|
||||
g.drawImage(this.titleScreenImg, 20, 20);
|
||||
g.fillPoly([
|
||||
15, 66,
|
||||
152, 70,
|
||||
159, 79,
|
||||
21, 71 ]);
|
||||
g.setColor(this.textColor, this.textColor, this.textColor);
|
||||
g.setFont('Vector', 15);
|
||||
g.drawString("Tilt to turn", 20, 100, "solid");
|
||||
g.drawString("Tap to start", 20, 120, "solid");
|
||||
|
||||
g.setColor(0, 1, 0);
|
||||
|
||||
g.setFont('4x6', 3);
|
||||
g.drawString("Jason de Belle", 5, 145, "solid");
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
/* Graphics */
|
||||
this.snakeUp = Graphics.createImage(`
|
||||
XX XX
|
||||
xx xx
|
||||
xx xx
|
||||
xx
|
||||
xx
|
||||
xx
|
||||
xx
|
||||
xx
|
||||
xxxxxxxx
|
||||
xxxx xxxx
|
||||
xxxxxx xxxxxxx
|
||||
xxxxxxxxxxxxxxxx
|
||||
xxxxx xXXx xxxxx
|
||||
xxxxx XX xxxxx
|
||||
xxxxx XX xxxxx
|
||||
xxxxxx xxxx xxxxx
|
||||
xxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
`);
|
||||
this.snakeDown = Graphics.createImage(`
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxx
|
||||
xxxxxx xxxx xxxxxx
|
||||
xxxxxx xxxx xxxxxx
|
||||
xxxx XX xxxxx
|
||||
xxxx XX xxxxx
|
||||
xxxx xXXx xxxx
|
||||
xxxx xXXx xxxx
|
||||
xXxxxxxxxxxxxx
|
||||
xXxxxxxxxxxxxx
|
||||
xxx xxx
|
||||
xxxx xxxx
|
||||
xxxx
|
||||
xx
|
||||
xx
|
||||
xx
|
||||
xx
|
||||
x x
|
||||
xx xx
|
||||
xx xx
|
||||
`);
|
||||
|
||||
this.snakeRight = Graphics.createImage(`
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xXxxxxxx xxxx
|
||||
xXxxxxxx xxxx
|
||||
xxxxxxxX xxx
|
||||
xxxxxxxX xxx xxxx
|
||||
xxxxxxxxxxXX xxxxxx xxxx
|
||||
xxxxxxxxxxXX xxxxxx xx
|
||||
xxxxxxxxxxXXxxxxx xxxxxxxx
|
||||
xxxxxxxxxxXXxxxxx xxxxxxxx
|
||||
xxxxxxxxxxxx xxxxx xx
|
||||
xxxxxxxxxxxx xxxxx xxx
|
||||
xxxxxxxx xx xxxx
|
||||
xxxxxxxx xx
|
||||
xxxxxxxx xxx
|
||||
xxxxxxxx xxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxx
|
||||
xxxxxxxxx
|
||||
`);
|
||||
this.snakeLeft = Graphics.createImage(`
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xXxxxxxxxxxxxx
|
||||
xX xxxxxxxxxx
|
||||
x xx xXxxxxxxxx
|
||||
xx xx xXxxxxxxxx
|
||||
xx xx xxxx xxXXxxxxxxxx
|
||||
xxxxxxx xxxxxXXxxxxxxxx
|
||||
xxxxxxx xxxxxXXxxxxxxxx
|
||||
xx xx xxxx xxXXxxxxxxxx
|
||||
xx xxx xxxxxxxxxx
|
||||
x xxx xxxxxxxxx
|
||||
xxxx xxxxxxxxx
|
||||
xxxx xxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxx
|
||||
xxxxxxxxx
|
||||
`);
|
||||
|
||||
this.apple = Graphics.createImage(`
|
||||
xxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxx
|
||||
`);
|
||||
|
||||
this.appleLeaf = Graphics.createImage(`
|
||||
xxxxxx
|
||||
xxxxxx
|
||||
xxxx
|
||||
XXxxxxxxxx
|
||||
xx
|
||||
xx
|
||||
xx
|
||||
xx
|
||||
xx
|
||||
`);
|
||||
|
||||
|
||||
this.titleScreenImg = Graphics.createImage(`
|
||||
sxxxxxxxs
|
||||
xxsxxx xxxxxs
|
||||
xxxxxxxxsxx xxxxsx
|
||||
xxxxxxxxxxxxxxxsxxs xxxxsxx
|
||||
xxxxxxxxxxxxxxxxxxxxxsxxxsssxxxxxxsxxxx
|
||||
xxxxxxxxxxxxxxxxxxxsxxxxsxxs xxsxxx
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxsxx xxxsxx
|
||||
xxxxxxxxxxxxxxxxxxxxx sxxx ssxxsx
|
||||
xxxxxxxxxxxxxxx xxxxxxs
|
||||
xxxxxxxxxxxx ssss
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxxx
|
||||
xxxxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxxxx
|
||||
xxxxxxxxxx
|
||||
xxxxxxx
|
||||
xxx
|
||||
`);
|
||||
|
||||
game();
|
||||
}
|
||||
init();
|
Binary file not shown.
After Width: | Height: | Size: 4.9 KiB |
Loading…
Reference in New Issue