HTML-坦克大战-完成子弹连发功能(三)
如题,完成子弹连发功能,上一篇博客遗留的问题,不能够连发,且一直按J键则第一颗子弹会消失;那是因为定义的子弹变量只是一个变量,现在定义成一个数组;在之前的代码上修改如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> </head> <body onkeydown="getCommand()"> <h1>html5-经典的坦克大战</h1> <canvas id="tankeMap" width="500px" height="500px" style="background-color:black"> </canvas> <span id="aa">数据</span> <script type="text/javascript" src="tankeGame.js"></script> <script type="text/javascript"> //准备工作 //得到画布 var canvas1=document.getElementById("tankeMap"); //得到上下文引用对象,你可以理解成画笔 var cxt=canvas1.getContext("2d"); //定义一个坦克 //数字0表示向上 数字1表示右 数字2表示下 数字3表示左 var hero=new Hero(130,130,0,tankeColor); <span style="color:#ff0000;">var heroBullets=new Array();//定义子弹数组</span> //var heroBullet=null; //定义一个敌人的坦克数组对象 var enemyTankes=new Array(); //生成3个敌方坦克 for(var i=0;i<3;i++){ //创建敌人的坦克对象 var enemyTanke=new EnemyTanke((i+1)*50,30,2,enemyColor); enemyTankes[i]=enemyTanke; } //刚进来先刷新画布,并初始化元素 flashMap(); //刷新画布的函数 function flashMap(){ //清除画布的元素,刷新 cxt.clearRect(0,0,500,500); //画自己的坦克 drawTanke(hero); //画自己的子弹 drawHeroBullet(); //画敌人的坦克 for(var i=0;i<3;i++){ drawTanke(enemyTankes[i]); } } //获取键盘的命令的处理的函数 function getCommand(){ var code=event.keyCode; cxt.clearRect(0,0,500,500); switch(code){ case 87://w键 hero.moveUp(); break; case 68://d键 hero.moveRight(); break; case 83://s键 hero.moveDown(); break; case 65://a键 hero.moveLeft(); break; case 74://j键 hero.shotEnemy(); break; } flashMap();//调用上下左右的同时刷新画布 } //每隔100毫秒刷新画布 window.setInterval("flashMap()",100); </script> </body> </html>
tankeGame.js
var tankeColor=new Array("#BA9658","#FEF26E"); var enemyColor=new Array("#00A2B5","#00FEFE"); //坦克的父类 function TanK(x,y,direct,color){ this.x=x; this.y=y; this.direct=direct; this.speed=5; this.color=color; this.moveUp=function(){ this.y-=this.speed; this.direct=0; } this.moveDown=function(){ this.y+=this.speed; this.direct=2; } this.moveRight=function(){ this.x+=this.speed; this.direct=1; } this.moveLeft=function(){ this.x-=this.speed; this.direct=3; } } //子弹类 function Bullet(x,y,direct,speed){ this.x=x; this.y=y; this.direct=direct; this.speed=speed; this.timer=null; this.isLive=true; this.run=function run(){ if(this.x<=0||this.x>=500||this.y<=0||this.y>=500){ window.clearInterval(this.timer); this.isLive=false; }else{ switch(this.direct){ case 0: this.y-=this.speed; break; case 1: this.x+=this.speed; break; case 2: this.y+=this.speed; break; case 3: this.x-=this.speed; break; } } document.getElementById("aa").innerHTML="子弹的x="+this.x+"y="+this.y; } } //定义一个hero类 //x、y表示初始坐标,direct表示方向 function Hero(x,y,direct,color){ this.tanke=TanK; this.tanke(x,y,direct,color); this.shotEnemy=function(){ switch(this.direct){ case 0://上 heroBullet=new Bullet(this.x+9,this.y,this.direct,1); break; case 1://右 heroBullet=new Bullet(this.x+36,this.y+9,this.direct,1); break; case 2://下 heroBullet=new Bullet(this.x+9,this.y+36,this.direct,1); break; case 3://左 heroBullet=new Bullet(this.x-6,this.y+9,this.direct,1); break; } <span style="color:#ff0000;">//将子弹放入到子弹数组中 heroBullets.push(heroBullet); //每隔50毫秒运行每个子弹的run方法 var timer=window.setInterval("heroBullets["+(heroBullets.length-1)+"].run()",50); heroBullets[heroBullets.length-1].timer=timer;</span> } } //定义一个hero类 //x、y表示初始坐标,direct表示方向 function EnemyTanke(x,y,direct,color){ this.tanke=TanK; this.tanke(x,y,direct,color); } var heroBullet=null;//定义子弹变量 //画自己的子弹 function drawHeroBullet(){ <span style="color:#ff0000;">for(var i=0;i<heroBullets.length;i++){ heroBullet=heroBullets[i]; if(heroBullet!=null&&heroBullet.isLive){ cxt.fillStyle="#FEF26E"; cxt.fillRect(heroBullet.x,heroBullet.y,2,2); } }</span> } //把创建坦克的方法封装为一个对象 //该函数可以画自己的坦克,也可以画敌人的坦克 //tanke就是一个对象 function drawTanke(tanke){ //坦克的方向 switch(tanke.direct){ case 0: case 2: {//上 //画出自己的坦克设置颜色 cxt.fillStyle=tanke.color[0]; cxt.fillRect(tanke.x,tanke.y,5,30);//左齿轮 cxt.fillRect(tanke.x+15,tanke.y,5,30);//右齿轮 cxt.fillRect(tanke.x+6,tanke.y+5,8,20);//中间的坦克体 //画中间的圆形的炮筒体 cxt.fillStyle=tanke.color[1]; cxt.beginPath(); cxt.arc(tanke.x+10,tanke.y+15,4.5,0,360,false); cxt.closePath(); cxt.fill(); //画出炮筒 cxt.strokeStyle=tanke.color[1]; //cxt.fillStyle="#FFD972"; cxt.lineWidth=1.9; cxt.beginPath(); cxt.moveTo(tanke.x+10,tanke.y+15);//设置点的位置 if(tanke.direct==0){ cxt.lineTo(tanke.x+10,tanke.y-6);//设置第二个点的位置 }else if(tanke.direct==2){ cxt.lineTo(tanke.x+10,tanke.y+36);//设置第二个点的位置 } cxt.closePath(); cxt.stroke(); } break; case 1: case 3: {//右 //画出自己的坦克设置颜色 cxt.fillStyle=tanke.color[0]; cxt.fillRect(tanke.x,tanke.y,30,5);//左齿轮 cxt.fillRect(tanke.x,tanke.y+15,30,5);//右齿轮 cxt.fillRect(tanke.x+5,tanke.y+6,20,8);//中间的坦克体 //画中间的圆形的炮筒体 cxt.fillStyle=tanke.color[1]; cxt.beginPath(); cxt.arc(tanke.x+15,tanke.y+10,4.5,0,360,false); cxt.closePath(); cxt.fill(); //画出炮筒 cxt.strokeStyle=tanke.color[1]; //cxt.fillStyle="#FFD972"; cxt.lineWidth=1.9; cxt.beginPath(); cxt.moveTo(tanke.x+15,tanke.y+10);//设置点的位置 if(tanke.direct==1){//右 cxt.lineTo(tanke.x+36,tanke.y+10);//设置第二个点的位置 }else if(tanke.direct==3){//左 cxt.lineTo(tanke.x-6,tanke.y+10);//设置第二个点的位置 } cxt.closePath(); cxt.stroke(); } break; } }
end!
转载于:https://www.cnblogs.com/YLQBL/p/8426632.html
HTML-坦克大战-完成子弹连发功能(三)相关推荐
- java怎么连发子弹_HTML-坦克大战-完成子弹连发功能(三)
var tankeColor=new Array("#BA9658","#FEF26E");var enemyColor=new Array("#00 ...
- java怎么连发子弹_【Java_项目篇1】--JAVA实现坦克大战游戏--子弹连发+爆炸效果(四)...
前期相关文章 [Java_项目篇<1>]–JAVA实现坦克大战游戏–画出坦克(一) [Java_项目篇<1>]–JAVA实现坦克大战游戏–坦克移动+添加敌方坦克(二) [Jav ...
- Java坦克大战 (四) 之子弹的产生
本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...
- java炮弹_Java坦克大战 (四) 之子弹的产生
在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学完J2SE的小伙伴们一点启示! 坦克大战V0.4实现功能: 1.写一个Missile类,产生一个可运动的子 ...
- 坦克大战python_Python语言学了没用?那只能说你是真的没有精通了Python语言
[文末有福利] Python的热度一直高居不下,运维,自动化测试,后端开发,机器学习...Python的用武之地真的太多了! "人生苦短,我用Python",对于普通职场人士来说, ...
- [ java ] 坦克大战 5.0 ~ 最终完整版
坦克大战5.0 新增功能内容:(加入IO流内容) 防止敌坦克间重叠 击杀数显示 保存上局游戏进度–>两种开局方式 加入开局音乐 修复记录文件丢失后的异常 5.0版本为最终版 提示:爆炸图片需自行 ...
- JAVA坦克大战改进(二)
坦克大战预期目标 完成功能二和功能三,即 (二)增加关卡,不同关卡的地图难度.敌方坦克数量及玩家生命值都有改变 (三)增加玩家坦克的生命值,如被击中三次才会失败,退出游戏 改进思路: 不同关卡即地图( ...
- C++实现坦克大战(超详细)(文末附源码!!!)
一.成果展示 二.开发环境及工具 C++开发,使用工具为vs2019的community版本,坦克大战需要借助EasyX库来完成坦克大战的图形绘制. 三.游戏规则设定 (1)玩家移动及发射炮弹: 单人 ...
- java坦克加快速度_Java坦克大战 (六) 之增加可玩性
在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学完J2SE的小伙伴们一点启示! 坦克大战V0.6实现功能: 1.超级炮弹 2.我方坦克有生命值 3.图像化 ...
最新文章
- 反弹端口 HTTP代理 HTTP隧道技术
- 如何委婉的表达你的心思?
- Eclipse 部分快捷键
- 图解linux下top命令的使用
- C语言学习之求S=a+aa+aaa+... +aa.....aa之值,其中a是一个数字,n表示a的位数.
- Python用过的小知识备忘录
- http协议报文体_HTTP报文基本概念学习
- 计算机用户被锁定如何解除,win10账户被锁定了怎么解除
- Java学习路线(完整详细版)
- RocketMQ使用mmap - TODO
- jooq生成records_Java 14 Records类
- 【智能司法】可解释的Rationale增强罪名预测系统
- ubuntu 10.04下vmware tools安装和一些应用
- HtmlHelper类在View中替代了纯HTML代码
- Vue后台管理系统模板推荐
- xbee模块和单片机_XBee® ZigBee 模块使用方法
- 微信公众号接口开发--回复消息
- 【JAVA今法修真】 第七章 洞天风云起,索引混乱平
- 门面模式、调停者模式、责任链模式
- 《呼吸法门精要》南师所讲。读后感
热门文章
- SpringData集成Elasticsearch
- 人脸识别 传统Haar与CNN比较
- 手机用python画太阳花的代码_利用python绘制太阳花(蓝桥杯试题)
- 使用AndroidStudio与RN 运行ract-native run-android遇到的那些坑
- 【云原生】DevOps(二):Build工具|Operate工具|Integrate工具 介绍及使用方法
- Fast R-CNN 简单梳理
- 每日一笑 | 不忘初心,最爱扫雷~
- 2022最新Java高级程序员架构师面试题及答案
- fanuc机器人试题_FANUC机器人报警综合汇总
- ios开发证书CSR文件、CER文件、P12文件,mobileprovition许可文件的用途