zoukankan      html  css  js  c++  java
  • [模仿]html5游戏_FlyppyBird

    模仿 FlyppyBird

    不过在障碍处理方面,只是简单的留出了中间的一个笔直通道。

    有兴趣的话,可以修改一下,修改也挺简单的,就根据最后一个障碍来生成新的障碍

    效果图:

    代码:

    index.htm

     1 <!DOCTYPE html>
     2 <html>
     3     <head>
     4         <meta charset="utf-8">
     5         <meta name="description" content="An HTML5 canvas game.">
     6         <meta name="keywords" content="html5, canvas, web, game">
     7         <meta name="author" content="Wang Xin Sheng">
     8         <meta name="apple-mobile-web-app-capable" content="yes">
     9         <meta name="apple-mobile-web-app-status-bar-style" content="black">
    10         <meta name="viewport" id="viewport" content="width = device-width, initial-scale = 1, minimum-scale = 1, maximum-scale = 1, user-scalable=no">
    11         <meta http-equiv="X-UA-Compatible" content="chrome=1">
    12         <meta http-equiv="Pragma" content="no-cache">
    13         <meta http-equiv="Cache-Control" content="no-cache">
    14         <meta equiv="Expires" content="0">
    15         <meta http-equiv="content-script-type" content="text/javascript">
    16         <title>[WXS]FlyppyBird</title>
    17         <script src="requestNextAnimationFrame.js"></script>
    18         <style type="text/css">
    19          html {color:#000;background:#222;margin:0px;}
    20          body {-webkit-user-select:none;margin:0px;}
    21         #BirdWorld{cursor:pointer;background:#fff;/*border:6px #333333 solid;*/}
    22         #btn_start{width:100%;color:red;font-size:20px;font-weight:bold;z-index:999;/*display:none;*/}
    23         </style>
    24     </head>
    25     <body>
    26     <section>
    27         <div style='position:absolute;left:0px;top:0px;' id='btn_start'>由 WangXinsheng 创建<br />点击屏幕开始游戏</div>
    28         <canvas id="BirdWorld" width="900" height="400" style="position: absolute; left: 0px; top: 0px;">
    29             <p>You need a <a href="http://www.google.com/chrome">modern browser</a> to view this.</p>
    30         </canvas>
    31     </section>
    32     </body>
    33     <script src="CGM008.js"></script>
    34 </html>

    CGM008.js:

      1 ;
      2 var bBodyT,
      3 bBodyW,
      4 bBodyH,
      5 bBodyW,
      6 bBodyL,
      7 caObj = document.getElementById("BirdWorld"),
      8 caCt = caObj.getContext("2d");
      9 //var caObj = document.getElementById("BirdWorld"),caCt = caObj.getContext("2d");
     10 var FlypperBirdWorld = function(){
     11     function doSize(){
     12         //caW = v ? window.innerWidth: 600;
     13         //caH = v ? window.innerHeight: 300;
     14         caW = window.innerWidth;
     15         caH = window.innerHeight;
     16         caObj.width = caW;
     17         caObj.height = caH;
     18         bBodyH = caH * 0.05;
     19         bBodyW = bBodyH;
     20         bBodyL = caW * 0.2;
     21         bBodyT = caH * 0.5 - bBodyH * 0.5;
     22         ZAStartL = (bBodyL + bBodyW) + caW * 0.2;
     23         //ZAStartL = caW+1;
     24         ZATmpL = ZAStartL;
     25         ZAGap = bBodyW * 5;
     26         ZAT = 0;//障碍顶部
     27         ZAB = caH;//障碍底部
     28         ZAMaxW = bBodyW * 3;
     29         ZAMinW = bBodyW * 2;
     30         ZAMaxH = (caH - bBodyH * 2.5) * 0.5;
     31         ZAMinH = caH * 0.2;
     32         bDown = bBodyH * 0.2;
     33         bUp = bBodyH * 1.5;
     34         ZASpeed = bBodyH * 0.5;
     35         maxZASpeed = ZAMinW; 
     36         //var caL = v?0:(window.innerWidth - caW) * 0.5,
     37         //caT = v?0:(window.innerHeight - caH) * 0.5;
     38         var caL = 0,
     39         caT = 0;
     40 
     41         caObj.style.position = "absolute";
     42         caObj.style.left = caL + "px";
     43         caObj.style.top = caT +"px";
     44     }
     45     function drawBird(){
     46         var bFlyW=bBodyW*bFlyWP[bFlyi],bFlyH=bBodyH*bFlyHP[bFlyi],bFlyL=bBodyL - bFlyW*bFlyLP[bFlyi],bFlyT=bBodyT+bBodyH*bFlyTP[bFlyi],bMouthW=bBodyW*0.4,bMouthH=bBodyW*0.25,bMouthL=bBodyL+bBodyW*0.8,bMouthT=bBodyT+bBodyH*0.5,bHeadW=bBodyW*0.5,bHeadH=bBodyH*0.5,bHeadT=bBodyT,bHeadL=bBodyL+bBodyW*0.5,bEyeW=(bHeadL*0.001)<1?1:(bHeadL*0.001),bEyeL=bHeadL+bHeadW*0.5-bEyeW*0.5,bEyeH=(bHeadH*0.5)<1?1:(bHeadH*0.5),bEyeT=bHeadT + bHeadH*0.5-bEyeH*0.5;
     47 
     48         //canCt.fillStyle = "#000";
     49         //canCt.strokeStyle = "#000";
     50         caCt.fillRect(bFlyL-0.5,bFlyT-0.5,bFlyW,bFlyH);
     51         caCt.strokeRect(bBodyL-0.5,bBodyT-0.5,bBodyW,bBodyH);
     52         caCt.fillRect(bMouthL-0.5,bMouthT-0.5,bMouthW,bMouthH);
     53         caCt.beginPath();
     54         caCt.moveTo(bHeadL-0.5,bHeadT-0.5);
     55         caCt.lineTo(bHeadL-0.5,bHeadT-0.5+bHeadH);
     56         caCt.stroke();
     57         caCt.moveTo(bHeadL-0.5,bHeadT-0.5+bHeadH);
     58         caCt.lineTo(bHeadL-0.5+bHeadW,bHeadT-0.5+bHeadH);
     59         caCt.stroke();
     60         caCt.fillRect(bEyeL-0.5,bEyeT-0.5,bEyeW,bEyeH);
     61     }
     62     function drawZALst(){
     63         for(var i =0; i<ZALst.length; i++ ){
     64             ZALst[i].doDraw();
     65         }
     66     }
     67     function productZA(allFlg){
     68         if(allFlg){
     69             while(ZATmpL<=caW){
     70                 var wTmp = ZAMinW + Math.round(Math.random() * (ZAMaxW-ZAMinW));
     71                 var hTmpT = ZAMinH + Math.round(Math.random() * (ZAMaxH-ZAMinH));
     72                 var hTmpB = ZAMinH + Math.round(Math.random() * (ZAMaxH-ZAMinH));
     73                 //var hTmpB = caH - bBodyH * 2 - hTmpT;
     74                 ZALst.push(new ZA("T",ZATmpL,hTmpT,wTmp));
     75                 ZALst.push(new ZA("B",ZATmpL,hTmpB,wTmp));
     76                 ZATmpL += wTmp + ZAGap;
     77             }
     78         }else{
     79             var delLen = 0;
     80             for(var i=0;i<ZALst.length;i++){
     81                 if((ZALst[i].l+ZALst[i].w)<=0)
     82                 {
     83                     delLen++;
     84                 }
     85             }
     86             if(delLen>0){ZALst.splice(0,delLen);goodPass+=delLen*0.5;}
     87             
     88             if(ZATmpL<=caW){
     89                 var wTmp = ZAMinW + Math.round(Math.random() * (ZAMaxW-ZAMinW));
     90                 var hTmpT = ZAMinH + Math.round(Math.random() * (ZAMaxH-ZAMinH));
     91                 var hTmpB = ZAMinH + Math.round(Math.random() * (ZAMaxH-ZAMinH));
     92                 ZALst.push(new ZA("T",ZATmpL,hTmpT,wTmp));
     93                 ZALst.push(new ZA("B",ZATmpL,hTmpB,wTmp));
     94                 ZATmpL += wTmp + ZAGap;
     95             }
     96         }
     97     }
     98     function animate(time){
     99         if(isStop){
    100             isStart=false;
    101             btn_start.innerHTML += "<br />游戏结束,马上重新开始";
    102             reStart();
    103             return;
    104         }
    105         if(isStart){
    106             var pastTime = Math.round(((new Date).getTime() - startTime) / 1E3 * 100) / 100;
    107             btn_start.innerHTML=pastTime;
    108             btn_start.innerHTML="分数: "+goodPass +" <br />用时: "+ pastTime + " 秒";
    109             var now = (+new Date);
    110             if (now - lastFpsUpdateTime > 100) {
    111                 lastFpsUpdateTime = now;
    112                 goOn();
    113                 caCt.fillStyle = "#fff";
    114                 caCt.fillRect(0, 0, caObj.width, caObj.height);
    115                 caCt.fillStyle = "#000";
    116                 //caCt.clearRect(0, 0, caObj.width, caObj.height);
    117                 drawBird();
    118                 drawZALst();
    119                 doJudge();
    120             }
    121         }else{
    122             caCt.clearRect(0, 0, caObj.width, caObj.height);
    123             drawBird();
    124             drawZALst();
    125         }
    126         window.requestNextAnimationFrame(animate);
    127     }
    128     function doJudge(){
    129         if(bBodyT+bBodyH>caH || bBodyT<0){
    130             isStop =true;
    131         }else{
    132             for(var i =0;i<ZALst.length;i++){
    133                 if(ZALst[i].isIn()){
    134                     isStop =true;
    135                     break;
    136                 }
    137             }
    138         }
    139     }
    140     function goOn(){
    141         for(var i=0;i<ZALst.length;i++){
    142             ZALst[i].l -= ZASpeed;
    143         }
    144         bFlyi = (++bFlyi)%bFlyTP.length;
    145         bBodyT += bDown;
    146         //this.bBodyT=bBodyT;
    147         ZATmpL -= ZASpeed;
    148         if((ZASpeed+1)<maxZASpeed){
    149             ZASpeed += 1;
    150         }
    151         productZA(false);
    152     }
    153     function ca_click(e){
    154         if (e.touches.length == 1) {
    155             e.preventDefault();
    156             bBodyT -= bUp;
    157             //this.bBodyT=bBodyT;
    158             e.stopPropagation();
    159         }
    160     }
    161     function ca_click2(e){
    162         e.preventDefault();
    163         bBodyT -= bUp;
    164         //this.bBodyT=bBodyT;
    165         e.stopPropagation();
    166     }
    167     function init_click(e){
    168         e.preventDefault();
    169         if(!isStart){
    170             isStart=true;
    171             startTime = new Date();
    172             if(v){
    173                 caObj.addEventListener("touchstart", ca_click, false);
    174             }else{
    175                 caObj.addEventListener("click", ca_click2, false);
    176             }
    177         }
    178         e.stopPropagation();
    179     }
    180     function stopEvent(e){e.preventDefault();e.stopPropagation();}
    181     var v = navigator.userAgent.toLowerCase().indexOf("android") != -1 || navigator.userAgent.toLowerCase().indexOf("iphone") != -1 || navigator.userAgent.toLowerCase().indexOf("ipad") != -1,
    182     caW = v ? window.innerWidth: 600,
    183     caH = v ? window.innerHeight: 300,
    184     lastFpsUpdateTime = (+new Date),
    185     //caObj = document.getElementById("BirdWorld"),
    186     //caCt = caObj.getContext("2d"),
    187     bFlyTP=[0.2,0.3,0.4,0.4,0.4,0.4,0.4,0.3],
    188     bFlyHP=[0.5,0.4,0.3,0.5,0.6,0.5,0.3,0.4],
    189     bFlyWP=[0.7,0.7,0.8,0.7,0.7,0.7,0.8,0.7],
    190     bFlyLP=[0.5,0.5,0.6,0.5,0.5,0.5,0.6,0.5],
    191     /*bBodyT,
    192     bBodyW,
    193     bBodyH,
    194     bBodyW,
    195     bBodyL,*/
    196     bFlyi=1,
    197     ZALst=[],
    198     ZAStartL,
    199     ZATmpL,
    200     ZAGap,
    201     ZAT,
    202     ZAB,
    203     ZAMaxW,
    204     ZAMinW,
    205     ZAMaxH,
    206     ZAMinH,
    207     bDown,
    208     bUp,
    209     ZASpeed,
    210     startTime,
    211     btn_start = document.getElementById("btn_start"),
    212     isStart = false,
    213     startTime = new Date(),
    214     lastFpsUpdateTime = new Date(),
    215     isStop=false,
    216     goodPass=0,
    217     maxZASpeed;
    218     //this.caCt = caObj.getContext("2d"),
    219     this.ZAT=0,
    220     this.ZAB=caH//,
    221     /*this.bBodyH=0,
    222     this.bBodyW=0,
    223     this.bBodyT=0,
    224     this.bBodyL=0*/;
    225     this.init = function(){
    226         //*********init size and vars***********
    227         doSize();
    228         bFlyi=1;
    229         ZALst=[];
    230         isStart = false;
    231         isStop=false;
    232         goodPass=0;
    233         this.ZAT = ZAT;
    234         this.ZAB = ZAB;
    235         btn_start.innerHTML = "由 WangXinsheng 创建<br />点击屏幕开始游戏";
    236         /*this.bBodyH=bBodyH;
    237         this.bBodyW=bBodyW;
    238         this.bBodyT=bBodyT;
    239         this.bBodyL=bBodyL;*/
    240         //*********Event***********
    241         caObj.addEventListener("click",init_click , false);
    242         caObj.addEventListener("touchstart",init_click, false);
    243 
    244         //caObj.addEventListener("click", ca_click2, false);
    245         //caObj.addEventListener("touchstart", ca_click, false);
    246         caObj.addEventListener("touchend", stopEvent, false);
    247         caObj.addEventListener("touchmove", stopEvent, false);
    248         caObj.addEventListener("touchcancel", stopEvent, false);
    249         caObj.addEventListener("gesturestart", stopEvent, false);
    250         caObj.addEventListener("gesturechange", stopEvent, false);
    251         caObj.addEventListener("gestureend", stopEvent, false);
    252         //window.addEventListener("resize", function(e){}, false);
    253         caObj.addEventListener("mousedown", stopEvent, false);
    254         caObj.addEventListener("mouseup", stopEvent, false);
    255         caObj.addEventListener("mousemove", stopEvent, false);
    256         //*********draw init ZA**********
    257         productZA(true);
    258         //**********draw bird*************
    259         //drawBird();
    260         //**********draw ZALst*************
    261         //drawZALst();
    262         //caCt.clearRect(0, 0, caObj.width, caObj.height);
    263         //*********do animiate********
    264         animate();
    265     }
    266 }
    267 function ZA(TB,l,h,w) {
    268 // TB: top or bottom; "T/B"
    269     this.TB = TB;
    270     this.l = l;
    271     this.h = h;
    272     this.w = w;
    273 }
    274 ZA.prototype.doDraw = function(){
    275     switch(this.TB){
    276         case "T":
    277             caCt.fillRect(this.l-0.5,flypperBirdWorld.ZAT-0.5,this.w,this.h);
    278             break;
    279         case "B":
    280             caCt.fillRect(this.l-0.5,flypperBirdWorld.ZAB-this.h-0.5,this.w,this.h);
    281             break;
    282     }
    283 }
    284 ZA.prototype.isIn = function(){
    285     var result= false;
    286     if((bBodyL+bBodyW)>=this.l){
    287         if(bBodyL<=this.l+this.w){
    288             switch(this.TB){
    289                 case "T":
    290                     if(bBodyT<(flypperBirdWorld.ZAT+this.h))
    291                         result=true;
    292                     break;
    293                 case "B":
    294                     if((bBodyT+bBodyH)>(flypperBirdWorld.ZAB-this.h))
    295                         result=true;
    296                     break;
    297             }
    298         }
    299     }
    300     return result;
    301 }
    302 function reStart(){
    303     setTimeout(function(){flypperBirdWorld.init();},1000);
    304 }
    305 onload=function(){
    306     flypperBirdWorld = new FlypperBirdWorld();
    307     flypperBirdWorld.init();
    308 }

    requestNextAnimationFrame.js

    window.requestNextAnimationFrame=(function(){var originalWebkitRequestAnimationFrame=undefined,wrapper=undefined,callback=undefined,geckoVersion=0,userAgent=navigator.userAgent,index=0,self=this;if(window.webkitRequestAnimationFrame){wrapper=function(time){if(time===undefined){time=+new Date()};self.callback(time)};originalWebkitRequestAnimationFrame=window.webkitRequestAnimationFrame;window.webkitRequestAnimationFrame=function(callback,element){self.callback=callback;originalWebkitRequestAnimationFrame(wrapper,element)}};if(window.mozRequestAnimationFrame){index=userAgent.indexOf('rv:');if(userAgent.indexOf('Gecko')!=-1){geckoVersion=userAgent.substr(index+3,3);if(geckoVersion==='2.0'){window.mozRequestAnimationFrame=undefined}}};return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback,element){var start,finish;window.setTimeout(function(){start=+new Date();callback(start);finish=+new Date();self.timeout=1000/60-(finish-start)},self.timeout)}})();
    View Code

    CSDN下载:

    http://download.csdn.net/detail/wangxsh42/7675645

  • 相关阅读:
    刷题系列
    元类编程
    Python内置方法与面向对象知识点进阶系列
    json反序列化的时候字符串为单引号的一个坑
    刨根问底,完美解决Django2版本连接MySQL报错的问题
    使用mkdocs撰写技术文档并免费部署上线
    关于Python的源文件编译看这一篇就够了
    SQL查询where语句后面字符串大小写问题
    configparser模块获取settings.ini文件中的配置数据
    Sharepoint 2013列表视图和字段权限扩展插件(免费下载)!
  • 原文地址:https://www.cnblogs.com/wangxinsheng/p/3867340.html
Copyright © 2011-2022 走看看