所有分类
  • 所有分类
  • 后端开发
如何用面向对象思想封装 Bullet 类并让坦克发出子弹

如何用面向对象思想封装 Bullet 类并让坦克发出子弹

再看看我们上面写的代码,原来我们的子弹一旦发出去就不能停止了,虽然跑出了我们的”战场“但是还是在朝一个方向跑,一旦发第二颗子弹第一颗子弹就会由于重新刷新界面没有重绘子弹而消失。坦克大战.html

上次我们已经搞定了敌人和自己的坦克,建好了战争的舞台。接下来,就让这场大戏热闹点儿!首先,得让咱家坦克开火,这样玩着才过瘾。今天,就来看看怎么给坦克装上子弹发射器,让它们在屏幕上打得火热!

子弹的诞生:封装Bullet类

咱们玩儿的那些游戏里面,子弹跟坦克的枪一样重要,是战争胜利的法宝。要想让子弹打得准,咱们得为它量身定做一个”Bullet类”。这类型就是记录子弹的位置、方向、速度和飞行方式啥的。试想你让子弹从坦克炮孔里飞出去,耳边还有风声吼叫,简直不要太刺激!

//子弹类  
function Bullet(x,y,direct,speed){  
    this.x=x;  
    this.y=y;  
    this.speed=speed;  
    this.direct=direct;  
    this.timer=null;  
    this.run=function(){  
        switch(this.direct){  
            case 0:  
                this.y-=this.speed;  
                break;  
            case 1:  
                this.x+=this.speed;  
                break;  
            case 2:  
                this.y+=this.speed;  
                break;  
            case 3:  
                this.x-=this.speed;  
                break;    
        }  
          
    }  
}

装弹上膛:在Hero类中添加shotEnemy方法

//定义一个Hero类  
function Hero(x,y,direct,color){  
    //下面两句话的作用是通过对象冒充达到继承的效果  
    this.tank=Tank;  
    this.tank(x,y,direct,color);  
    //射击敌人函数  
    this.shotEnemy=function(){  
        switch(this.direct){  
            case 0:  
                heroBullet=new Bullet(this.x+10,this.y,this.direct,1);  
                break;  
            case 1:  
                heroBullet=new Bullet(this.x+30-4,this.y+10+4,this.direct,1);  
                break;  
            case 2:  
                heroBullet=new Bullet(this.x+10,this.y+30,this.direct,1);  
                break;  
            case 3:  
                heroBullet=new Bullet(this.x-4,this.y+10+4,this.direct,1);  
                break;  
        }  
        //把这个子弹放入数组中——》push函数  
        //调用我们子弹的run  
        //var timer=window.setInterval("heroBullet.run()",50);  
        //heroBullet.timer=timer;  
        heroBullets.push(heroBullet);  
        var timer=window.setInterval("heroBullets["+(heroBullets.length-1)+"].run()",50);  
        heroBullets[heroBullets.length-1].timer=timer;  
          
    }  
}

要让咱的坦克能开火,得给”Hero类”添个叫shotEnemy的新功能,这就是咱的瞄准器,控制开火时机和方向。然后在键盘监听函数里搞个新事件,比如按一下”J”键,坦克就能开火了。想象一下,你紧张地按下发射键,子弹瞬间飞出,直击敌方坦克,那得多刺激

第一次试射:子弹的问题

case 74: //J  :发子弹  
    hero.shotEnemy();  
    break;

我刚开始玩这个游戏的时候,弹药怎么都不对劲。开火后就像破弦之箭,速度越来越快,肯定有问题呀。找来找去找原因,原来子弹打出去就不会回来,就算离开画面了也一样。这不就跟天上的流星似的么,漂亮但就是抓不到。

解决问题:给子弹添加isLive状态

为了防止子弹乱飞,我们给它加了个”isLive”的标识,就表示这颗弹子是不是在咱的游戏里?只要弹子跳出边缘,那么这个设定就算作废,跟跳出边界的弹子没两样,失效了。每次界面更新,这些失效的弹子都不用重新画,就能解决子弹速度越来越快的问题

//子弹类  
unction Bullet(x,y,direct,speed){  
this.x=x;  
this.y=y;  
this.speed=speed;  
this.direct=direct;  
this.timer=null;  
this.isLive=true;  
this.run=function(){  
    //判断子弹是否已经到边界了  
    if(this.x=400||this.y=300){  
        //子弹要停止  
        window.clearInterval(this.timer);  
        //子弹死亡  
        this.isLive=false;  
    }else{  
        //可以去修改坐标  
        switch(this.direct){  
            case 0:  
                this.y-=this.speed;  
                break;  
            case 1:  
                this.x+=this.speed;  
                break;  
            case 2:  
                    break;    
        }  
    }  
}

优化代码:添加刷新子弹函数

我们给游戏添了刷新子弹的功能,每隔一秒就检查一下子弹是不是还在“活”着,只要活着就重现出画面,看起更舒服了,玩得更加过瘾!

完整的游戏体验:坦克大战的最终代码

//定时刷新我们的作战区(定时重绘)  
//自己的坦克,敌人坦克,子弹,炸弹,障碍物  
function flashTankMap(){  
    //把画布清理  
    cxt.clearRect(0,0,400,300);  
    //我的坦克  
    drawTank(hero);  
    //我的子弹  
    drawHeroBullet();  
    //敌人的坦克  
    for(var i=0;i<3;i++){  
        drawTank(enemyTanks[i]);  
    }  
}

我们把坦克大战搞得越来越好,大家玩起来超顺手!只要动动手就能控制坦克的大炮消灭敌人,真心过瘾。代码全都摆在这儿,像”tankGame06.js”和”坦克大战.html”这样的文件,就是为了让你们玩得痛快淋漓。

//画出自己的子弹  
function drawHeroBullet(){  
    for(var i=0;i<heroBullets.length;i++){  
        var heroBullet=heroBullets[i];  
        if(heroBullet!=null&&heroBullet.isLive){  
            cxt.fillStyle="#FEF26E";  
            cxt.fillRect(heroBullet.x,heroBullet.y,2,2);  
        }  
    }  
}

邀请玩家:加入这场坦克大战

哥们儿,咱们的坦克大战游戏开始!赶快加入,相信你会被那心跳加速的刺激感所吸引。只需要坐在电脑前,控制坦克瞄准敌人,一枪射出,就能体验真实的刺激战斗快感。别再磨蹭了,马上试玩!

如何用面向对象思想封装 Bullet 类并让坦克发出子弹

原文链接:https://www.icz.com/technicalinformation/web/2024/06/18067.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?