




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 上一篇中我们介绍了关于Canvas的基础知识,用Canvas绘制各种图形和图片,在上一篇的基础上我们来做一个基于HTML5的坦克大战游戏,下面我们开始吧一、用Canvas画出我们的坦克我们设计的坦克结构如下图所示,如果有的朋友有更好的设计,希望分享和交流一下。如上图所示,我们的坦克基本上是由三个矩形和一个圆形一个线段组成,每个部件的尺寸进行了标记,单位为px,下面我们用上一篇中讲到的知识来画出我们的坦克,注意:我们在画坦克的时候应该选择一个参考点,这里我们选择的是坦克的左上角,如图所示。html view plain copy print?1. <!DOC
2、TYPE html> 2. <html> 3. <head> 4. <meta charset="utf-8"/> 5. </head> 6. <body> 7. <h1>html5-坦克大战</h1> 8. <!-坦克大战的战场-> 9. <canvas id=&
3、quot;tankMap" width="400px" height="300px" style="background-color:black"></canvas> 10. <script type="text/javascript"> 11. /得到画布 12. var
4、160;canvas1 = document.getElementById("tankMap"); 13. 14. /定义一个位置变量 15. var heroX = 80; 16. var heroY = 80;
5、160; 17. 18. /得到绘图上下文 19. var cxt = canvas1.getContext("2d"); 20. /设置颜色 21. cxt.fillStyle="#BA9658&q
6、uot; 22. /左边的矩形 23. cxt.fillRect(heroX,heroY,5,30); 24. /右边的矩形 25. cxt.fillRect(heroX+17,heroY,5,30); 26. /画中间的矩形
7、27. cxt.fillRect(heroX+6,heroY+5,10,20); 28. /画出坦克的盖子 29. cxt.fillStyle="#FEF26E" 30. cxt.arc(heroX+11,heroY+15,5,0,360,true); 31. &
8、#160;cxt.fill(); 32. /画出炮筒 33. cxt.strokeStyle="#FEF26E" 34. cxt.lineWidth=1.5; 35. cxt.beginPath(); 36. cxt.moveTo
9、(heroX+11,heroY+15); 37. cxt.lineTo(heroX+11,heroY); 38. cxt.closePath(); 39. cxt.stroke(); 40. 41. 42. </scr
10、ipt> 43. </body> 44. </html> 二、怎么让坦克动起来?在研究怎么让坦克动起来之前,我们先来研究一下怎么让一个小球通过键盘操作使其动起来。首先我们给<body>标签添加一个监听函数html view plain copy print?1. <body onkeydown="test()"> 监听函数html view plain copy p
11、rint?1. /现在按键盘上ASDW移动小球 2. /说明:当我们按下一个键,实际上触发了一个onkeydown事件 3. function test() 4. var code = event.keyCode; /键盘上字幕的ASCII码 5. switch(code) 6. &
12、#160; case 87: 7. ballY-; 8. break; 9. case 68:&
13、#160; 10. ballX+; 11. break; 12. case 83: 13. &
14、#160; ballY+; 14. break; 15. case 65: 16.
15、; ballX-; 17. break; 18. 19. /重新绘制 20. drawBall(); 21. 我们可以在外部定义两个全局的变量
16、分别表示x轴和y轴的坐标,然后通过改变ballX和ballY的值来改变小球的位置,我们用键盘的WDSA键来控制,这样出来的效果非常奇怪,如下图:我们在绘制的时候没有将以前位置的小球擦除掉,在每次重新绘制前应该先擦除一下,下面将全部代码贴出来:html view plain copy print?1. <!DOCTYPE html> 2. <html> 3. <head> 4. <meta charset="utf-8"
17、/> 5. </head> 6. <!-当按键后,去调用test-> 7. <body onkeydown="test()"> 8. <h1>小球上下左右移动</h1> 9. <canvas id="test" width="400px" height="300px" style=&qu
18、ot;background-color:black"> 10. </canvas> 11. <script type="text/javascript"> 12. 13. /得到画布 14. var canvas1 = document.getElementById("test&q
19、uot;); 15. 16. /定义一个位置变量 17. var ballX = 80; 18. var ballY = 80; 19. 20.
20、60; /得到绘图上下文 21. var cxt = canvas1.getContext("2d"); 22. drawBall(); 23. function drawBall() 24.
21、0;/画出一个红色的圆球 25. cxt.beginPath(); /要注意闭合路径 26. cxt.fillStyle="#FF0000" 27. cxt.arc(ballX,ballY,10,0,36
22、0,true); 28. cxt.closePath(); 29. cxt.fill(); 30. 31. 32. /现在按键盘上ASDW移动小球
23、160; 33. /说明:当我们按下一个键,实际上触发了一个onkeydown事件 34. function test() 35. var code = event.keyCode; /键盘上字幕的ASCII码 36. &
24、#160; switch(code) 37. case 87: 38. ballY-; 39.
25、; break; 40. case 68: 41. ballX+; &
26、#160;42. break; 43. case 83: 44.
27、 ballY+; 45. break; 46. case 65: 47.
28、0; ballX-; 48. break; 49. 50.
29、60; /把画布清理 51. cxt.clearRect(0,0,400,300); 52. /重新绘制 53. drawBall(); 54.
30、0; 55. </script> 56. </body> 57. </html> 三、让我们的坦克动起来我们的坦克如果只是朝一个方向移动的话就非常容易了,只要将上面代码中的画小球改成画坦克就OK了,在让坦克移动之前我们首先应该考虑的是怎么让坦克绕着自己的中心朝各个方向转动的问题。好的,再将上面的图贴出来分析一下。详细的计算过程我就不啰嗦了,想必大家的数学都很好,按照上图的比例计算好各个组件的坐标和位置,旋转后坦克画法如下:html view plain copy&
31、#160;print?1. /设置颜色 2. cxt.fillStyle="#BA9658" 3. /上边的矩形 4. cxt.fillRect(tank.x-4,tank.y+4,30,5); 5. /下边的矩形 6. cxt.fillRect(tank.x-4,tank.y+17+4,30,5); 7. /画中间的矩形 8. cxt.fillRect(tank.x+5-4,tank.y+6+4,20,10);
32、; 9. /画出坦克的盖子 10. cxt.fillStyle="#FEF26E" 11. cxt.arc(tank.x+15-4,tank.y+11+4,5,0,360,true); 12. cxt.fill(); 13. /画出炮筒 14. cxt.strokeStyle="#FEF26E" 15. cxt.lineWidth=1.5; 16. cxt.beginPath();
33、 17. cxt.moveTo(tank.x+15-4,tank.y+11+4); 18. if(tank.direct=1) /只是炮筒的方向不同 19. cxt.lineTo(tank.x+30-4,tank.y+11+4); 20. else 21. cxt.lineTo(tank.x-4,t
34、ank.y+11+4); 22. 23. cxt.closePath(); 24. cxt.stroke(); 好了现在我们发现坦克朝向左边和右边仅仅只有炮筒的方向不同,同理朝向上边和下边也仅仅只有炮筒的方向不同,这时候我们可以将四个方向分为两种情况,再在各个小情况中做处理。同时用OO的思想将代码进行了封装,代码如下:html view plain copy print?1. <!DOCTYPE html> 2. <html&
35、gt; 3. <head> 4. <meta charset="utf-8"/> 5. </head> 6. <body onkeydown="getCommand();"> 7. <h1>html5-坦克大战</h1> 8. <!-坦克大战的战场-> 9. <canvas id=&q
36、uot;tankMap" width="400px" height="300px" style="background-color:black"></canvas> 10. <script type="text/javascript"> 11. /定义一个Hero类(后面还要改进) 12.
37、; /x表示坦克的横坐标 13. /y表示纵坐标 14. /direct表示方向 15. function Hero(x,y,direct) 16. this.x=x; 17.
38、160; this.y=y; 18. this.speed=1; 19. this.direct=direct; 20. /上移 21.
39、160; this.moveUp=function() 22. this.y-=this.speed; 23. this.direct=0; 24. &
40、#160; 25. /右移 26. this.moveRight=function() 27. this.x+=this.speed; 28.
41、0; this.direct=1; 29. 30. /下移 31. this.moveDown=function(
42、) 32. this.y+=this.speed; 33. this.direct=2; 34. 35.
43、0; /左移 36. this.moveLeft=function() 37. this.x-=this.speed; 38.
44、 this.direct=3; 39. 40. 41. 42. 43. /得到画布 44. var canvas1 = document.get
45、ElementById("tankMap"); 45. /得到绘图上下文 46. var cxt = canvas1.getContext("2d"); 47. 48. /我的tank 49.
46、0; /规定0向上、1向右、2向下、3向左 50. var hero = new Hero(40,40,0); 51. drawTank(hero); 52. /绘制坦克 53. function drawTank(tank) 54. &
47、#160; /考虑方向 55. switch(tank.direct) 56. case 0: /向上 57.
48、0; case 2: /向下 58. /设置颜色 59.
49、 cxt.fillStyle="#BA9658" 60. /左边的矩形 61. cxt.fil
50、lRect(tank.x,tank.y,5,30); 62. /右边的矩形 63. cxt.fillRect(tank.x+17,tank.y,5,30);
51、160;64. /画中间的矩形 65. cxt.fillRect(tank.x+6,tank.y+5,10,20); 66.
52、; /画出坦克的盖子 67. cxt.fillStyle="#FEF26E" 68.
53、0; cxt.arc(tank.x+11,tank.y+15,5,0,360,true); 69. cxt.fill(); 70.
54、60; /画出炮筒 71. cxt.strokeStyle="#FEF26E" 72. cxt.lineWidth=1.5;
55、60; 73. cxt.beginPath(); 74. cxt.moveTo(tank.x+11,tank.y+15); 75.
56、60; if(tank.direct=0) /只是炮筒的方向不同 76. cx
57、t.lineTo(tank.x+11,tank.y); 77. else 78. cxt.lineTo(tank.x+11,
58、tank.y+30); 79. 80. cxt.closePath(); 81.
59、60; cxt.stroke(); 82. break; 83. case 1:
60、 84. case 3: 85. /设置颜色 86. &
61、#160; cxt.fillStyle="#BA9658" 87. /上边的矩形 88. cxt.fillRect(t
62、ank.x-4,tank.y+4,30,5); 89. /下边的矩形 90. cxt.fillRect(tank.x-4,tank.y+17+4,30,5); &
63、#160;91. /画中间的矩形 92. cxt.fillRect(tank.x+5-4,tank.y+6+4,20,10); 93.
64、 /画出坦克的盖子 94. cxt.fillStyle="#FEF26E" 95.
65、; cxt.arc(tank.x+15-4,tank.y+11+4,5,0,360,true); 96. cxt.fill(); 97.
66、 /画出炮筒 98. cxt.strokeStyle="#FEF26E" 99. cxt.lineWidt
67、h=1.5; 100. cxt.beginPath(); 101. cxt.moveTo(tank.x+15-4,tank.y+11+4); 102.
68、 if(tank.direct=1) /只是炮筒的方向不同 103.
69、60; cxt.lineTo(tank.x+30-4,tank.y+11+4); 104. else 105. &
70、#160;cxt.lineTo(tank.x-4,tank.y+11+4); 106. 107. cxt.closePath(); 108.
71、60; cxt.stroke(); 109. break; 110. 111.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兰州信息科技学院《昆虫生态与测报》2023-2024学年第二学期期末试卷
- 南华大学船山学院《中东欧国家概论》2023-2024学年第一学期期末试卷
- 广州铁路职业技术学院《和声2》2023-2024学年第二学期期末试卷
- 2025年-江苏建筑安全员-B证(项目经理)考试题库
- 2025咖啡豆机械采购合同
- 2025资产管理公司借款合同
- 2025设备租赁的合同范本
- 考前准备国际物流师试题及答案
- 2024年CPMM考生重要试题及答案
- 2024年CPMM备考心态与试题及答案
- 《 大学生军事理论教程》全套教学课件
- 中考数学计算题练习100道(2024年中考真题)
- 幼儿园绘本故事:《十二生肖》 课件
- 北师大版生物七年级下册12.2感受器与感觉器官(第1课时)导学案(无答案)
- 最新露天矿山安全培训课件(经典)
- 环境学概论 考验知识点归纳刘陪同
- 室内设计施工图详细说明及制图规范说明ppt(智囊书屋)
- 贵州水城矿业集团马场煤矿“3.12”煤与瓦斯突出事故分析(定)
- 吉林省吉林市高考报名登记表
- 剧本杀_剧本推荐——四人本《暗船》
- 质量保证体系结构图(共3页)
评论
0/150
提交评论