1
0
Fork 0
BangleApps/apps/snek/snek.js

469 lines
12 KiB
JavaScript

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();