<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>
登录后复制