码迷,mamicode.com
首页 > 其他好文 > 详细

小蜜蜂游戏

时间:2015-04-11 16:09:59      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

html

<p>小蜜蜂</p>
<script type="mce-text/javascript" src="http://www.cnblogs.com/miaov.js"></script>
<script type="mce-text/javascript" src="http://www.cnblogs.com/bee.js"></script>
<!-- Date: 2015-04-10 -->
<style><!--
*{ margin:0; padding:0;}
li{ list-style:none;}
#div1{ width:800px; height:600px; overflow:hidden; background:black; margin:0px auto; position:relative;}
#gameBtn{ color:white; font-size:20px; cursor:pointer; border:1px #FFFFFF solid; width:100px; height:30px; line-height:30px; text-align:center; position:absolute; top:285px; left:350px;}

#score{ color:#FFFFFF; font-size:20px;}
#bee{ position:relative;}
.enemy1{ width:40px; height:28px; background:url(images/mf1.png) no-repeat; float:left;}
.enemy2{ width:40px; height:28px; background:url(images/mf2.png) no-repeat; float:left;}
.enemy3{ width:40px; height:28px; background:url(images/mf3.png) no-repeat; float:left;}

.air1{ width:46px; height:60px; background:url(images/fj.png) no-repeat; position:absolute;}
.bullet{ width:1px; overflow:hidden; height:10px; background:white; position:absolute;}
--></style>
<div id="div1">
<div id="gameBtn">开始游戏</div>
</div>

 

bee.js

/**用命名空间的写法来写 也叫单体**/
/**  功能:
 元素的生成( createElement )
敌人的移动( setInterval )
碰撞检测( 方法 ) 小蜜蜂和子弹
敌人跟随( 运动算法 )  小蜜蜂掉下的时候 会根据飞机往左还是往右 来走
关卡( 实现多关 )
其他的功能 ( 积分 ,血量 )
**/

window.onload=function(){
    
    var oBtn = getById(‘gameBtn‘);
    
     
    
    oBtn.onclick = function(){
        this.style.display = ‘none‘;
        Game.init(‘div1‘);
    }     
}

var Game={
    
    // 创建数据 start
    
    oEnemy:{//敌人数据的创建 小蜜蜂的数据
        e1:{ style:‘enemy1‘, blood:1, speed:5 , score:1   },//打中了绿色的加一个积分
        e2:{ style:‘enemy2‘, blood:2, speed:7 , score:2   }, //打中了紫色的加两个积分
        e3:{ style:‘enemy3‘, blood:3, speed:10 , score:3   } //打中了红色的加三个积分
    },
    
    guanka:[ //关卡数据创建  设置 每行几个 colNum 小蜜蜂掉下来X轴 和Y轴的速度, 每隔 times时间掉下来一个
    //第一关数据 ul的数据
        {
            eMap:[  //6 行 每行 10 个
                    ‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,
                    ‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,
                    ‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,‘e2‘,
                    ‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,
                    ‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,
                    ‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘
                 ],
                  
            colNum:10 , //每行几个
            iSpeedX:10, //小蜜蜂掉下时X轴速度
            iSpeedY:10, //小蜜蜂掉下时Y轴速度
            times: 2000    //每隔2s钟掉下一个小蜜蜂
        },
    //第二关数据   ul的数据
      { 
            eMap:[  
                    ‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,
                    ‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,
                    ‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,‘e3‘,
                    ‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,
                    ‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,
                    ‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘,‘e1‘
                 ],
                  
            colNum:10 , 
            iSpeedX:10,  //ul的X轴速度
            iSpeedY:10,  //ul的y轴速度
            times: 2000     
        }
    
    ],
    
    airPlain:{
        style:‘air1‘,
        bulletStyle:‘bullet‘
    },
    
    // 创建数据 end
    
    
    
    init:function(id){  //初始化
        this.oParent = document.getElementById(id);
        
        this.iGrade = 0;
        
        this.createScore();
        
        this.createEnemy( this.iGrade  );
        
        this.createAirplain();
        
    },
    
    createScore:function(){ //创建score
        var oS = document.createElement(‘div‘);
        oS.id = ‘score‘;
        oS.innerHTML = ‘积分:<span>0</span>‘;
        this.oParent.appendChild(oS);
        
        this.oSNum = oS.getElementsByTagName(‘span‘)[0];
    },
    
    createEnemy:function(iNow){
        
        if( this.oUl ){//进入第二关 或者后面的关的时候 如果有ul 先清掉ul 并清掉ul的定时器
            clearInterval( this.oUl.timer );
            this.oParent.removeChild( this.oUl );
            
        }
        
        document.title = ‘第‘+ (iNow+1) +‘关‘;
        
        var gk = this.guanka[iNow]; 
         
        var oUl = document.createElement(‘ul‘);
        
        
        var arr=[];
        
        
        
        oUl.id=‘bee‘;
        this.oParent.appendChild(oUl);
        oUl.style.width = this.guanka[iNow].colNum * 40 +‘px‘;
        oUl.style.left = (this.oParent.offsetWidth - oUl.offsetWidth)/2 +‘px‘;
        
        this.oUl = oUl;
        
        
        for( var i=0; i < gk.eMap.length ; i++ ){
             var oLi = document.createElement(‘li‘);
              oLi.className = this.oEnemy[gk.eMap[i]].style;
              
              //每个小蜜蜂身上都有很多数据 血 速度 积分
              oLi.blood = this.oEnemy[gk.eMap[i]].blood;
              oLi.speed = this.oEnemy[gk.eMap[i]].speed;
              oLi.score = this.oEnemy[gk.eMap[i]].score;
              
              oUl.appendChild(oLi); 
    
        }
        this.aLi = oUl.getElementsByTagName(‘li‘);
        
        //li 定位转换为absolute
        
        for( var i = 0; i < this.aLi.length ; i++ ){
            arr.push( [this.aLi[i].offsetLeft , this.aLi[i].offsetTop] )
        }
        
        for(  var i = 0; i < this.aLi.length ; i++ ){
            
            this.aLi[i].style.position = ‘absolute‘;
            this.aLi[i].style.left = arr[i][0] +‘px‘;
            this.aLi[i].style.top = arr[i][1] +‘px‘;
        }
        
        //ul 移动
        this.runEnemy(gk); //把当前关卡传进来
        
    },
    
    //敌人移动
    runEnemy:function(gk){
        
        var This = this;
        
        var L = 0;
        var R = this.oParent.offsetWidth - this.oUl.offsetWidth;
        
        this.oUl.timer = setInterval( function(){
             //临界点 
            if( This.oUl.offsetLeft > R ){
                
                gk.iSpeedX *=-1;
                This.oUl.style.top = This.oUl.offsetTop + gk.iSpeedY +‘px‘;
                
            }else if( This.oUl.offsetLeft < L ){
                
                gk.iSpeedX *=-1;
                This.oUl.style.top = This.oUl.offsetTop + gk.iSpeedY +‘px‘;
            }
            
            This.oUl.style.left = This.oUl.offsetLeft + gk.iSpeedX +‘px‘;

        },200)
        
        setInterval(function(){
            This.oneMove()//单兵作战 当整体蜜蜂移动的时候开始
        },gk.times)  //每隔多长时间掉下一个蜜蜂
        
    },
    
    oneMove:function(){
        var This = this;
        var nowLi = this.aLi[ Math.floor(Math.random()*this.aLi.length) ]
        
        //开一个定时器让它 小蜜蜂 来攻击我改变left 和top值
        //并跟随飞机  利用的是 勾股定理 计算蜜蜂的x轴和y轴的速度
        nowLi.timer=setInterval(function(){
            var a = (This.oAir.offsetLeft + This.oAir.offsetWidth/2) - (nowLi.offsetLeft + nowLi.offsetWidth/2 + nowLi.parentNode.offsetLeft );
        
            var b = (This.oAir.offsetTop + This.oAir.offsetHeight/2) - (nowLi.offsetTop + nowLi.offsetHeight/2 + nowLi.parentNode.offsetTop );
        
            var c = Math.sqrt( a*a +b*b );
            
            var iSX = nowLi.speed * a/c ; //速度会根据飞机来决定是正还是负  小蜜蜂往右 速度大于0 小蜜蜂往左 速度小于0
            
            var iSY = nowLi.speed * b/c;
            
            nowLi.style.left = nowLi.offsetLeft + iSX +‘px‘;
            nowLi.style.top = nowLi.offsetTop + iSY +‘px‘;
            
            if( This.pz( This.oAir , nowLi ) ){
                
                alert(‘游戏结束‘);
                window.location.reload()  //页面重新从加载
            }

        },30)

    },
    
    
    createAirplain:function(){//创建飞机
        var oAir = document.createElement(‘div‘);
        this.oAir = oAir;
        oAir.className = this.airPlain.style;
        this.oParent.appendChild( oAir );
        oAir.style.left = (this.oParent.offsetWidth - oAir.offsetWidth)/2 +‘px‘;
        oAir.style.top =  this.oParent.offsetHeight - oAir.offsetHeight +‘px‘;
        
        this.bindAir();
    },
    
    
    bindAir:function(){  //左右键控制飞机移动
        
        var iNum = 0;
        
        var timer = null;
        
        var This = this;
        
        document.onkeydown = function(ev){
            
            var ev = ev || event;
            
            if(!timer){ //如果timer为空的时候 不存在的时候 开定时器 为了保证只有一个定时器  开定时器是为了解决键盘时间 卡的情况
                
                timer = setInterval( show , 30 );
                
            }

            if( ev.keyCode == 37 ){    
                
                iNum = 1
                    
            }else if( ev.keyCode == 39 ){
                
                iNum = 2    
            }
        };
        
        
        document.onkeyup = function(ev){
            var ev = ev || event;
            
            clearInterval(timer);
            timer=null;
            iNum = 0;
            
            if( ev.keyCode == 32 ){  //当空格键 抬起的时候 创建子弹
                
                This.createBullet()
                
            }    
        };
        
        function show(){
                
                if( iNum == 1 ){
                    This.oAir.style.left = This.oAir.offsetLeft - 10 +‘px‘
                }else if( iNum == 2 ){
                    This.oAir.style.left = This.oAir.offsetLeft + 10 +‘px‘
                }    
        }
    },
    
    createBullet:function(){
        
        var oBullet = document.createElement(‘div‘);
        oBullet.className = ‘bullet‘;
        this.oParent.appendChild( oBullet );
        oBullet.style.left = this.oAir.offsetLeft + this.oAir.offsetWidth/2 +‘px‘;
        oBullet.style.top = this.oAir.offsetTop - 10 +‘px‘;
        
        this.runBullet(oBullet); //把创建的子弹传进来 运动的就是这个子弹
    },
    
    runBullet:function(oB){
        
        var This = this;
        
        //每一个子弹都有一个定时器 当子弹飞出屏幕的时候应该关掉定时器 并删掉子弹 避免占内存
        oB.timer = setInterval(function(){
            
            if( oB.offsetTop < -10 ){  //子弹飞出屏幕
                
                clearInterval( oB.timer );
                
                This.oParent.removeChild( oB );
                
            }else{
                oB.style.top = oB.offsetTop - 10 +‘px‘;
            }
            
            for( var i = 0 ; i < This.aLi.length ;i++ ){
                    if( This.pz( oB , This.aLi[i] ) ){
                        
                        if( This.aLi[i].blood ==1 ){//如果只剩一滴血的话 消除  紫色的需要打两下 绿色的打一下消除
                            clearInterval( This.aLi[i].timer ); //删掉小蜜蜂之前 先关掉小蜜蜂的定时器(改left值top值的定时器)
                            This.oSNum.innerHTML = parseInt(This.oSNum.innerHTML) + This.aLi[i].score;
                            This.oUl.removeChild( This.aLi[i] );//这一句要在下面 不然会报错
                            
                            //打中了加积分  积分 和血是在创建 小蜜蜂敌人数据的时候 加上的
                            
                        }else{
                            This.aLi[i].blood--
                        }

                        clearInterval( oB.timer );
                        This.oParent.removeChild(oB) 
                        
                    }
                }
            //子弹打蜜蜂的过程中  如果蜜蜂全都打完了就进入第二关
                
            if( !This.aLi.length ){
                This.iGrade++;
                
                if( This.iGrade < This.guanka.length ){
                    This.createEnemy(This.iGrade);
                }else{
                    
                    This.iGrade = This.guanka.length;
                    alert(‘通关‘)
                }
            }
        },30)
    },
    
    pz : function(obj1,obj2){  //碰撞检测
        
        var L1 = obj1.offsetLeft;
        var R1 = obj1.offsetLeft + obj1.offsetWidth;
        var T1 = obj1.offsetTop;
        var B1 = obj1.offsetTop + obj1.offsetHeight;
        
        var L2 = obj2.offsetLeft + obj2.parentNode.offsetLeft;
        var R2 = obj2.offsetLeft + obj2.offsetWidth + obj2.parentNode.offsetLeft;
        var T2 = obj2.offsetTop + obj2.parentNode.offsetTop;
        var B2 = obj2.offsetTop + obj2.offsetHeight + obj2.parentNode.offsetTop;
        
        if( R1<L2 || L1>R2 || B1<T2 || T1>B2 ){
            return false;
        }
        else{
            return true;
        }
        
    }
    
};

miaov.js

/*getStyle()*/
 
function getStyle ( obj, attr ) { return obj.currentStyle?obj.currentStyle[attr] : getComputedStyle( obj )[attr]; }

/*getById()**/
function getById(id){
    return document.getElementById(id)
}

/*$**/
function $(v){
    if(typeof v===‘function‘){
                     return window.onload=v
    }else if(typeof v===‘string‘){
                     return document.getElementById(v)
    }else if(typeof v===‘object‘){
                     return v
    }
}



/*leo运动框架doMove()*速度是匀速的,自己设置的*/
function doMove(obj,attr,dir,target,endFn){
    
    //var presentPos=parseInt(getStyle(obj,attr)); //obj的当前位置 left 或者 top 值
    dir = parseInt(getStyle(obj,attr)) < target ? dir : -dir;  //判断 dir是正还是负,根据 当前值 是否小于 目标值
    clearInterval(obj.timer);
    obj.timer=setInterval(function(){
        var speed=parseInt(getStyle(obj,attr))+dir; //步长
        if( speed < target && dir <0  || speed > target && dir>0 ){ //判断方向
            speed = target  //speed赋值给obj.style[attr] 前先对speed进行判断,超过了目标点 就 回到目标点
        }
        obj.style[attr]=speed+‘px‘; //赋值
        if(speed==target){
            clearInterval(obj.timer);
            endFn && endFn()
        }
    },30)
}


/**运动框架startMove(),速度是计算出来 缓冲,跟距离成正比**/
function startMove(obj,attr,target,endFn){
    clearInterval(obj.timer)
    obj.timer=setInterval(function(){
            var speed=(target-parseInt(getStyle(obj,attr)))/10;
            speed = speed>0 ? Math.ceil(speed) : Math.floor(speed);
            var speedL=parseInt(getStyle(obj,attr))+speed;
             
            obj.style[attr]=parseInt(getStyle(obj,attr))+speed+‘px‘;
            //document.title=getStyle(obj,attr)+"-"+speed;

            if(speedL==target){
                clearInterval(obj.timer);
                endFn && endFn()
            }
            
    },30)    
}

 

//运动结合透明度
function Move(obj,attr,dir,target,endFn){
                var iCur=0;
                clearInterval( obj.timer ); 
                if( attr == ‘opacity‘ ){
                    dir = target - parseInt(getStyle( obj,attr )*100) > 0 ? dir : -dir;    
                }else{
                    dir = target - parseInt(getStyle( obj,attr )) > 0 ? dir : -dir;    
                }
 
                obj.timer =setInterval(function(){    
                     if( attr == ‘opacity‘ ){
                         iCur = parseInt(getStyle( obj,attr )*100);
                     }else{
                         iCur = parseInt(getStyle( obj,attr ));
                     }
 
                    var speed = iCur + dir;
                    if( speed > target && dir >0 || speed <target && dir <0 ){
                        speed = target;
                    }
                      
                      if( attr ==‘opacity‘ ){
                          obj.style[attr] = speed/100;
                          obj.style.filter=‘alpha(opacity=‘+speed+‘)‘
                      }else{
                          obj.style[attr] = speed +‘px‘;
                      }
                         
                    if( speed == target ){
                        clearInterval( obj.timer );
                        endFn && endFn.call(obj)
                    }
                    
                },30)
            }
            
            
/**MovePerfect 完美版运动框架**/
function Moves(obj,json,fn){
        clearInterval(obj.tms);
        obj.tms=setInterval(function(){
                var bStop=true;
                for(var attr in json){
                        var iCur=attr===‘opacity‘?parseInt(parseFloat(getStyle(obj,attr))*100):parseInt(getStyle(obj,attr));
                        var iSpeed=(json[attr]-iCur)/6;
                        iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);
                        if(iCur!==json[attr]){
                                bStop=false;        
                        }
                        if(attr===‘opacity‘){
                                obj.style.filter=‘alpha(opacity:‘+(iCur+iSpeed)+‘)‘;
                                obj.style.opacity=(iCur+iSpeed)/100;
                        }else{
                                obj.style[attr]=(iCur+iSpeed)+‘px‘;        
                        }
                }
                if(bStop){
                        clearInterval(obj.tms);
                         fn && fn.call(obj)  // 这里用call把对象从window 指向了当前运动的对象,那么在函数调用的时候可以直接用this了  Moves(obj,json,function(){this})
                }
        },10);
}

/**完美 缓冲运动 带opacity 速度版**/
function hcMove(obj,json,fn){
                clearInterval( obj.timer );
                 
                obj.timer=setInterval(function(){
                    var iBtn=true;  
                    
                    for(var attr in json){
                        var target=json[attr];
                        
                        if( attr == ‘opacity‘ ){
                            var iSpeed = (target-Math.round(getStyle(obj,attr))*100)/6;
                        }else{
                            var iSpeed = (target-parseInt(getStyle(obj,attr)))/6;
                        }
                        
                         
                         iSpeed = iSpeed > 0 ? Math.ceil(iSpeed)  : Math.floor(iSpeed);//速度取整,因为js中的小数是经过计算的,默认四舍五入,但是不够0.5的就不会动了
                         
                         if( parseInt(getStyle(obj,attr)) != target ){
                              iBtn=false;//如果有运动没到达目标点,iBtn为false
                              
                              if( attr == ‘opacity‘ ){
                                  var sNow=Math.round(getStyle(obj,attr)*100) + iSpeed;
                                  
                                  //先做处理 再赋值
                                  if( sNow > target && iSpeed >0 || sNow < target && iSpeed <0 ){
                                      sNow = target
                                  }
                                  
                                  obj.style[attr] = sNow/100;
                                  obj.style.filter = ‘alpha(opacity=‘+sNow+‘)‘;
                              }else{
                                  
                                  var sNow = parseInt(getStyle(obj,attr)) + iSpeed;
                                  
                                  //先做处理 再赋值
                                  if( sNow > target && iSpeed >0 || sNow < target && iSpeed <0 ){
                                      sNow = target
                                  }
                                  obj.style[attr] = sNow +‘px‘;
                              }
 
                         }

                        }
                        
                        if(iBtn){ //如果运动全部完成,iBtn为true
                            clearInterval(obj.timer);
                            fn && fn()
                        }
 
                },30)
            }

/**时间版运动框架  结合Tweens()函数  可实现各种运动  匀速,加速,减速等 **/
function starMove3(obj,json,times,fx,fn){
                 var iCur={}; //获取初始值 b
                 iCur[attr] = 0; //初始化 所有值为0
                 
                 for(var attr in json) //区分透明度和其他属性的初始值的区别
                 {
                     if(attr == ‘opacity‘){
                          iCur[attr] = Math.round(getStyle( obj,attr )*100) 
                         
                     }else{
                         iCur[attr] = parseInt(getStyle(obj,attr))
                     }
                 }
                 
                 clearInterval( obj.timer );
                 
                 var oldTime=nowTime();
                 
                 obj.timer=setInterval(function(){
                         var newTime=nowTime();
                         
                         // oldTime < newTime;
                         // oldTime - newTime //负数 到负无穷
                         
                         var t1=oldTime - newTime + 2000;  //从2000开始减小 一直到负无穷
                         
                         Math.max( 0, t1) //t1先 大于 0  后小于0
                         var t=2000-Math.max( 0, t1); //0 2000 //当前时间  ,所有属性的当前时间都一样
                         
                         for(var attr in json)
                         {    
                              var value=Tween[fx](t,iCur[attr],json[attr]-iCur[attr],times); //当前位置,变化值
                              if( attr == ‘opacity‘ ){
                                  obj.style[attr] = value/100;
                                  obj.style.filter = ‘alpha(opacity=‘+value+‘)‘
                              }else{
                                  obj.style[attr] = value +‘px‘;
                              }
                         }
                         
                         if( t==times ){
                             clearInterval( obj.timer );
                             fn && fn.call(obj)
                         }
                         
                 },13)
            }
            
function nowTime(){ return (new Date).getTime() }
/**时间版运动框架  结合Tweens()函数  可实现各种运动  匀速,加速,减速等 **/
function startMove4(obj,json,times,fx,fn){
        
        var iCur = {};
        var startTime = nowTime();
        
        if( typeof times == ‘undefined‘ ){
            times = 400;
            fx = ‘linear‘;
        }
        
        if( typeof times == ‘string‘ ){
            if(typeof fx == ‘function‘){
                fn = fx;
            }
            fx = times;
            times = 400;
        }
        else if(typeof times == ‘function‘){
            fn = times;
            times = 400;
            fx = ‘linear‘;
        }
        else if(typeof times == ‘number‘){
            if(typeof fx == ‘function‘){
                fn = fx;
                fx = ‘linear‘;
            }
            else if(typeof fx == ‘undefined‘){
                fx = ‘linear‘;
            }
        }
        
        for(var attr in json){
            iCur[attr] = 0;
            if( attr == ‘opacity‘ ){
                iCur[attr] = Math.round(getStyle(obj,attr)*100);
            }
            else{
                iCur[attr] = parseInt(getStyle(obj,attr));
            }
        }
        
        clearInterval(obj.timer);
        obj.timer = setInterval(function(){
            
            var changeTime = nowTime();
            
            //startTime changeTime
            
            var scale = 1-Math.max(0,startTime + times - changeTime)/times; //2000 - 0 -> 1-0 -> 0-1
            
            for(var attr in json){
                
                var value = Tween[fx](scale*times,iCur[attr],json[attr] - iCur[attr],times);
                
                if(attr == ‘opacity‘){
                    obj.style.filter = ‘alpha(opacity=‘+ value +‘)‘;
                    obj.style.opacity = value/100;
                }
                else{
                    obj.style[attr] = value + ‘px‘;
                }
                
            }
            
            if(scale == 1){
                clearInterval(obj.timer);
                if(fn){
                    fn.call(obj);
                }
            }
            
            
        },30);
     
    }

/**抖动 shake 封装**/
 function shake(obj,attr,endFn){  //如果愿意 也可以将抖动的初始频率传进来 20 
     if(obj.onOff){return;}
     obj.onOff=true;
     
     var num=0;
     var pos=parseInt(getStyle(obj,attr));
     
     var arr=[];//20,-20,18,-18...0;//抖动的频率
    
    for(var i=20;i>0;i-=2){
        arr.push(i,-i);
    }
    arr.push(0);
    
    clearInterval(obj.shake);//这里用shake是为了防止与库里其他的timer冲突
    obj.shake=setInterval(function(){
        obj.style[attr]=pos+arr[num]+‘px‘;
        num++;
        if(num===arr.length){
            clearInterval(obj.shake);
            endFn && endFn();
            num=0;
            obj.onOff=false 
            //如果不加这一行,点击 只抖动一次, 以后点击都无效
        }
    },50)
}

/**数字转化为字符串,不足9补零**/
function toDouble(n){
    if(n<10){
        return ‘0‘+n
    }else{
        return ‘‘+n
    }
}

/**通过class来获取元素**/
function getByClassName(oParent,tagName,className){
        var arr=[];
        var als=oParent.getElementsByTagName(tagName);
        for(var i=0;i<als.length;i++){
            var a1=als[i].className.split(‘ ‘);
            for(var j=0;j<a1.length;j++){
                if(a1[j]==className){
                    arr.push(als[i]);
                    break;
                } 
            }    
        }
        return arr
}    
/**正则 选取class**/
function getByClass(oParent,className){
     var aS=oParent.getElementsByTagName(‘*‘);
     var arr=[];
     for(var i=0;i<aS.length;i++){
           var s=aS[i].className;
          // /\b+className+\b/
           var re=new RegExp(‘\\b‘+className+‘\\b‘ ); //  \b代表独立部分,用\\ 是为了浏览器能输出  变量的 只能用正则的全称
           if(re.test(s))  arr.push( aS[i] );
            break
     }
 return arr
}

//去掉空格
function trim(str){
          var re=/^\s+|\s+|\s+$/g;
          return  str.replace(re,‘‘)
}


/**添加class,并 排除添加重复的class,结合下面的indexofArr使用**/
function addClass(obj,className){
        var arrClass=obj.className.split(‘ ‘);
        //如果要添加的class不存在
        var _index=indexofArr(arrClass,className);//查看所添加的className在 原有的class中是否存在
        
        if(obj.className==‘‘){
                obj.className=className;
        }else if(_index==-1){ //当所添加的class不存在时,执行下一句
                obj.className+=‘ ‘+className;
        }        
}

/**删除class**/
function removeClass(obj,className){
        var arrClass=obj.className.split(‘ ‘);
        
        var _index=indexofArr(arrClass,className);//查看所添加的className在 原有的class中是否存在
        if(_index==1){
                arrClass.splice(_index,1);//这一步是对数组进行操作,删除数组中的class,返回的是被删掉的那一个元素
                obj.className=arrClass.join(‘ ‘);//className需要重新join数组中的元素,class是字符串
                
        }
}

        
/**检查 某个元素v 在数组中是否存在,存在返回1  不存在返回-1**/
function indexofArr(arr,v){
         for(var i=0;i<arr.length;i++){
                 if(arr[i]==v){
                         return i  //存在
                 }
         }
         
         return -1  //不存在
}

function onFade(obj,time,endFn){        //渐隐
    var maxNum = 100;
    var num = 0;
    var timer = null;
    clearInterval(timer);
    timer = setInterval(function(){
        num+=10;
        if(obj.currentStyle){
            obj.style.filter = ‘alpha(opacity=‘ + maxNum-num + ‘)‘;
        }else{
            obj.style.opacity = (maxNum-num)/100;
        }
        if(num>100) {
            clearInterval(timer);
            endFn && endFn();
        }
    },time);
}

/**获取某个元素到页面的距离,不管父级有没有定位,不管是什么元素,到左侧同理
 *使用方法:getPos(obj).left  或者  getPos(obj).top **/
function getPos(obj){
    var pos={‘left‘:0,‘top‘:0};
    while(obj){
        pos.left+=obj.offsetLeft;
        pos.top+=obj.offsetTop;
        obj=obj.offsetParent;
    }
    return pos
}

/**获取鼠标距离页面顶部 和 页面左侧的距离  但凡用到client的就要用到scroll。
 *跟随鼠标移动案例: 鼠标到哪 div跟到哪

 *用法 var oEvent=ev || event;
 *   obj.style.left=getPos1(oEvent).x+‘px‘ **/
function getPos1(ev){
    var scrollTop=document.documentElement.scrollTop || document.body.scrollTop;
    var scrollLeft=document.documentElement.scrollLeft || document.body.scrollLeft;
    return {x:ev.clientX+scrollLeft,y:ev.clientY+scrollTop}
    
}

/**绑定函数**/
function bind(obj,evName,fn){
    if(obj.attachEvent){
        obj.attachEvent(‘on‘+evName,function(){
            fn.call(obj)
        });
    }else{
        obj.addEventListener(evName,fn,false)
    }
    
}

//判断一个cookie存不存在 if(getCookie(key))
function getCookie(key){
    var arr1=document.cookie.split(‘; ‘);
    for(var i=0;i<arr1.length;i++){
        var arr2=arr1[i].split(‘=‘);
        if(arr2[0]==key){
            //encodeURI(arr2[1]);
            return  decodeURI(encodeURI(arr2[1]));
        }
    }
}

//设置cookie,注意key 和value 都是字符串,t是数字 过几天后过期
function setCookie(key,value,t){
    var oDate=new Date();
    oDate.setDate(oDate.getDate()+t);
    document.cookie=‘‘+key+‘=‘+value+‘;expires=‘+oDate.toGMTString();
}

//删除cookie
function removeCookie(key){
     setCookie(key,‘‘,-1)
}


/**面向对象Tab**/
/*
用法:
1.在页面创建html,id自定义
<div id="tab1" class=‘tab‘>
                <input type="button" value="时事" class=‘select‘/>
                <input type="button" value="政治" />
                <input type="button" value="新闻" />
                <div class="active">时事时事时事</div>
                <div>政治政治政治</div>
                <div>新闻新闻新闻</div>
        </div>
2.在window.onload中调用:
var tab1=new Tab(‘tab1‘);
tab1.init();
tab1.autoplay()
扩展:还可以自己添加自定义方法,例如自动播放,可以自主决定要不要调用这个方法,比普通函数的优点是扩展性强
*/
function Tab(id){//this指向对象 tab1
                    this.oTab=document.getElementById(id)
                    this.aInput=this.oTab.getElementsByTagName(‘input‘);
                    this.aDiv=this.oTab.getElementsByTagName(‘div‘);
        }
        
        Tab.prototype.init=function(){//this指向对象 tab1 
                    var This=this;//把对象存进This中
                    for(var i=0;i<this.aInput.length;i++){
                        this.aInput[i].index=i;
                        this.aInput[i].onclick=function(){
                            This.change(this);  //这里括号中的this指的是按钮
                             
                        }
                    }
        }
        
        Tab.prototype.change=function(obj){//this指的是按钮,就不对了,应该指的是对象,可以根据change()的调用来修正指向,然后利用把对象this存进This,obj指的是当前按钮
                    for(var i=0;i<this.aInput.length;i++){
                            this.aInput[i].className=‘‘;
                             this.aDiv[i].style.display=‘none‘;
                    }
                    obj.className=‘select‘;
                    this.aDiv[obj.index].style.display=‘block‘;
        }
        
        Tab.prototype.autoplay=function(){//this指的是按钮,就不对了,应该指的是对象,可以根据change()的调用来修正指向,然后利用把对象this存进This,obj指的是当前按钮
                    var This=this;
                    setInterval(function(){
                            for(var i=0;i<This.aInput.length;i++){
                                    This.aInput[i].className=‘‘;
                                     This.aDiv[i].style.display=‘none‘;
                            }
                             if(This.iNow==This.aInput.length-1){
                                      This.iNow=0
                             }else{
                                      This.iNow++
                             }
                            This.aInput[This.iNow].className=‘select‘;
                            This.aDiv[This.iNow].style.display=‘block‘;    
                             
                    },1000)        
        }
/**面向对象tab结束**/


/**绑定事件和主动触发 **/
function bindEv(obj,evName,fn){
                 
    //obj,楼层
    //evName:楼层下的书架
    //fn:一本书
    
    obj.Listeners = obj.Listeners || {}; //楼层的建立,第一次没有楼层,走{}
    obj.Listeners[evName] = obj.Listeners[evName] || [];//书架的建立,第一次没有书架,走 []
    obj.Listeners[evName].push( fn ); //
    
    
    if(obj.addEventListener){
        obj.addEventListener(evName,fn,false)
    }else{
        obj.attachEvent(‘on‘+evName,function(){
            fn.call(this)
        })
    }
}

//主动触发自定义事件
//bindEv 和 fireEvent 需要找到一种关系,通过obj和evName能够找到fn
function fireEvent(obj,evName){
    for(var i=0;i<obj.Listeners[evName].length;i++){
        obj.Listeners[evName][i]()  //书架下的每本书,就是该事件下的所有函数
    }
}


 
/**多物体弹性运动框架
 * bb(oDiv1,{‘left‘:500,‘top‘:200})
 * **/
/**
 * 
if(!obj.oSpeed)obj.oSpeed={};
如果obj对象上没有oSpeed这个自定义属性,就定义一个。值是一个空对象,可以理解为是一个空json。


if(!obj.oSpeed[attr])obj.oSpeed[attr]=0;

上面已经定义自定义oSpeed属性了,所以这里是判断这个自定义属性里有没有attr这个属性,没有的话就定义一个,并设置初始值为0。
**/
  function bb(obj,json){
         
       clearInterval(obj.timer);
       
       obj.timer=setInterval(function(){
           
           var iBtn = true;
           
           for( var attr in json ){
               /**代码块**/  
                if( !obj.iSpeed ) obj.iSpeed={};
                if( !obj.iSpeed[attr] ) obj.iSpeed[attr]=0;
                
                var  iTarget = json[attr];
                var  iCur = parseInt( getStyle( obj,attr ) );

                    obj.iSpeed[attr] += (iTarget - iCur)/6;
                    obj.iSpeed[attr] *= 0.75;
                    
                    if( Math.abs(obj.iSpeed[attr]) <=1 && Math.abs( iTarget - iCur )<=1 ){
                         obj.iSpeed[attr]=0;
                     obj.style[attr] = iTarget +‘px‘
                    }else{
                        iBtn = false;
                        var sNow= iCur + obj.iSpeed[attr];
                        if( attr ==‘width‘ || attr ==‘height‘ ){
                            if( sNow < 0 ) sNow =0;
                        }
                        obj.style[attr] = sNow +‘px‘;
                    } 
                   document.title = iCur +‘-‘+obj.iSpeed[attr];
/**代码块**/    
           }
           
           if( iBtn ){
               clearInterval( obj.timer );
               
           }
           
           
       },30)
 }

/**找出数组中最小值**/
function minimum(arr){
       var v=arr[0];
       var im_pos=0;
     
      for(var i=1;i<arr.length;i++){
              if( arr[i] < v ){
                  v = arr[i];
                  im_pos=i
            }
      }
     
    return v //找出最小值 也可以找出最小值所在的位置 return im_pos
  }


/**找出字符串中的所有数字**/
function findNum(str){
    return str.match(/\d+/g);
}

 function getTop (obj)
    {
            var iTop=0;
            var scrollTop=document.documentElement.scrollTop || document.documentElement.scrollTop;
            var clientHeight=document.documentElement.clientHeight;
            iTop= scrollTop + (clientHeight - obj.offsetHeight)/2;
            return iTop
    }

function extend (obj1,obj2)
    {
        for(var attr in obj2){
            obj1[attr]=obj2[attr]
        }
    }
/**取消冒泡**/
function stopPro (e) {
        if (e && e.stopPropagation) {
          //W3C取消冒泡事件
          e.stopPropagation();
        } else {
          //IE取消冒泡事件
          window.event.cancelBubble = true;
        }
      }

//css3 过渡完成事件
function addEnd(obj,fn){
                 obj.addEventListener(‘webkitTransitionEnd‘,fn,false);//webkit内核
                 obj.addEventListener(‘transitionend‘,fn,false);//firefox 
            }
            
function removeEnd(obj,fn){
    obj.removeEventListener(‘webkitTransitionEnd‘,fn,false);//webkit内核
    obj.removeEventListener(‘transitionend‘,fn,false);//firefox 
}

//css3 animation end
function addEndAnimation(obj,fn){
        obj.addEventListener(‘webkitAnimationEnd‘,fn, false); 
        obj.addEventListener(‘animationEnd‘,fn, false);
}
//随机背景色
function randomColor(){
        var str= Math.ceil(Math.random()*16777215).toString(16);
        while(str.length<6){
            str=‘0‘+str;//不足6位补0
        }
        return str
    }
//获取几天之后的日期

function GetDateStr(AddDayCount) 
            { 
                var dd = new Date(); 
                dd.setDate(dd.getDate()+AddDayCount);//获取AddDayCount天后的日期 
                var y = dd.getYear(); 
                var m = (dd.getMonth()+1)<10?"0"+(dd.getMonth()+1):(dd.getMonth()+1);//获取当前月份的日期,不足10补0
                var d = dd.getDate()<10?"0"+dd.getDate():dd.getDate(); //获取当前几号,不足10补0
                return m+"/"+d
                return (1900+ y)+"-"+m+"-"+d; 
            };
//获取随机数组1   randomArr(iAll,iNow)  在iAll个数中随机获取iNow个数
function randomArr(){
    function randomArr(iAll,iNow){
                    var arr=[];
                    var newArr=[];
                    for(var i=0;i<iAll;i++){
                        arr.push(i)
                    }
                    
                    for(var i=0;i<iNow;i++){
                        newArr.push( arr.splice(  Math.floor(Math.random(0,1)*arr.length) , 1 ) )
                    }
                    
                    return newArr
                }
}

//获取随机数组1   randomArr(iAll,iNow)  在iAll个数中随机分批获取iNow个数  把每批的数组放到一个新的arr中  就是分批   批数iAll/iNow
// 类似于这样的 randomArr(10,2)    arr1=[1,2,3,4,5,6,7,8,9,10]   arrResult=[ [1,2] ,[3,4], [5,6], [7,8],[9,10] ]

function randomArr1(iAll,iNow){
                    var arr=[];
                    var arrAll=[];
                    for(var i=0;i<iAll;i++){
                        arr.push(i)
                    }
                    
                    //  iNow是iAll的1/10  iAll/iNow ---> 10
                    for(var j=0;j < iAll/iNow; j++ ){  
                          var newArr=[];
                          for(var i=0;i<iNow;i++){
                                newArr.push( arr.splice(  Math.floor(Math.random(0,1)*arr.length) , 1 ) )
                            }
                        arrAll.push(newArr)
                    }
                    //把arr的内容分批放到arrAll中,各批放到newSrr中
                    
                    
                    return arrAll 
                }


// h5 获取某个点的像素的color
            function getXY(obj,x,y){
                var w=obj.width;
                var h=obj.height;
                var d=obj.data;
                
                var color=[];
                color[0]= d[ (w*y+x)*4 ];
                color[1]= d[ (w*y+x)*4+1 ];
                color[2]= d[ (w*y+x)*4+2 ];
                color[3]= d[ (w*y+x)*4+3 ];
      
                return color;
            }
            
//h5 设置某个点的像素的color
function setXY(obj,x,y,color){
    var w=obj.width;
    var h=obj.height;
    var d=obj.data;
    
    d[ (w*y+x)*4 ] = color[0] ;
    d[ (w*y+x)*4+1 ] = color[1]  ;
    d[ (w*y+x)*4+2 ] = color[2] ;
    d[ (w*y+x)*4+3 ] = color[3] ;
    
}

//碰撞检测
function pz(obj1,obj2){
        var L1 = obj1.offsetLeft;
        var R1 = obj1.offsetLeft + obj1.offsetWidth;
        var T1 = obj1.offsetTop;
        var B1 = obj1.offsetTop + obj1.offsetHeight;
        
        var L2 = obj2.offsetLeft;
        var R2 = obj2.offsetLeft + obj2.offsetWidth;
        var T2 = obj2.offsetTop;
        var B2 = obj2.offsetTop + obj2.offsetHeight;
        
        if( R1<L2 || L1>R2 || B1<T2 || T1>B2 ){
            return false;
        }
        else{
            return true;
        }
}

 

小蜜蜂游戏

标签:

原文地址:http://www.cnblogs.com/webskill/p/4417751.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!