html5 实现坦克大战,HTML5实现坦克大战(一)

2023-11-19

方法:MoveUp:坦克上移

MoveDown:坦克下移

MoveRight:坦克右移

MoveLeft:坦克左移

MyTank extends Tank

EnemeyTank extends Tank

Bullet

Tank

字段:x:

y:

DIR

IsLive:判断子弹是否还存活(包括过界和击中目标)

方法    drawBullet():在canvas上画出子弹

run() 让子弹飞

1

2

3

4

5

6

7

8 var EnemeyTankColor = new Array("#61D2F1", "#8A4A6E");

9 var MyTankColor = new Array("green", "blue");

10 var tank = null;

11

12

13 function Tank(x,y,dir,color){

14 this.x = x;

15 this.y = y;

16 this.dir = dir; //0代表向上 1代表向右 2代表向下 3代表向左

17 this.speed = 1;

18 this.color = color;

19 this.MoveUp = function () {

20 this.y -= this.speed;

21 this.dir = 0;

22 //DrawTank(this);

23 };

24 this.MoveRight = function () {

25 this.x += this.speed;

26 this.dir = 1;

27 //DrawTank(this);

28 };

29

30 this.MoveDown = function () {

31 this.y += this.speed;

32 this.dir = 2;

33 //DrawTank(this);

34 };

35

36 this.MoveLeft = function () {

37 this.x -= this.speed;

38 this.dir = 3;

39 //DrawTank(this);

40 };

41 //alert(this.dir);

42 this.bullet = new Array(new Bullet(this.x, this.y, this.dir));

43 }

44

45 function MyTank(x, y, dir,color) {

46 this.tank = Tank;

47 this.tank(x,y,dir,color);

48 }

49

50 function EnemeyTank(x,y,dir,color)

51 {

52 this.tank = Tank;

53 this.tank(x, y, dir,color);

54 }

55

56 function Bullet(x,y,dir)

57 {

58 var bullet = new Object;

59 bullet.x = x;

60 bullet.y = y;

61 bullet.dir = dir;

62 bullet.isLive = true;

63 bullet.timer = null;

64 bullet.drawBullet = function () {

65 if (bullet.isLive == true)

66 {

67 var canvas = document.getElementById("cantank");

68 var ctx = canvas.getContext("2d");

69 ctx.fillStyle = "red";

70 //ctx.clearRect(bullet.x,bullet.y,3,3);

71 switch (bullet.dir) {

72 case 0: ctx.fillRect(bullet.x, bullet.y - 35, 3, 3); break;

73 case 1: ctx.fillRect(bullet.x + 35, bullet.y, 3, 3); break;

74 case 2: ctx.fillRect(bullet.x, bullet.y + 35, 3, 3); break;

75 case 3: ctx.fillRect(bullet.x - 35, bullet.y, 3, 3); break;

76 }

77 }

78 }

79

80 bullet.run = function () {

81 //alert("run");

82

83

84 if (bullet.x < 35 || bullet.x > 600 || bullet.y < 35 || bullet.y > 600)

85 {

86 //clearInterval(bullet.timer);

87 //bullet.x = tank.x;

88 //bullet.y = tank.y;

89 //bullet.dir = tank.dir;

90 bullet.isLive = false;

91 } else {

92 switch (bullet.dir) {

93 case 0: bullet.y=bullet.y-2; break;

94 case 1: bullet.x=bullet.x+2; break;

95 case 2: bullet.y=bullet.y+2; break;

96 case 3: bullet.x=bullet.x-2; break;

97 }

98 }

99

100 $("#span1").html("x="+bullet.x+" "+"y="+bullet.y);

101 }

102 return bullet;

103 }

104

105 //画出坦克对象

106 function DrawTank(tank) {

107 var canTank = document.getElementById("cantank");

108 var ctx = canTank.getContext("2d");

109 var dir = tank.dir;

110 switch(dir){

111 case 0:

112 case 2:

113

114 //画出坦克的左边的轮子

115 ctx.fillStyle = tank.color[0];

116 ctx.fillRect(tank.x-25, tank.y-25, 10, 50);

117

118 //画出坦克的中间的机箱

119 ctx.fillRect(tank.x -15, tank.y - 15, 30, 30);

120

121 //画出坦克的右边的轮子

122 ctx.fillRect(tank.x + 15, tank.y-25, 10, 50);

123 ctx.fillStyle = tank.color[1];

124

125 //画出坦克的盖子

126 ctx.beginPath();

127 ctx.arc(tank.x, tank.y, 15, 0, 360, false);

128 ctx.closePath();

129 ctx.fill();

130 ctx.closePath();

131

132 //画出坦克的炮筒

133 ctx.beginPath();

134 ctx.moveTo(tank.x, tank.y);

135 if (tank.dir == 0)

136 {

137 ctx.lineTo(tank.x, tank.y-30);

138 }

139 else if (tank.dir == 2)

140 {

141 ctx.lineTo(tank.x,tank.y+30);

142 }

143 ctx.closePath();

144 ctx.lineWidth = "2";

145 ctx.strokeStyle = "yellow";

146 ctx.stroke();

147 break;

148 case 1:

149 case 3:

150 //画出坦克的上边的轮子

151 ctx.fillStyle = tank.color[0];

152 ctx.fillRect(tank.x-25, tank.y-25, 50, 10);

153

154 //画出坦克的中间的机箱

155 ctx.fillRect(tank.x -15, tank.y - 15, 30, 30);

156

157 //画出坦克的下边的轮子

158 ctx.fillRect(tank.x - 25, tank.y+15, 50, 10);

159 ctx.fillStyle = tank.color[1];

160

161 //画出坦克的盖子

162 ctx.beginPath();

163 ctx.arc(tank.x, tank.y, 15, 0, 360, false);

164 ctx.closePath();

165 ctx.fill();

166 ctx.closePath();

167

168 //画出坦克的炮筒

169 ctx.beginPath();

170 ctx.moveTo(tank.x, tank.y);

171 if (tank.dir == 1) {

172 ctx.lineTo(tank.x + 30, tank.y );

173 }

174 else if (tank.dir == 3) {

175 ctx.lineTo(tank.x -30, tank.y );

176 }

177 ctx.closePath();

178 ctx.lineWidth = "2";

179 ctx.strokeStyle = "yellow";

180 ctx.stroke();

181 break;

182 }

183

184 };

185

186 //刷新坦克和子弹的位置

187 function Refresh(mytank, enemeytanks) {

188 DrawTank(mytank);

189 //if (mytank.bullet.isLive == true)

190 //{

191 // mytank.bullet.drawBullet();

192 //}

193

194 for (var i = 0; i < mytank.bullet.length; i++)

195 {

196 mytank.bullet[i].drawBullet();

197 }

198 for(var i=0;i<3;i++)

199 {

200 DrawTank(enemeytanks[i]);

201

202 //for (var i = 0; i < enemeytanks[i].bullet.length; i++) {

203 // enemeytanks[i].bullet[i].drawBullet();

204 //}

205 }

206 }

207

208 //画出静态的坦克

209 //注意要使用相对位置,即相对坦克的左上角的位置的变化,这样之后才能使坦克动起来

210 $(function () {

211

212 //先得到canvas对象和画笔对象

213 var canvas = document.getElementById("cantank");

214 var ctx = canvas.getContext("2d");

215

216 //新建自己的坦克

217 var X = 30;

218 var Y = 30;

219 tank = new MyTank(500,500,0,MyTankColor);

220 //新建敌人的坦克

221 var EnemeyTanks = new Array();

222 for (var i = 0; i < 3; i++)

223 {

224 var enemeyTank = new EnemeyTank((i + 1) * 80, 80, 2, EnemeyTankColor);

225 EnemeyTanks[i] = enemeyTank;

226 }

227 //当页面加载完成的时候先画出坦克

228 Refresh(tank, EnemeyTanks);

229

230 $("body").keydown(function (event) {

231 var key = event.keyCode;

232 switch (key) {

233 case 87: tank.MoveUp(); break;

234 case 68: tank.MoveRight(); break;

235 case 83: tank.MoveDown();break;

236 case 65: tank.MoveLeft(); break;

237 }

238

239 ctx.clearRect(0, 0, 600, 600);

240

241 Refresh(tank, EnemeyTanks);

242 });

243

244

245 //for (var i = 0; i < EnemeyTanks.length; i++)

246 //{

247 // //定时产生新的子弹

248 // setInterval(function () {

249 // EnemeyTanks[i].bullet[EnemeyTanks[i].bullet.length] = new Bullet(EnemeyTanks[i].x, EnemeyTanks[i].y, EnemeyTanks[i].dir);

250 // Refresh(tank, EnemeyTanks);

251 // }, 500);

252

253 // //定时改变子弹的位置

254 // setInterval(function () {

255 // for (var i = 0; i < EnemeyTanks[i].bullet.length; i++) {

256 // EnemeyTanks[i].bullet[i].run();

257 // ctx.clearRect(0, 0, 600, 600);

258 // Refresh(tank, EnemeyTanks);

259 // }

260 // }, 10);

261 //}

262

263

264 //定时产生新的子弹

265 setInterval(function () {

266 EnemeyTanks[0].bullet[EnemeyTanks[0].bullet.length] = new Bullet(EnemeyTanks[0].x, EnemeyTanks[0].y, EnemeyTanks[0].dir);

267 Refresh(tank, EnemeyTanks);

268 }, 500);

269

270 //定时改变子弹的位置

271 setInterval(function () {

272 for (var i = 0; i < EnemeyTanks[i].bullet.length; i++) {

273 EnemeyTanks[0].bullet[i].run();

274 ctx.clearRect(0, 0, 600, 600);

275 Refresh(tank, EnemeyTanks);

276 }

277 }, 10);

278

279

280

281

282

283 //定时产生新的子弹

284 setInterval(function () {

285 tank.bullet[tank.bullet.length] = new Bullet(tank.x, tank.y, tank.dir);

286 Refresh(tank, EnemeyTanks);

287 }, 500);

288

289 //定时改变子弹的位置

290 setInterval(function () {

291 for (var i = 0; i < tank.bullet.length; i++)

292 {

293 tank.bullet[i].run();

294 ctx.clearRect(0, 0, 600, 600);

295 Refresh(tank, EnemeyTanks);

296 }

297 }, 10);

298

299

300

301 //for (var i = 0; i < tank.bullet.length; i++)

302 //{

303 // setInterval(function () {

304 // tank.bullet[0].run();

305 // ctx.clearRect(0, 0, 600, 600);

306 // Refresh(tank, EnemeyTanks);

307 // }, 50);

308 //}

309

310

311

312 //setInterval(tank.bullet.drawBullet, 100);

313 });

314

315

316

317

318

319

320

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

html5 实现坦克大战,HTML5实现坦克大战(一) 的相关文章

  • QT多线程同步之QWaitcondition

    使用到多线程 无可避免的会遇到同步问题 qt提供几种同步线程的方法 在这里讲一下QWaitcondition的简单使用 一 QWaitcondition 是通过一个线程达到某种条件来唤起另一个线程来实现同步的 mutex lock wait
  • 基于Python的房地产分析平台的设计与实现-爬虫-可视化大屏安装数据分析与可视化计算机毕业设计

    更多项目资源 最下方联系我们 目录 一 项目技术介绍 二 项目配套文档 部分内容 资料获取 一 项目技术介绍 该项目含有源码 文档 PPT 配套开发软件 软件安装教程 项目发布教程 包运行成功以及课程答疑与微信售后交流群 送查重系统不限次数
  • 关于统计变换(CT/MCT/RMCT)算法的学习和实现,也称为局部二进制模式(LBP)

    原文地址 http blog sina com cn s blog 684c8d630100turx html
  • 零基础入门 HTML 的 8 分钟极简教程

    在今天 前端工程师已经成为研发体系中的重要岗位之一 可是与此相对的是 极少大学的计算机专业愿意开设前端课 大部分前端工程师的知识 也都是在实践和工作中不断学习的 最近收到很多同学的后台留言 说希望多推出一些前端方向的教程 今天我们就带来一个
  • Raspberry Pi 3安装配置Raspbian过程

    1 前期准备 硬件 Raspberry Pi 3主板 5V 1A安卓充电器及数据线 Samsung 64GB UHS 1 Class10 TF存储卡 TF卡读卡器 网线 HDMI高清线 可无 支持HDMI输入的显示器 可无 软件 Win32
  • jar包与war包部署的区别及jar包部署的一个路径访问问题

    1 jar包与war包部署的区别 什么是jar包 jar包是类的归档文件 jar文件格式以流行的ZIP文件格式作为基础 和ZIP文件不一样的是 JAR文件不仅仅用来进行压缩和发布 还用来部署和封装库 组件以及插件程序 并且 还能够被像编译器
  • 《Centos7——logstash启动报错》

    logstash启动报错 root localhost systemctl start logstash Failed to start logstash service Unit not found 解决方法 root localhost
  • python入门指南

    python入门指南 python是一门简单易学且功能强大的编程语言 它拥有高效的高级数据结构 并且能够简单而又高效的方式进行面向对象编程 python是一门解释性语言 因为无需编译和链接 在开发中节省时间 使用python解释器 调用py
  • docker容器无法启动, no space left on device

    背景 通过jekens 部署服务 发现部署失败 后通过手动拉取镜像发现直接报错 报错大致意思就是没有剩余可用空间 复现路径 如下操作 启动容器docker start 3ad663158cf6 报错 Error response from
  • Free C, C++ Compilers(免费的C/C++编译器)

    以下内容来源于 http www programmerworld net resources c compiler htm 1 Free Microsoft eMbedded Visual C Microsoft eMbedded Visu
  • 一分钟搞定微信小程序定位(wx.getLocation)功能

    欢迎大家来到我的一分钟系列 跟大家安利一分钟系列主要让大家快速完成一个功能少踩不必要的坑 先完成功能再悟其中的原理 这期主要为大家提供微信小程序的定位功能 换不多说 直接上干货 首先微信官方提供的wx getLocation 应用之后发现这
  • python采集keep运动数据

    我国2009年确立 全民健身日 2012年 广泛开展全民健身运动 写入十八大报告 到2014年上升为国家战略 全民健身的分量越来越重 推动全民健身和全民健康深度融合 通过全民健身实现全民健康 全民健身运动在我国越来越普及 每天清晨和傍晚时分
  • Umi+Dva初印象<基础应用,结构,流转逻辑>

    目录 前言 知识储备 generator函数 Dva初识 实际交互 函数式组件 class组件 前言 项目初始为umi脚手架进行初始化 lt 初始化过程 http t csdn cn cuTaY gt 工程中加载了umi自带的antd ui
  • 记一次开源PR

    提示 不要懒得看英文文档 要认真看别人的贡献文档 否则会浪费更多的时间 开源PR一般流程 1 远程仓库fork 2 你得发现bug或有优化修改 提交到fork的仓库 3 提issue 沟通 4 提PR 5 机器审核 修改问题 6 等待人工审
  • 【微信支付】分享一个失败的项目

    这个项目是去年做的 开始客户还在推广 几个月后发现服务器已经关掉了 这是一个发图片猜谜语的应用 用户猜对了分红包 所得奖金可以提现 开发的时候对需求都不太看好 觉得用户粘性太低了 今天就把所有的程序拿了出来 供有兴趣的伙伴玩耍 用户从公众号
  • C++Primer第三章习题

    3 2 编写一段程序从标准输入中一次读入一整行 然后修改该程序使其一次读入一个词 include
  • UITableViewCell 设置单元格选中后只显示一个打勾的状态

    UITableViewCell 设置单元格选中后只显示一个打勾的状态 2013 06 28 22 28 33 转载 标签 ios tableviewcell it 分类 iOS 今天做个表格 突然发现在选中某行时打勾 再次选中其它行时 上次
  • (最简单详细)关于nginx配置解决页面刷新以后404 Not Found和403 Forbidden

    仔细看我下面所说 每一步都是坑 1 页面刷新404 Not Found 1 问题原因 web单页面开发模式 只有一个index html入口 其他路径是前端路由去跳转的 nginx没有对应这个路径 所以就会报404了 2 解决方法 增加tr
  • Linux中常见目录操作和文件操作命令

    pwd命令 用于查看显示当前所在目录 ls命令 用于显示指定目录中的文件或子目录的信息 cd命令 用于切换当前用户所在的工作目录 其中路径可以是绝对路径 也可以是相对路径 mkdir命令 用于创建目录 rm命令 用于删除文件或目录 touc

随机推荐