mirror of https://github.com/espruino/BangleApps
tetris: implement level/mode selection
Implement level selection, and allow user to slect controls.pull/3076/head
parent
d7756ee175
commit
98ecd6c9c7
|
@ -1,2 +1,3 @@
|
||||||
0.01: New app!
|
0.01: New app!
|
||||||
0.02: Better controls, implement game over.
|
0.02: Better controls, implement game over.
|
||||||
|
0.03: Implement mode and level selection screens.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{ "id": "tetris",
|
{ "id": "tetris",
|
||||||
"name": "Tetris",
|
"name": "Tetris",
|
||||||
"shortName":"Tetris",
|
"shortName":"Tetris",
|
||||||
"version":"0.02",
|
"version":"0.03",
|
||||||
"description": "Tetris",
|
"description": "Tetris",
|
||||||
"icon": "tetris.png",
|
"icon": "tetris.png",
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
|
|
|
@ -36,11 +36,27 @@ const tiles = [
|
||||||
const ox = 176/2 - 5*8;
|
const ox = 176/2 - 5*8;
|
||||||
const oy = 8;
|
const oy = 8;
|
||||||
|
|
||||||
var pf = Array(23).fill().map(()=>Array(12).fill(0)); // field is really 10x20, but adding a border for collision checks
|
/* 0 .. simulated arrows
|
||||||
pf[20].fill(1);
|
1 .. drag piece
|
||||||
pf[21].fill(1);
|
2 .. accelerometer. 12 lines record.
|
||||||
pf[22].fill(1);
|
3 .. altimeter
|
||||||
pf.forEach((x,i) => { pf[i][0] = 1; pf[i][11] = 1; });
|
*/
|
||||||
|
var control = 0, level = 0;
|
||||||
|
var alt_start = -9999; /* For altimeter control */
|
||||||
|
/* 0 .. menu
|
||||||
|
1 .. game
|
||||||
|
2 .. game over */
|
||||||
|
var state = 0;
|
||||||
|
|
||||||
|
var pf;
|
||||||
|
|
||||||
|
function initGame() {
|
||||||
|
pf = Array(23).fill().map(()=>Array(12).fill(0)); // field is really 10x20, but adding a border for collision checks
|
||||||
|
pf[20].fill(1);
|
||||||
|
pf[21].fill(1);
|
||||||
|
pf[22].fill(1);
|
||||||
|
pf.forEach((x,i) => { pf[i][0] = 1; pf[i][11] = 1; });
|
||||||
|
}
|
||||||
|
|
||||||
function rotateTile(t, r) {
|
function rotateTile(t, r) {
|
||||||
var nt = JSON.parse(JSON.stringify(t));
|
var nt = JSON.parse(JSON.stringify(t));
|
||||||
|
@ -98,6 +114,8 @@ function redrawPF(ly) {
|
||||||
function gameOver() {
|
function gameOver() {
|
||||||
g.setColor(1, 1, 1).setFontAlign(0, 1, 0).setFont("Vector",22)
|
g.setColor(1, 1, 1).setFontAlign(0, 1, 0).setFont("Vector",22)
|
||||||
.drawString("Game Over", 176/2, 76);
|
.drawString("Game Over", 176/2, 76);
|
||||||
|
state = 0;
|
||||||
|
E.showAlert("Game Over").then(selectGame, print);
|
||||||
}
|
}
|
||||||
|
|
||||||
function insertAndCheck() {
|
function insertAndCheck() {
|
||||||
|
@ -138,6 +156,8 @@ function moveOk(t, dx, dy) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function gameStep() {
|
function gameStep() {
|
||||||
|
if (state != 1)
|
||||||
|
return;
|
||||||
if (Date.now()-time > dropInterval) { // drop one step
|
if (Date.now()-time > dropInterval) { // drop one step
|
||||||
time = Date.now();
|
time = Date.now();
|
||||||
if (moveOk(ct, 0, 1)) {
|
if (moveOk(ct, 0, 1)) {
|
||||||
|
@ -169,12 +189,50 @@ function move(x, y) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Bangle.setUI();
|
function linear(x) {
|
||||||
Bangle.on("drag", (e) => {
|
print("Linear: ", x);
|
||||||
let h = 176/2;
|
let now = px / 10;
|
||||||
if (!e.b)
|
if (x < now-0.06)
|
||||||
|
move(-1, 0);
|
||||||
|
if (x > now+0.06)
|
||||||
|
move(1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function newGame() {
|
||||||
|
E.showMenu();
|
||||||
|
Bangle.setUI();
|
||||||
|
if (control == 2) {
|
||||||
|
Bangle.on("accel", (e) => {
|
||||||
|
if (state != 1) return;
|
||||||
|
if (control != 2) return;
|
||||||
|
print(e.x);
|
||||||
|
linear((0.2-e.x) * 2.5);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (control == 3) {
|
||||||
|
Bangle.setBarometerPower(true);
|
||||||
|
Bangle.on("pressure", (e) => {
|
||||||
|
if (state != 1) return;
|
||||||
|
if (control != 3) return;
|
||||||
|
let a = e.altitude;
|
||||||
|
if (alt_start == -9999)
|
||||||
|
alt_start = a;
|
||||||
|
a = a - alt_start;
|
||||||
|
print(e.altitude, a);
|
||||||
|
linear(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Bangle.on("drag", (e) => {
|
||||||
|
let h = 176/2;
|
||||||
|
if (state == 2) {
|
||||||
|
if (e.b)
|
||||||
|
selectGame();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!e.b)
|
||||||
return;
|
return;
|
||||||
if (e.y < h) {
|
if (state == 0) return;
|
||||||
|
if (e.y < h) {
|
||||||
if (e.x < h)
|
if (e.x < h)
|
||||||
rotate();
|
rotate();
|
||||||
else {
|
else {
|
||||||
|
@ -184,21 +242,60 @@ Bangle.on("drag", (e) => {
|
||||||
g.flip();
|
g.flip();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (control == 1)
|
||||||
|
linear((e.x - 20) / 156);
|
||||||
|
if (control != 0)
|
||||||
|
return;
|
||||||
if (e.x < h)
|
if (e.x < h)
|
||||||
move(-1, 0);
|
move(-1, 0);
|
||||||
else
|
else
|
||||||
move(1, 0);
|
move(1, 0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Bangle.on("swipe", (x,y) => {
|
initGame();
|
||||||
if (y<0) y = 0;
|
drawGame();
|
||||||
move(x, y);
|
state = 1;
|
||||||
});
|
var step = 450 - 50*level;
|
||||||
|
if (control == 3)
|
||||||
|
step = step*2;
|
||||||
|
dropInterval = step;
|
||||||
|
var gi = setInterval(gameStep, 50);
|
||||||
|
}
|
||||||
|
|
||||||
drawBoundingBox();
|
function drawGame() {
|
||||||
g.setColor(1, 1, 1).setFontAlign(0, 1, 0).setFont("6x15", 1).drawString("Lines", 22, 30).drawString("Next", 176-22, 30);
|
drawBoundingBox();
|
||||||
showNext(ntn, ntr);
|
g.setColor(1, 1, 1).setFontAlign(0, 1, 0)
|
||||||
g.setColor(0).fillRect(5, 30, 41, 80).setColor(1, 1, 1).drawString(nlines.toString(), 22, 50);
|
.setFont("6x15", 1).drawString("Lines", 22, 30)
|
||||||
var gi = setInterval(gameStep, 20);
|
.drawString("Next", 176-22, 30);
|
||||||
|
showNext(ntn, ntr);
|
||||||
|
g.setColor(0).fillRect(5, 30, 41, 80)
|
||||||
|
.setColor(1, 1, 1).drawString(nlines.toString(), 22, 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectLevel() {
|
||||||
|
print("Level selection menu");
|
||||||
|
|
||||||
|
var menu = {};
|
||||||
|
menu["Level 1"] = () => { level = 0; selectGame(); };
|
||||||
|
menu["Level 2"] = () => { level = 1; selectGame(); };
|
||||||
|
menu["Level 3"] = () => { level = 2; selectGame(); };
|
||||||
|
E.showMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectGame() {
|
||||||
|
state = 0;
|
||||||
|
print("Game selection menu");
|
||||||
|
//for (let i = 0; i < 100000; i++) ;
|
||||||
|
|
||||||
|
var menu = {};
|
||||||
|
menu["Normal"] = () => { control = 0; newGame(); };
|
||||||
|
menu["Drag"] = () => { control = 1; newGame(); };
|
||||||
|
menu["Tilt"] = () => { control = 2; newGame(); };
|
||||||
|
menu["Move"] = () => { control = 3; newGame(); };
|
||||||
|
menu["Level"] = () => { selectLevel(); };
|
||||||
|
E.showMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
selectGame();
|
||||||
|
|
Loading…
Reference in New Issue