HTML5实现经典坦克大战坦克乱走还能发出一个子弹_html5教程技巧
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>

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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

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

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

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

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

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

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