首页 >web前端 >H5教程 >HTML5实现经典坦克大战坦克乱走还能发出一个子弹_html5教程技巧

HTML5实现经典坦克大战坦克乱走还能发出一个子弹_html5教程技巧

WBOY
WBOY原创
2016-05-16 15:48:462438浏览

复制代码
代码如下:

tank.html
 <br> <br> <br><meta charset="utf-8"> <br> <br> <br><h1>hmtl5-经典的坦克大战</h1> <br><!--坦克大战的战场--> <br><canvas id="tankMap" width="400px" height="300px" style="background-color:black"></canvas> <br><span id="aa">数据</span> <br><!--把tankGames.js引入到本页面--> <br><script type="text/javascript" src="tank.js"></script> <br><script type="text/javascript"> <br />//得到画布 <br />var canvas1=document.getElementById("tankMap"); <br />//得到绘图上下文(你可以理解是画笔) <br />var cxt=canvas1.getContext("2d"); <br />//我的坦克 hero <br />//方向 <br />var hero=new Hero(140,140,0,heroColor); <br />//定义一颗空子弹 <br />var heroBullet=null; <br />//定义敌人的坦克(敌人的坦克有多少? 思路 : 是单个单个的定义,还是放在数组中?) <br />var enemyTanks=new Array(); <br />//先死后活 ,定3个,后面我们把敌人坦克的数量,作出变量 <br />//0->上, 1->右, 2->下 3->左 <br />for(var i=0;i<3;i++){ <br />//创建一个坦克 <br />var enemyTank=new EnemyTank((i+1)*50,0,2,enmeyColor); <br />//把这个坦克放入数组 <br />enemyTanks[i]=enemyTank; <br />} <br />//先调用一次 <br />flashTankMap(); <br />//专门写一个函数,用于定时刷新我们的作战区,把要在作战区出现的元素(自己坦克,敌人坦克,子弹,炸弹, <br />//障碍物...)->游戏思想 <br />function flashTankMap(){ <br />//把画布清理 <br />cxt.clearRect(0,0,400,300); <br />//我的坦克 <br />drawTank(hero); <br />//画出自己的子弹 <br />//子弹飞效果是怎么出现的?[答 : 首先我们应该每隔一定时间(setInterval)就去刷新作战区,如果在刷新的时候,子弹坐标变换了,给人的感觉就是子弹在飞!] <br />drawHeroBullet(); <br />//敌人的坦克 <br />//画出所有敌人坦克 <br />for(var i=0;i<3;i++){ <br />drawTank(enemyTanks[i]); <br />} <br />} <br />//这是一个接受用户按键函数 <br />function getCommand(){ <br />//我怎么知道,玩家按下的是什么键 <br />//说明当按下键后 事件--->event对象----->事件处理函数() <br />var code=event.keyCode;//对应字母的ascii码->我们看码表 <br />switch(code){ <br />case 87://上 <br />hero.moveUp(); <br />break; <br />case 68: <br />hero.moveRight(); <br />break; <br />case 83: <br />hero.moveDown(); <br />break; <br />case 65: <br />hero.moveLeft(); <br />break; <br />case 74: <br />hero.shotEnemy(); <br />break; <br />} <br />//触发这个函数 flashTankMap(); <br />flashTankMap(); <br />//重新绘制所有的敌人的坦克.你可以在这里写代码(思想,我们干脆些一个函数,专门用于定时刷新我们的画布[作战区]) <br />} <br />//每隔100毫秒去刷新一次作战区 <br />window.setInterval("flashTankMap()",100); <br /></script> <br> <br>



tank.js

复制代码
代码如下:

 
<pre name="code" class="javascript">//为了编程方便,我们定义两个颜色数组 <br>var heroColor=new Array("#BA9658","#FEF26E"); <br>var enmeyColor=new Array("#00A2B5","#00FEFE"); <br>//其它的敌人坦克,这里的扩展性,还是不错的. <br>//子弹类 <br>function Bullet(x,y,direct,speed){ <br>this.x=x; <br>this.y=y; <br>this.direct=direct; <br>this.speed=speed; <br>this.timer=null; <br>this.isLive=true; <br>this.run=function run(){ <br>//在该表这个子弹的坐标时,我们先判断子弹是否已经到边界 <br>if(this.x=400||this.y=300){ <br>//子弹要停止. <br>window.clearInterval(this.timer); <br>//子弹死亡 <br>this.isLive=false; <br>}else{ <br>//这个可以去修改坐标 <br>switch(this.direct){ <br>case 0: <br>this.y-=this.speed; <br>break; <br>case 1: <br>this.x+=this.speed; <br>break; <br>case 2: <br>this.y+=this.speed; <br>break; <br>case 3: <br>this.x-=this.speed; <br>break; <br>} <br>} <br>document.getElementById("aa").innerText="子弹x="+this.x+" 子弹y="+this.y; <br>} <br>} <br>//这是一个Tank类 <br>function Tank(x,y,direct,color){ <br>this.x=x; <br>this.y=y; <br>this.speed=1; <br>this.direct=direct; <br>//一个坦克,需要两个颜色. <br>this.color=color; <br>//上移 <br>this.moveUp=function(){ <br>this.y-=this.speed; <br>this.direct=0; <br>} <br>//向右 <br>this.moveRight=function(){ <br>this.x+=this.speed; <br>this.direct=1; <br>} <br>//下移 <br>this.moveDown=function(){ <br>this.y+=this.speed; <br>this.direct=2; <br>} <br>//左 <br>this.moveLeft=function(){ <br>this.x-=this.speed; <br>this.direct=3; <br>} <br>} <br>//定义一个Hero类 <br>//x 表示坦克的 横坐标, y 表示纵坐标, direct 方向 <br>function Hero(x,y,direct,color){ <br>//下面两句话的作用是通过对象冒充,达到继承的效果 <br>this.tank=Tank; <br>this.tank(x,y,direct,color); <br>//增加一个函数,射击敌人坦克. <br>this.shotEnemy=function(){ <br>//创建子弹, 子弹的位置应该和hero有关系,并且和hero的方向有关.!!! <br>//this.x 就是当前hero的横坐标,这里我们简单的处理(细化) <br>switch(this.direct){ <br>case 0: <br>heroBullet=new Bullet(this.x+9,this.y,this.direct,1); <br>break; <br>case 1: <br>heroBullet=new Bullet(this.x+30,this.y+9,this.direct,1); <br>break; <br>case 2: <br>heroBullet=new Bullet(this.x+9,this.y+30,this.direct,1); <br>break; <br>case 3: //右 <br>heroBullet=new Bullet(this.x,this.y+9,this.direct,1); <br>break; <br>} <br>//调用我们的子弹run, 50 是老师多次测试得到的一个结论. <br>var timer=window.setInterval("heroBullet.run()",50); <br>//把这个timer赋给这个子弹(js对象是引用传递!) <br>heroBullet.timer=timer; <br>} <br>} <br>//定义一个EnemyTank类 <br>function EnemyTank (x,y,direct,color){ <br>//也通过对象冒充,来继承Tank <br>this.tank=Tank; <br>this.tank(x,y,direct,color); <br>} <br>//画出自己的子弹,多说一句,你也可以把该函数封装到Hero类中 <br>function drawHeroBullet(){ <br>//这里,我们加入了一句话,但是要知道这里加,是需要对整个程序有把握 <br>if(heroBullet!=null&&heroBullet.isLive){ <br>cxt.fillStyle="#FEF26E"; <br>cxt.fillRect(heroBullet.x,heroBullet.y,2,2); <br>} <br>} <br>//绘制坦克 <br>function drawTank(tank){ <br>//考虑方向 <br>switch(tank.direct){ <br>case 0: //上 <br>case 2:// 下 <br>//画出自己的坦克,使用前面的绘图技术 <br>//设置颜色 <br>cxt.fillStyle=tank.color[0]; <br>//韩老师使用 先死--->后活 (初学者最好用这个方法) <br>//先画出左面的矩形 <br>cxt.fillRect(tank.x,tank.y,5,30); <br>//画出右边的矩形(这时请大家思路->一定要一个参照点) <br>cxt.fillRect(tank.x+15,tank.y,5,30); <br>//画出中间矩形 <br>cxt.fillRect(tank.x+6,tank.y+5,8,20); <br>//画出坦克的盖子 <br>cxt.fillStyle=tank.color[1]; <br>cxt.arc(tank.x+10,tank.y+15,4,0,360,true); <br>cxt.fill(); <br>//画出炮筒(直线) <br>cxt.strokeStyle=tank.color[1]; <br>//设置线条的宽度 <br>cxt.lineWidth=1.5; <br>cxt.beginPath(); <br>cxt.moveTo(tank.x+10,tank.y+15); <br>if(tank.direct==0){ <br>cxt.lineTo(tank.x+10,tank.y); <br>}else if(tank.direct==2){ <br>cxt.lineTo(tank.x+10,tank.y+30); <br>} <br>cxt.closePath(); <br>cxt.stroke(); <br>break; <br>case 1: //右和左 <br>case 3: <br>//画出自己的坦克,使用前面的绘图技术 <br>//设置颜色 <br>cxt.fillStyle=tank.color[0]; <br>//韩老师使用 先死--->后活 (初学者最好用这个方法) <br>//先画出左面的矩形 <br>cxt.fillRect(tank.x,tank.y,30,5); <br>//画出右边的矩形(这时请大家思路->一定要一个参照点) <br>cxt.fillRect(tank.x,tank.y+15,30,5); <br>//画出中间矩形 <br>cxt.fillRect(tank.x+5,tank.y+6,20,8); <br>//画出坦克的盖子 <br>cxt.fillStyle=tank.color[1]; <br>cxt.arc(tank.x+15,tank.y+10,4,0,360,true); <br>cxt.fill(); <br>//画出炮筒(直线) <br>cxt.strokeStyle=tank.color[1]; <br>//设置线条的宽度 <br>cxt.lineWidth=1.5; <br>cxt.beginPath(); <br>cxt.moveTo(tank.x+15,tank.y+10); <br>//向右 <br>if(tank.direct==1){ <br>cxt.lineTo(tank.x+30,tank.y+10); <br>}else if(tank.direct==3){ //向左 <br>cxt.lineTo(tank.x,tank.y+10); <br>} <br>cxt.closePath(); <br>cxt.stroke(); <br>break; <br>} <br>} <br>



 

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn