BangleApps/apps/life/life.js

130 lines
2.8 KiB
JavaScript

Bangle.setLCDTimeout(30);
var buf = Graphics.createArrayBuffer(160,160,1,{msb:true});
function flip() {
g.setColor(1,1,1);
g.drawImage({width:160,height:160,bpp:1,buffer:buf.buffer},40,40);
buf.clear();
}
var genA = new Uint8Array(324);
var genB = new Uint8Array(324);
var generation=0;
var gentime=0;
var currentY=1;
function initDraw(gen){
for (let y = 1; y<17; ++y)
for (let x = 1; x<17; ++x) {
var r = Math.random()<0.5?1:0;
gen[x+y*18] = r;
if (r==1){
var Xr=10*(x-1);
var Yr=10*(y-1);
buf.fillRect(Xr,Yr, Xr+7,Yr+7);
}
}
flip();
}
function howlong(){
++generation;
g.setFont("6x8",2);
g.setFontAlign(-1,-1,0);
gentime = Math.floor(gentime);
g.drawString('Gen:'+generation+' '+gentime+'ms ',20,220,true);
gentime=0;
}
function next(){
"ram";
var start = Date.now();
var cur=genA, fut=genB, y=currentY;
var count=(p)=>{return cur[p-19]+cur[p-18]+cur[p-17]+cur[p-1]+cur[p+1]+cur[p+17]+cur[p+18]+cur[p+19];};
for (let x = 1; x<17; ++x){
var ind = x+y*18;
var nc = count(ind);
var r = (cur[ind]==1 && nc==2 || nc==3)?1:0;
fut[ind]=r;
if (r==1){
var Xr=10*(x-1);
var Yr=10*(y-1);
buf.fillRect(Xr,Yr, Xr+7,Yr+7);
}
}
gentime+=(Date.now()-start);
if (y==16){
flip();
var tmp = genA; genA=genB; genB=tmp;
howlong();
currentY=1;
} else ++currentY;
}
var intervalRef = null;
function stopdraw() {
if(intervalRef) {clearInterval(intervalRef);}
}
function startdraw(init) {
if (init===undefined) init=false;
if(!init) g.clear();
Bangle.drawWidgets();
g.reset();
g.setColor(1,1,1);
g.setFont("6x8",1);
g.setFontAlign(0,0,3);
g.drawString("RESET",230,200);
g.drawString("LAUNCH",230,130);
g.drawString("CLOCK",230,60);
if(!init) intervalRef = setInterval(next,65);
}
function regen(){
stopdraw();
g.setColor(1,1,1);
initDraw(genA);
currentY=1;
generation = 0;
gentime=0;
intervalRef = setInterval(next,65);
}
function setButtons(){
setWatch(()=>{load();}, BTN1, {repeat:false,edge:"falling"});
setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
setWatch(regen, BTN3, {repeat:true,edge:"rising"});
}
var SCREENACCESS = {
withApp:true,
request:function(){
this.withApp=false;
stopdraw();
clearWatch();
},
release:function(){
this.withApp=true;
startdraw();
setButtons();
}
};
Bangle.on('lcdPower',function(on) {
if (!SCREENACCESS.withApp) return;
if (on) {
startdraw();
} else {
stopdraw();
}
});
g.clear();
Bangle.loadWidgets();
regen();
startdraw(true);
setButtons();