function loadImages(sources, callback) { var images = {}; var loadedImages = 0; var numImages = 0; // get num of sources for(var src in sources) { numImages++; } for(var src in sources) { images[src] = new Image(); images[src].onload = function() { if(++loadedImages >= numImages) { callback(images); } }; images[src].src = sources[src]; } } window.onload = function() { var canvas = document.getElementById("gameCanvas"); ctx = canvas.getContext("2d"); var sources = { trees: "./images/trees/trees.png", seened: "./images/seened/seened.png", koll: "images/hero_ani.png", bug: "images/bug_32_ani.png" }; loadImages(sources, initGame); } //function initGame(images){ var initGame = function(images){ d0 = 32; // module - width of a tree tile var k = 2; // how many tiles per side var n = 10; // how many squares in row/column on screen var vl = n; //number of columns in (virtual) labyrinth var rl = 20; //number of rows in (virtual) labyrinth d = k * d0; // width of one labyrinth square wc = n * d+d0; //canvas width hc = 480; //(n-1) * d+d0; //canvas height w0 = wc; //width of virtual canvas h0 = rl*d+d0; //height of virtual canvas xb = d/2; //kolli (bogy) (alg)asend virtuaalses labyrindis yb = d/2; //xbc = xb; //bogy on screen //ybc = yb; xl = 0; //start position of labyrinth on screen yl = 0; //start position of labyrinth ctx.canvas.width = wc; ctx.canvas.height = hc; var canvas0 = document.createElement('canvas'); ctx0 = canvas0.getContext('2d'); //canvas0.id = "VirtualCanvas"; canvas0.width = w0; canvas0.height = h0; pick_snd = document.getElementById("pick"); bug_snd = document.getElementById("bug"); ough_snd = document.getElementById("ough"); var trees = new spriteSheet(images.trees,[[0,0,32,32],[33,0,32,32],[0,33,32,32],[33,33,32,32]]); seened = new spriteSheet(images.seened,[[0,0,32,32],[33, 0, 32, 32],[66,0,32,32],[0, 33, 32, 32],[33, 33, 32, 32],[0, 66, 32, 32],[33, 66, 32, 32],[66, 33, 32, 32],[66, 66, 32, 32]]); koll = new animated(images.koll,d0,d0,2,"still",16); koll.width=30; koll.height=30; koll.blushing = false; koll_red = colorize(images.koll,d0,d0,255,0,0,0.2); nbugs = 3; bugs=[]; nseeni = 40; //kui palju lisatakse mängu (peab olema < v*r-1 - esimene ruut kolli jaoks!) nseeni = Math.min(vl*rl-1,nseeni); seenekohad = []; //ruudud, kus seened paiknevad korjatud = 0; //var objs=[]; //kõik seinad keysDown = []; keysDown[37]=keysDown[38]=keysDown[39]=keysDown[40]=false; speed = 2; create(vl,rl,n,d0,d,trees,w0,h0); inf = document.getElementById('inf'); placeseened(vl,rl,d,seened.coords.length); createseened(); createbugs(images.bug,nbugs,n,d0,d); window.addEventListener("keydown", function (e) { //if(e.keyCode>=37 && e.keyCode<=40){ keysDown[e.keyCode] = true; // } /* if (e.keyCode == 74) korja(); */ }, false); window.addEventListener("keyup", function (e) { //if(e.keyCode>=37 && e.keyCode<=40){ keysDown[e.keyCode] = false; //} }, false); /* window.addEventListener("click", function (e) { GameLoop(); },false); */ koll.setPosition(xb,yb); GameLoop(); } function GameLoop(){ update(speed); /* if (koll.x+xl > wc/2+d && wc - xl < w0) {xl -= speed; } else if (koll.x+xl < wc/2 && xl > 0) {xl += speed; } */ if (koll.y+yl > hc/2 && hc - yl < h0) {yl -= speed; } else if (koll.y+yl < hc/2-d && yl <0) {yl += speed;} //ctx.clearRect(0,0,wc,hc); ctx.putImageData(seenemets, 0,yl,0, -yl,wc,hc); if (!koll.blushing) koll.draw(); else ctx.putImageData(koll_red,koll.x+xl,koll.y+yl); for(var i=0;i 0) points1 = [[x,y],[x,y+hb],[x+wb,y+hb]]; else if (dy < 0) points1 = [[x+wb,y],[x,y],[x,y+hb]]; }; if (dx == 0) { if (dy > 0) points1 = [[x,y+hb],[x+wb,y+hb]]; else if (dy < 0) points1 = [[x+wb,y],[x,y]]; }; if (dx > 0) { if (dy == 0) points1 = [[x+wb,y+hb],[x+wb,y]]; else if (dy > 0) points1 = [[x,y+hb],[x+wb,y+hb],[x+wb,y]]; else if (dy < 0) points1 = [[x+wb,y+hb],[x+wb,y],[x,y]]; }; var t = 0; var j = Math.max(Math.abs(dx),Math.abs(dy)); //how many steps to check var ddx = dx/j; var ddy = dy/j; found: do{ t++; var i = 0; do{ var x1 = points1[i][0]; //coordinate of the faremost corner var y1 = points1[i][1]; //console.log('x,dx,x1,y,dy,y1 :'+x+','+dx+','+x1+'; '+y+','+dy+','+y1); var xx1 = (x1+t*ddx); var yy1 = (y1+t*ddy); var p = 4*(xx1 + w0*yy1); if (obj2.data[p+3]!=0 ) // not transparent! { //console.log('i,t,xx1,yy1,p,obj2.data[p+3]: '+i+','+t+','+xx1+','+yy1+','+p+','+obj2.data[p+3]) break found; }; i++; } while (i < points1.length); } while (tMath.abs(koll.y-this.y) && Math.random()>0.6){ if ((koll.x-this.x)>0 && labyr.data[p+4*d0 + 3] > 0) {this.vx = 1; this.vy = 0} else if ((xb-this.x)<0 && labyr.data[p-4*d0 + 3] > 0) {this.vx = -1; this.vy = 0} } else { if ((yb-this.y)>0 && labyr.data[p+4*d0*w0 + 3] > 0) {this.vx = 0; this.vy = 1} else if ((yb-this.y)<0 && labyr.data[p-4*d0*w0 + 3] > 0) {this.vx = 0; this.vy = -1} else {this.vx *= -1; this.vy *= -1; }} //go back } this.x += this.vx; this.y += this.vy; this.draw(); if (collision(this.x-d0,this.y-d0,3*d0,3*d0,koll.x,koll.y,d0,d0)) { bug_snd.cloneNode(true).play(); koll.blushing = true; inf.innerHTML = "Sinu küljes on puuk!"; setTimeout(koll_normal,500);} } do{ var bx = (2+Math.floor(Math.random()*(n-2)))*d; //bug on screen var by = (2+Math.floor(Math.random()*(Math.floor(hc/d-2))))*d; //hc asemele hv !!! var p = 4*(bx+d0/2 + w0*(by+d0/2)); } while (labyr.data[p+3]==0); bug.setPosition(bx,by); bugs[i]=bug; } return bugs; } function koll_normal(){ koll.blushing = false; inf.innerHTML = "Pääsesid!"; } function spriteSheet(img,coords){ this.coords = coords; //coords = [[x0,y0,w0,h0],...[xn,yn,wn,hn]] this.sheet = img; this.draw = function(nr,x,y){ ctx.drawImage(img,this.coords[nr][0],this.coords[nr][1],this.coords[nr][2],this.coords[nr][3],x,y,this.coords[nr][2],this.coords[nr][3]); } this.draw0 = function(nr,x,y){ ctx0.drawImage(img,this.coords[nr][0],this.coords[nr][1],this.coords[nr][2],this.coords[nr][3],x,y,this.coords[nr][2],this.coords[nr][3]); } } function animated(img,dx,dy,n_fr,state,sp){ this.image = img; //console.log('koll: '+this.image.height); this.width = dx; this.height = dy; this.dx = dx; //this.width; this.dy = dy; //this.height/3; //32 this.n_frames = n_fr; //number of frames this.actualFrame = 0; this.speed = sp; //how many *game* frames a frame is shown this.step = 0; this.y = 0; this.x = 0; this.state = state; this.setPosition = function(X, Y){ this.x = X; this.y = Y; } this.draw = function(cx,cy){ var cx=cx||0; var cy=cy||0; if (this.state == "still") ctx.drawImage(this.image,0,this.dy*2,this.dx,this.dy,this.x,this.y+yl,this.dx,this.dy); else { //state == "walking" ctx.drawImage(this.image,0,this.dy*this.actualFrame,this.dx,this.dy,this.x,this.y+yl,this.dx,this.dy); this.step ++; if (this.step == this.speed) { this.actualFrame++; this.actualFrame = this.actualFrame%this.n_frames this.step = 0; } } } } function create(vl,rl,n,d0,d,trees,w0,h0){ var ruudud = []; var connected = []; var free = []; var dirs = [0, 1, 2, 3]; for (i = 0; i < rl; i++) { for (var j = 0; j < vl; j++) { ruudud.push(new ruut(i, j)); } } var i0 = random(0,ruudud.length); connected.push(ruudud[i0]); //esimene ruum labyrindis free = ruudud.slice(0); //console.log("free: "+free.length); free.splice(i0, 1); //Next line starts Firebug debugger! //debugger; while (free.length > 0) { var found = 0; while (found == 0) { i0 = random(0, connected.length); var r = connected[i0]; //kandidaat! var dirs = [0, 1, 2, 3]; for (i = 0; i < 4; i++) { if (r.doors.indexOf(dirs[i]) > 0) dirs.splice(i, 1); } while (dirs.length > 0) { var j0 = random(0, dirs.length); var d1 = dirs[j0]; var i1 = next(r, d1,free); if (i1 >= 0) { var r1 = free[i1]; found = 1; r.doors.push(d1); var d2 = reverse(d1); r1.doors.push(d2); connected.push(r1); free.splice(i1, 1); break; } else { dirs.splice(j0, 1); } } } } //draw labyrinth for (var i = 0; i < connected.length; i++) { var xx = connected[i].m; var yy = connected[i].n; if (connected[i].doors.indexOf(0) == -1) treeline((xx + 1) * d, yy * d, (xx + 1) * d, (yy + 1) * d, d0, trees); if (connected[i].doors.indexOf(1) == -1) treeline(xx * d, (yy + 1) * d, (xx + 1) * d+1, (yy + 1) * d, d0, trees); //if (connected[i].doors.indexOf(0) == -1 && connected[i].doors.indexOf(1) == -1) // ctx.drawImage(tile, (xx + 2) * d, (yy + 2) * d); if (xx == 0 && connected[i].doors.indexOf(2) == -1) treeline(xx * d, yy * d, xx * d, (yy + 1) * d, d0, trees); if (yy == 0 && connected[i].doors.indexOf(3) == -1) treeline(xx * d, yy * d, (xx + 1) * d, yy * d, d0, trees); ctx0.clearRect(w0-d0,h0-2*d0,d0,d0); // door out! } labyr = ctx0.getImageData(0, 0, w0, h0); } function next(r, dir,free) { var nn1; var mm1; switch (dir) { case 0: nn1 = r.n; mm1 = r.m + 1; break; case 1: nn1 = r.n + 1; mm1 = r.m; break; case 2: nn1 = r.n; mm1 = r.m - 1; break; case 3: nn1 = r.n - 1; mm1 = r.m; break; default: nn1 = r.n; mm1 = r.m; } for (var i = 0; i < free.length; i++) { //console.log(i+' '+n1+' '+m1); if ((free[i].n == nn1) && (free[i].m == mm1)) { return i; break; } } return -1; } function connection(n, m, direction) { //direction=1 - right //direction=2 - down //direction=3 - left //direction=4 - up switch (direction) { case 0: this.n1 = n; this.m1 = m; this.n2 = n + 1; this.m2 = m; this.dir = 0; break; case 1: this.n1 = n; this.m1 = m; this.n2 = n; this.m2 = m + 1; this.dir = 1; break; case 2: this.n1 = n; this.m1 = m; this.n2 = n - 1; this.m2 = m; this.dir = 2; break; case 3: this.n1 = n; this.m1 = m; this.n2 = n; this.m2 = m - 1; this.dir = 3; break; default: this.n1 = n; this.m1 = m; this.n2 = n; this.m2 = m; this.dir = 0; //no connection } } function reverse(dir) { return (dir + 2) % 4; } function ruut(n, m) { this.n = n; this.m = m; this.doors = []; } function treeline(x0,y0,x1,y1,d0, trees){ var nx = (x1 - x0)/d0; var ny = (y1 - y0)/d0; var n = Math.max(nx,ny); var dx = (x1 - x0)/n; var dy = (y1 - y0)/n; for(var i=0;i < n;i++){ trees.draw0(Math.floor(Math.random()*trees.coords.length),x0 + i*dx, y0 + i*dy); //ctx0.drawImage(tile, x0 + i*dx, y0 + i*dy); //objs.push({x:x0 + i*dx,y:y0 + i*dy,type:'tile'}); } } function colorize(img,w,h,r,g,b,a){ ctx0.clearRect(0,0,w,h); ctx0.drawImage(img,0,0); var im_data=ctx0.getImageData(0,0,w,h); for(var i=0;i