Skip to content

Instantly share code, notes, and snippets.

@siakaramalegos
Created October 18, 2018 19:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save siakaramalegos/a88ab224e22d36735006b4c4673a1cfd to your computer and use it in GitHub Desktop.
Save siakaramalegos/a88ab224e22d36735006b4c4673a1cfd to your computer and use it in GitHub Desktop.
Dino game plus name and twitter handle
/* HOW TO USE:
* Enter your name below in 2 lines, where it says `NAME = `
* If you have a battery in the Pixl, remove it
* Add the battery while holding down Pixl's top left button
* Wait for the bootloader bar to go to the end, and hold down
even when told to release.
* Only release when the test fails and it says 'Erasing Saved Code'
* You now have a 100% blank Pixl.js
* Click the connect icon in the top left of the IDE
* Choose the 'Web Bluetooth' option
* Choose 'Pixl.js xxyy` where xx:yy are the last digits of the code
on your Pixl's screen
* If you have trouble, check out http://www.espruino.com/Quick+Start+BLE#pixljs
* Once connected, click the 'Send to Espruino' button (middle of the IDE, third down)
* After a few seconds, the badge is updated
*/
// Enter your name below!
var NAME = [
"Sia Karamalegos",
"@thegreengreek"
];
/* NOTE: Unfortunately the font used here only supports basic
ASCII (eg, not char codes >128). For more userful international
characters, you can swap to FontDennis8 (http://www.espruino.com/Fonts#font-modules) */
require("Font8x16").add(Graphics);
require("FontDennis8").add(Graphics);
// Images generated with http://www.espruino.com/Image+Converter
var cityscape = { // img/cityscape.png
width : 128, height : 16, bpp : 1,
buffer : E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAgAAAAAAAAAAAAAAAAAgAAIAAAAAAAAAAAAACAAAIAACAAAAQAAAAAAPwAgAAHAABwAAAEAAAAAAD8AIAABwAA+AAADAAAAAAA/ACAAAcAAPgAAAwAAAAHAPwAgAAHAAD4ABAMAAAABwj8AcADxwAA+AA4DAAAAAcc/AHAA8c+APngfAwB4AAHPv/D4APHPgD54P4N+eAYHz7/w+ADxz4A/+D+Dfngfh8+/8f3w8c+Pv/g/g354f+fPv/H9//HPj7/+P/N+eP/3z7/x///xz4+/////////////////////w=="))
};
var ctlogo = { // img/connect-tech.png
width : 31, height : 15, bpp : 1,
buffer : E.toArrayBuffer(atob("B+AP/jAwAACPAD/6YYAFBQAAChIAABQoAAAoUAAAUKAAAKEgAAFBQAACgmGABQI8AAoDAxgUAfgwKAA="))
};
// Draw the cityscape
//var n = 0;
//function draw() {
// n++;
// if (n>127) n=0;
// g.clear();
// g.drawImage(cityscape, n,48);
// g.drawImage(cityscape, n-128,48);
// g.drawImage(ctlogo, 96,0);
// g.setFont8x16();
// g.setFontAlign(0,0);
// g.setFontDennis8();
// NAME.forEach(function (n,i) {
// g.drawString(n,48,22 + 15*i);
// });
// g.flip();
//}
// Called at startup
//function onInit() {
// Update once a second
//setInterval(draw,500);
// When starting, don't advertise (eg don't be connectable) unless
// a button is pressed or we are connected to Bluetooth
//if (process.env.CONSOLE!="Bluetooth" &&
// !(BTN1.read()|| BTN2.read()||BTN3.read()||BTN4.read()))
//NRF.sleep();
//}
/* Note: If you turned on 'Save on Send' in the IDE then
you can delete everything below this comment. We added this
just to make everything easy to upload with no config needed. */
// require("Storage").eraseAll();
// setTimeout(save, 4000);
// print("Now just wait 4 seconds. Code will be saved to flash.");
var BTNL = BTN4;
var BTNR = BTN3;
var BTNU = BTN1;
var IMG = {
rex : [
// running
{ width : 20, height : 22, bpp : 1, transparent:0, buffer : E.toArrayBuffer(atob("AB/gA/8AN/AD/wA/8AP/AD4AA/yAfAgfwMP/Dn/Q//wP/8B/+AP/gB/wAP4AB2AAYgAAIAADAP//")) },
{ width : 20, height : 22, bpp : 1, transparent:0, buffer : E.toArrayBuffer(atob("AB/gA/8AN/AD/wA/8AP/AD4AA/yAfAgfwMP/Dn/Q//wP/8B/+AP/gB/wAP4AB2AAYwAEAABgAP//")) },
// dead
{ width : 20, height : 22, bpp : 1, transparent:0, buffer : E.toArrayBuffer(atob("AB/gAj8AK/ACPwA/8AP/AD4AA/yAfAgfwMP/Dn/Q//wP/8B/+AP/gB/wAP4AB2AAYgAEIABjAP//")) }
],
cacti : [
{ width : 12, height : 24, bpp : 1, transparent:0, buffer : E.toArrayBuffer(atob("BgDwDwDwDwDyT373737373737373/+f8DwDwDwDwDwDwDwDw")) },
{ width : 8, height : 18, bpp : 1, transparent:0, buffer : E.toArrayBuffer(atob("GBhY2dnZ2fl5Hx4YGBgYGBgY")) }
],
};
var cacti, rex, frame;
function gameStart() {
rex = {
alive : true,
img : 0,
x : 10, y : 0,
vy : 0,
score : 0
};
cacti = [ { x:128, img:1 } ];
var random = new Uint8Array(128*3/8);
for (var i=0;i<50;i++) {
var a = 0|(Math.random()*random.length);
var b = 0|(Math.random()*8);
random[a]|=1<<b;
}
IMG.ground = { width: 128, height: 3, bpp : 1, buffer : random.buffer };
frame = 0;
setInterval(onFrame, 50);
}
function gameStop() {
rex.alive = false;
rex.img = 2; // dead
clearInterval();
setTimeout(function() {
setWatch(gameStart, BTNU, {repeat:0,debounce:50,edge:"rising"});
}, 1000);
setTimeout(onFrame, 10);
}
function onFrame() {
g.clear();
g.setFontDennis8();
if (rex.alive) {
frame++;
rex.score++;
if (!(frame&3)) rex.img = rex.img?0:1;
// move rex
if (BTNL.read() && rex.x>0) rex.x--;
if (BTNR.read() && rex.x<20) rex.x++;
if (BTNU.read() && rex.y==0) rex.vy=4;
rex.y += rex.vy;
rex.vy -= 0.2;
if (rex.y<=0) {rex.y=0; rex.vy=0; }
// move cacti
var lastCactix = cacti.length?cacti[cacti.length-1].x:127;
if (lastCactix<128) {
cacti.push({
x : lastCactix + 24 + Math.random()*128,
img : (Math.random()>0.5)?1:0
});
}
cacti.forEach(c=>c.x--);
while (cacti.length && cacti[0].x<0) cacti.shift();
} else {
g.drawString("Sia Karamalegos",(128-g.stringWidth("Sia Karamalegos"))/2,5);
g.drawString("@thegreengreek",(128-g.stringWidth("@thegreengreek"))/2,15);
g.drawString("Game over!",(128-g.stringWidth("Game over!"))/2,30);
}
g.drawLine(0,60,127,60);
cacti.forEach(c=>g.drawImage(IMG.cacti[c.img],c.x,60-IMG.cacti[c.img].height));
// check against actual pixels
var rexx = rex.x;
var rexy = 38-rex.y;
if (rex.alive &&
(g.getPixel(rexx+0, rexy+13) ||
g.getPixel(rexx+2, rexy+15) ||
g.getPixel(rexx+5, rexy+19) ||
g.getPixel(rexx+10, rexy+19) ||
g.getPixel(rexx+12, rexy+15) ||
g.getPixel(rexx+13, rexy+13) ||
g.getPixel(rexx+15, rexy+11) ||
g.getPixel(rexx+17, rexy+7) ||
g.getPixel(rexx+19, rexy+5) ||
g.getPixel(rexx+19, rexy+1))) {
return gameStop();
}
g.drawImage(IMG.rex[rex.img], rexx, rexy);
var groundOffset = frame&127;
g.drawImage(IMG.ground, -groundOffset, 61);
g.drawImage(IMG.ground, 128-groundOffset, 61);
g.drawString(rex.score,127-g.stringWidth(rex.score));
g.flip();
}
gameStart();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment