贪吃蛇小游戏
做了一个类似于贪吃蛇的小游戏。下面是代码:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>simple Canvas Game</title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 var canvas=document.createElement("canvas"); 10 var ctx=canvas.getContext("2d"); 11 canvas.width=512; 12 canvas.height=480; 13 document.body.appendChild(canvas); 14 var count=1,step=1; 15 16 //图片初始化 17 var bgReady=false; 18 var bgImage=new Image(); 19 bgImage.src="background.png"; 20 bgImage.onload=function(){ 21 bgReady=true; 22 }; 23 24 25 var heroReady=false; 26 var heroImage=new Image(); 27 heroImage.src="hero.png"; 28 heroImage.onload=function(){ 29 heroReady=true; 30 }; 31 32 33 var monsterReady=false; 34 var monsterImage=new Image(); 35 monsterImage.src="monster.png"; 36 monsterImage.onload=function(){ 37 monsterReady=true; 38 }; 39 40 var hero={speed:256}; 41 var monster=[]; 42 var monstersCaught=0; 43 44 var keysDown={}; 45 46 //监听方向键 47 addEventListener('keydown',function(e){ 48 keysDown[e.keyCode]=true; 49 },false); 50 51 addEventListener('keyup',function(e){ 52 delete keysDown[e.keyCode]; 53 },false); 54 55 hero.x=canvas.width/2; 56 hero.y=canvas.height/2; 57 58 //敌人随机显示 59 var monsterPosition=function(i){ 60 for (x=0;x<i;x++){ 61 monster[x]={ 62 x:(32+(Math.random()*(canvas.width-64))), 63 y:(32+(Math.random()*(canvas.height-64))) 64 }; 65 monster.push(monster[i]); 66 } 67 }; 68 69 var reset=function(){ 70 hero.x=canvas.width/2; 71 hero.y=canvas.height/2; 72 }; 73 74 var update=function(modifier){ 75 if(38 in keysDown){ 76 if(hero.y>0){ 77 hero.y-=hero.speed*modifier; 78 } 79 } 80 if(40 in keysDown){ 81 if(hero.y<445){ 82 hero.y+=hero.speed*modifier; 83 } 84 } 85 if(37 in keysDown){ 86 if(hero.x>0){ 87 hero.x-=hero.speed*modifier; 88 } 89 } 90 if(39 in keysDown){ 91 if(hero.x<480){ 92 hero.x+=hero.speed*modifier; 93 } 94 } 95 96 97 }; 98 var render=function(){ 99 if(bgReady){ 100 ctx.drawImage(bgImage,0,0); 101 } 102 if(heroReady){ 103 ctx.drawImage(heroImage,hero.x,hero.y); 104 } 105 if(monsterReady&&step<3){ 106 for(i=0;i<count;i++){ 107 if(hero.x<=(monster[i].x+32)&& monster[i].x<=(hero.x+32)&&hero.y<=(monster[i].y+32) && monster[i].y<=(hero.y+32)){ 108 ++monstersCaught; 109 monster.splice(i,1); 110 count--; 111 //monsterPosition(); 112 }else{ 113 ctx.drawImage(monsterImage,monster[i].x,monster[i].y); 114 } 115 } 116 } 117 118 ctx.fillStyle="rgb(250,250,250)"; 119 ctx.font="24px Helvetica"; 120 ctx.textAlign='left'; 121 ctx.textBaseline="top"; 122 ctx.fillText('Goblins caught:'+monstersCaught,32,32); 123 ctx.fillText('step:'+step,32,64); 124 }; 125 var main=function(){ 126 var now=Date.now(); 127 var delta=now-then; 128 129 update(delta/1000); 130 render(); 131 132 then=now; 133 if(monster.length<2){ 134 step++; 135 count=count+step; 136 monsterPosition(count); 137 } 138 if(step>2){ 139 reset(); 140 render(); 141 //ctx.drawImage(heroImage,hero.x,hero.y); 142 console.log("you are winner"); 143 }else{ 144 requestAnimationFrame(main); 145 } 146 }; 147 var w=window; 148 requestAnimationFrame = w.requestAnimationFrame || w.webkitRequestAnimationFrame || w.msRequestAnimationFrame || w.mozRequestAnimationFrame; 149 var then=Date.now(); 150 monsterPosition(count); 151 main(); 152 153 </script> 154 </body> 155 </html>
主要是利用了canvas的drawImage方法来绘制元素,利用requestAnimationFrame来循环。下面附带源码:
浙公网安备 33010602011771号