首页 > web前端 > H5教程 > 正文

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

php中文网
发布: 2016-05-16 15:48:46
原创
2681人浏览过

复制代码
代码如下:

tank.html
登录后复制
<!DOCTYPE html> <br /><html> <br /><head> <br /><meta charset="utf-8"/> <br /></head> <br /><body onkeydown="getCommand();"> <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 /></body> <br /></html>
登录后复制



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<=0||this.x>=400||this.y<=0||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 />
登录后复制



登录后复制
登录后复制


HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号