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

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

May 16, 2016 pm 03:48 PM


复制代码
代码如下:

tank.html
登录后复制
 <br> <br> <br><meta charset="utf-8"> <br> <br> <br><h1 id="hmtl-经典的坦克大战">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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用视口元标记来控制移动设备上的页面缩放? 如何使用视口元标记来控制移动设备上的页面缩放? Mar 13, 2025 pm 08:00 PM

本文讨论了使用视口元标记来控制移动设备上的页面缩放,重点是宽度和初始尺度之类的设置,以获得最佳响应和性能。

如何使用HTML5和JavaScript创建互动游戏? 如何使用HTML5和JavaScript创建互动游戏? Mar 10, 2025 pm 06:34 PM

本文使用JavaScript详细介绍了创建Interactive HTML5游戏。 它涵盖了游戏设计,HTML结构,CSS样式,JavaScript逻辑(包括事件处理和动画)以及音频集成。 必需的JavaScript库(Phaser,Pi

如何将HTML5表单用于用户输入? 如何将HTML5表单用于用户输入? Mar 10, 2025 pm 02:59 PM

本文解释了如何创建和验证HTML5表格。 它详细介绍了&gt;元素,输入类型(文本,电子邮件,编号等)和属性(必需,模式,最小,最大)。 HTML5的优势比旧方法形成

如何将音频添加到我的HTML5网站上? 如何将音频添加到我的HTML5网站上? Mar 10, 2025 pm 03:01 PM

本文解释了如何使用&lt; audio&gt;元素,包括用于格式选择的最佳实践(MP3,OGG Vorbis),文件优化和JavaScript控件用于播放。 它强调使用多个音频f

如何使用HTML5页面可见性API检测页面何时可见? 如何使用HTML5页面可见性API检测页面何时可见? Mar 13, 2025 pm 07:51 PM

本文讨论了使用HTML5页面可见性API来检测页面可见性,提高用户体验并优化资源使用情况。关键方面包括暂停媒体,减少CPU负载以及基于可见性变化管理分析。

如何使用地理位置API处理用户位置隐私和权限? 如何使用地理位置API处理用户位置隐私和权限? Mar 18, 2025 pm 02:16 PM

本文讨论了使用GeOlocation API管理用户位置隐私和权限,并强调要求权限,确保数据安全性并遵守隐私法律的最佳实践。

如何将HTML5拖放API用于交互式用户界面? 如何将HTML5拖放API用于交互式用户界面? Mar 18, 2025 pm 02:17 PM

本文介绍了如何使用HTML5拖放API来创建交互式用户界面,详细介绍了使元素可拖动的步骤,处理关键事件并通过自定义反馈来增强用户体验。它还讨论了一个常见的陷阱

如何使用HTML5 Websockets API进行客户端和服务器之间的双向通信? 如何使用HTML5 Websockets API进行客户端和服务器之间的双向通信? Mar 12, 2025 pm 03:20 PM

本文解释了HTML5 Websockets API,用于实时双向客户服务器通信。 它详细详细介绍了客户端(JavaScript)和服务器端(Python/Flask)的实现,以应对可伸缩性,状态管理,一个挑战

See all articles