所有分类
  • 所有分类
  • 后端开发
实现坦克大战游戏:将 JS 文件分离并绘制敌人坦克

实现坦克大战游戏:将 JS 文件分离并绘制敌人坦克

在上一篇文章中我们已经画出了自己的坦克,并且可以控制自己的坦克移动,我们继续接着上一篇来实现我们的坦克大战游戏吧。画敌人坦克的时候再新建立一个function仿照自己的坦克类再写一遍不就好了吗。坦克大战.html既然我们的坦克和敌人的坦克都

一、概述我们的坦克大战游戏

上次那个能开坦克乱跑的游戏是不是很好玩?那咱们今天就换个玩法试试这个坦克大战呗~想想看,驾驶着自己的坦克,跟敌人斗智斗勇,最终赢得胜利的那份成就感和激动,真的是让人热血沸腾!

//定义一个Hero类(后面还要改进)  
//x表示坦克的横坐标  
//y表示纵坐标  
//direct表示方向  
function Hero(x,y,direct){  
    this.x=x;  
    this.y=y;  
    this.speed=1;  
    this.direct=direct;  
    //上移  
    this.moveUp=function(){  
        this.y-=this.speed;  
        this.direct=0;  
    }  
    //右移  
    this.moveRight=function(){  
        this.x+=this.speed;  
        this.direct=1;  
    }  
    //下移  
    this.moveDown=function(){  
        this.y+=this.speed;  
        this.direct=2;  
    }  
    //左移  
    this.moveLeft=function(){  
        this.x-=this.speed;  
        this.direct=3;  
    }  
}  
  
    //绘制坦克  
function drawTank(tank){  
    //考虑方向  
    switch(tank.direct){  
        case 0:     //向上  
        case 2:     //向下  
            //设置颜色  
            cxt.fillStyle="#BA9658";  
            //左边的矩形  
            cxt.fillRect(tank.x,tank.y,5,30);  
            //右边的矩形  
            cxt.fillRect(tank.x+17,tank.y,5,30);  
            //画中间的矩形  
            cxt.fillRect(tank.x+6,tank.y+5,10,20);  
            //画出坦克的盖子  
            cxt.fillStyle="#FEF26E";  
            cxt.arc(tank.x+11,tank.y+15,5,0,Math.PI*2,true);  
            cxt.fill();  
            //画出炮筒  
            cxt.strokeStyle="#FEF26E";  
            cxt.lineWidth=1.5;  
            cxt.beginPath();  
            cxt.moveTo(tank.x+11,tank.y+15);  
            if(tank.direct==0){         //只是炮筒的方向不同  
                cxt.lineTo(tank.x+11,tank.y);  
            }else{  
                cxt.lineTo(tank.x+11,tank.y+30);  
            }  
            cxt.closePath();  
            cxt.stroke();  
            break;  
        case 1:  
        case 3:  
            //设置颜色  
            cxt.fillStyle="#BA9658";  
            //上边的矩形  
            cxt.fillRect(tank.x-4,tank.y+4,30,5);  
            //下边的矩形  
            cxt.fillRect(tank.x-4,tank.y+17+4,30,5);  
            //画中间的矩形  
            cxt.fillRect(tank.x+5-4,tank.y+6+4,20,10);  
            //画出坦克的盖子  
            cxt.fillStyle="#FEF26E";  
            cxt.arc(tank.x+15-4,tank.y+11+4,5,0,Math.PI*2,true);  
            cxt.fill();  
            //画出炮筒  
            cxt.strokeStyle="#FEF26E";  
            cxt.lineWidth=1.5;  
            cxt.beginPath();  
            cxt.moveTo(tank.x+15-4,tank.y+11+4);  
            if(tank.direct==1){         //只是炮筒的方向不同  
                cxt.lineTo(tank.x+30-4,tank.y+11+4);  
            }else{  
                cxt.lineTo(tank.x-4,tank.y+11+4);  
            }  
            cxt.closePath();  
            cxt.stroke();  
            break;    
    }  
      
}

二、将JS文件分离出来

//画出坦克的盖子  
cxt.fillStyle="#FEF26E";  
cxt.arc(tank.x+15-4,tank.y+11+4,5,0,360,true);  
cxt.fill();

首先,咱们得把画坦克的那段JS代码挪到新的文件里头。这样HTML文件看起来会更整洁,以后管理起来也方便多了。再说了,这也是面向对象编程的一个小技巧,可以让代码更清晰明了。

实现坦克大战游戏:将 JS 文件分离并绘制敌人坦克

三、感谢Mark_Lee的提醒

上次咱们造那坦克盖子形状有点怪,不够顺眼。好在有Mark_Lee提醒,我们找出问题换了个新的。看看,现在好看多了,真像那回事儿!

  
  
  
  
  
  

html5-坦克大战

//得到画布 var canvas1 = document.getElementById("tankMap"); //得到绘图上下文 var cxt = canvas1.getContext("2d"); //我的tank //规定0向上、1向右、2向下、3向左 var hero = new Hero(40,40,0); drawTank(hero); //接收用户按键的函数 function getCommand(){ var code = event.keyCode; //键盘上字幕的ASCII码 switch(code){ case 87: hero.moveUp(); break; case 68: hero.moveRight(); break; case 83: hero.moveDown(); break; case 65: hero.moveLeft(); break; } //把画布清理 cxt.clearRect(0,0,400,300); //重新绘制 drawTank(hero); }

四、绘制敌人的坦克

画坦克看起来挺容易?其实还有点儿挑战!涂个色就能搞定吗?老实讲,真没什么用处。咱们得找找坦克的共性,那才能画出自家的坦克大战对手。

五、使用面向对象的思想

就算JavaScript不是标准面向对象语言,但照样能玩转面对面编程。那个“物体冒充原理”咋回事儿?说白了,就是让一个东西偷偷学别人的招数,这样你就能同时操控自家和敌方的坦克。

六、绘制坦克的drawTank函数

知道了我方和敌人的坦克是啥类型后,还得调画坦克的dearTank吗?别担心这不用操心。这个函数就是用来画我们或对手的坦克哒,统统拿来用就对了!

function  classA(color){  
  this.color = color;  
  this.show = function(){alert(this.color);}  
}  
/* 
   Note: 
     1> this 代表的是classA函数所构建的对象,而非函数classA对象本身这样说主要是为了避免(function is object)的影响; 
     2> 在构建classA对象时,是通过this来初始化的属性和方法的,如果用classB的this去冒充classA的this,那么就实现了简单的继承了 
*/

七、创建坦克对象

咱们这儿有敌我双方的坦克,快让他们开始行动!想象一下,它们在战场上互相追逐,开火射击,多刺激!

八、让坦克发子弹

//定义一个Tank类(基类)  
function Tank(x,y,direct,color){  
    this.x=x;  
    this.y=y;  
    this.speed=1;  
    this.direct=direct;  
    this.color=color;  
    //上移  
    this.moveUp=function(){  
        this.y-=this.speed;  
        this.direct=0;  
    }  
    //右移  
    this.moveRight=function(){  
        this.x+=this.speed;  
        this.direct=1;  
    }  
    //下移  
    this.moveDown=function(){  
        this.y+=this.speed;  
        this.direct=2;  
    }  
    //左移  
    this.moveLeft=function(){  
        this.x-=this.speed;  
        this.direct=3;  
    }  
}  
  
//定义一个Hero类  
function Hero(x,y,direct,color){  
    //下面两句话的作用是通过对象冒充达到继承的效果  
    this.tank=Tank;  
    this.tank(x,y,direct,color);  
}  
  
//定义一个EnemyTank类  
function EnemyTank(x,y,direct,color){  
    this.tank=Tank;  
    this.tank(x,y,direct,color);  
}

我家的坦克就是个打酱油的,还不能发炮。下次我告诉你怎么让它砰砰响起来,想想都刺激,按个按钮,一颗导弹飕地飞过去,敌方坦克瞬间爆炸,那感觉太爽了!

总结:

大战炮弹坦克的日子来了!虽然还没完善,但是每次改进不都是往好地方走。你们咋想的?要不要来点儿漂移技能,还是能跟飞机对打,或者有趣点的地图设计?赶快留言给我!别忘了点赞!

//我的tank  
//规定0向上、1向右、2向下、3向左  
var hero=new Hero(40,40,0,heroColor);  
//敌人的tank  
var enemyTanks=new Array();  
for(var i=0;i<3;i++){  
    var enemyTank = new EnemyTank((i+1)*50,0,2,enemyColor);  
    enemyTanks[i]=enemyTank;      
}

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

评论0

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