版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 在上一篇文章中我们已经画出了自己的坦克,并且可以控制自己的坦克移动,我们继续接着上一篇来实现我们的坦克大战游戏吧。一、将JS文件分离出来使用OO的思想,我们已经对坦克进行了封装,对画坦克也进行了封装,下面我们将这两个对象提取到外部的js文件中,文件内容如下:javascriptview plaincopyprint?1. /定义一个Hero类(后面还要改进)2. /x表示坦克的横坐标3. /y表示纵坐标4. /direct表示方向5. functionHero(x,y,direct)6. this.x=x;7. this.y=y;8. this.speed=1;9. this.direct=
2、direct;10. /上移11. this.moveUp=function()12. this.y-=this.speed;13. this.direct=0;14. 15. /右移16. this.moveRight=function()17. this.x+=this.speed;18. this.direct=1;19. 20. /下移21. this.moveDown=function()22. this.y+=this.speed;23. this.direct=2;24. 25. /左移26. this.moveLeft=function()27. this.x-=this.sp
3、eed;28. this.direct=3;29. 30. 31. 32. /绘制坦克33. functiondrawTank(tank)34. /考虑方向35. switch(tank.direct)36. case0:/向上37. case2:/向下38. /设置颜色39. cxt.fillStyle=#BA9658;40. /左边的矩形41. cxt.fillRect(tank.x,tank.y,5,30);42. /右边的矩形43. cxt.fillRect(tank.x+17,tank.y,5,30);44. /画中间的矩形45. cxt.fillRect(tank.x+6,tank
4、.y+5,10,20);46. /画出坦克的盖子47. cxt.fillStyle=#FEF26E;48. cxt.arc(tank.x+11,tank.y+15,5,0,Math.PI*2,true);49. cxt.fill();50. /画出炮筒51. cxt.strokeStyle=#FEF26E;52. cxt.lineWidth=1.5;53. cxt.beginPath();54. cxt.moveTo(tank.x+11,tank.y+15);55. if(tank.direct=0)/只是炮筒的方向不同56. cxt.lineTo(tank.x+11,tank.y);57.
5、else58. cxt.lineTo(tank.x+11,tank.y+30);59. 60. cxt.closePath();61. cxt.stroke();62. break;63. case1:64. case3:65. /设置颜色66. cxt.fillStyle=#BA9658;67. /上边的矩形68. cxt.fillRect(tank.x-4,tank.y+4,30,5);69. /下边的矩形70. cxt.fillRect(tank.x-4,tank.y+17+4,30,5);71. /画中间的矩形72. cxt.fillRect(tank.x+5-4,tank.y+6+4
6、,20,10);73. /画出坦克的盖子74. cxt.fillStyle=#FEF26E;75. cxt.arc(tank.x+15-4,tank.y+11+4,5,0,Math.PI*2,true);76. cxt.fill();77. /画出炮筒78. cxt.strokeStyle=#FEF26E;79. cxt.lineWidth=1.5;80. cxt.beginPath();81. cxt.moveTo(tank.x+15-4,tank.y+11+4);82. if(tank.direct=1)/只是炮筒的方向不同83. cxt.lineTo(tank.x+30-4,tank.y
7、+11+4);84. else85. cxt.lineTo(tank.x-4,tank.y+11+4);86. 87. cxt.closePath();88. cxt.stroke();89. break;90. 91. 92. 在上一篇中有一个小问题,感谢Mark_Lee的提醒。htmlview plaincopyprint?1. /画出坦克的盖子2. cxt.fillStyle=#FEF26E;3. cxt.arc(tank.x+15-4,tank.y+11+4,5,0,360,true);4. cxt.fill();这里画的坦克盖子不是园的,大家可以参考:好了,现在我们的html中的内容
8、就变的清晰多了,html中的内容如下:htmlview plaincopyprint?1. 2. 3. 4. 5. 6. 7. html5-坦克大战8. 9. 10. 11. 12. 13. 14. 15. /得到画布16. varcanvas1=document.getElementById(tankMap);17. /得到绘图上下文18. varcxt=canvas1.getContext(2d);19. 20. /我的tank21. /规定0向上、1向右、2向下、3向左22. varhero=newHero(40,40,0);23. drawTank(hero);24. 25. 26.
9、/接收用户按键的函数27. functiongetCommand()28. varcode=event.keyCode;/键盘上字幕的ASCII码29. switch(code)30. case87:31. hero.moveUp();32. break;33. case68:34. hero.moveRight();35. break;36. case83:37. hero.moveDown();38. break;39. case65:40. hero.moveLeft();41. break;42. 43. /把画布清理44. cxt.clearRect(0,0,400,300);45.
10、 /重新绘制46. drawTank(hero);47. 48. 49. 50. 二、绘制敌人的坦克好多朋友可能现在已经有了思路,这还不简单吗?画敌人坦克的时候再新建立一个function仿照自己的坦克类再写一遍不就好了吗。还有的朋友不同意这个方法,说:既然都是坦克我们就不用写了,直接创建坦克实例不就完了吗。第一个朋友和第二个朋友的做法看似是面向对象其实不是面向对象,在做这种游戏的时候如果我们不用面向对象的思想去实现,也可以实现,但是会很复杂。我们这样考虑一下,自己坦克肯定和敌人坦克有区别,不能归为一类,比如:发的子弹不同,颜色不同等。但是两者又有相同点(都是坦克),我们是不是应该把这部分给抽
11、象出来呢?是的,我们先抽象出来一个Tank类,再分别继承这个Tank类。你开玩笑吧这个不是Java语言,这个是JavaScript脚本语言,哪里来的继承?呵呵,我们可以用javascript中的对象冒充,对象冒充,是JavaScript 和 ECMAScript实现继承的方法,在学习对象冒充实现继承前我们的先了解关键字 this 的使用javascriptview plaincopyprint?1. functionclassA(color)2. this.color=color;3. this.show=function()alert(this.color);4. 5. /*6. Note:
12、7. 1this代表的是classA函数所构建的对象,而非函数classA对象本身这样说主要是为了避免(functionisobject)的影响;8. 2在构建classA对象时,是通过this来初始化的属性和方法的,如果用classB的this去冒充classA的this,那么就实现了简单的继承了9. */对象冒充的原理:函数classA通过this来初始化属性和方法,如果用函数classB的this冒充classA的this去执行,则就会使classB具有classA的属性和方法好了,现在我们用自己的坦克和敌人的坦克对象去冒充一下坦克,呵呵。javascriptview plaincopy
13、print?1. /定义一个Tank类(基类)2. functionTank(x,y,direct,color)3. this.x=x;4. this.y=y;5. this.speed=1;6. this.direct=direct;7. this.color=color;8. /上移9. this.moveUp=function()10. this.y-=this.speed;11. this.direct=0;12. 13. /右移14. this.moveRight=function()15. this.x+=this.speed;16. this.direct=1;17. 18. /
14、下移19. this.moveDown=function()20. this.y+=this.speed;21. this.direct=2;22. 23. /左移24. this.moveLeft=function()25. this.x-=this.speed;26. this.direct=3;27. 28. 29. 30. /定义一个Hero类31. functionHero(x,y,direct,color)32. /下面两句话的作用是通过对象冒充达到继承的效果33. this.tank=Tank;34. this.tank(x,y,direct,color);35. 36. 37.
15、 /定义一个EnemyTank类38. functionEnemyTank(x,y,direct,color)39. this.tank=Tank;40. this.tank(x,y,direct,color);41. 这样我们就将自己的坦克和敌人的坦克定义好了,那么绘制坦克的drawTank(tank)要不要变呢?因为绘制的是Tank所以不需要改动,呵呵,这就是面向对象的多态喽。创建坦克对象吧!htmlview plaincopyprint?1. /我的tank2. /规定0向上、1向右、2向下、3向左3. varhero=newHero(40,40,0,heroColor);4. /敌人的
16、tank5. varenemyTanks=newArray();6. for(vari=0;i3;i+)7. varenemyTank=newEnemyTank(i+1)*50,0,2,enemyColor);8. enemyTanksi=enemyTank;9. 完整代码如下:tankGame05.jsjavascriptview plaincopyprint?1. /为了编程方便,我们定义两个颜色数组2. varheroColor=newArray(#BA9658,#FEF26E);3. varenemyColor=newArray(#00A2B5,#00FEFE);4. 5. /定义一个
17、Tank类(基类)6. functionTank(x,y,direct,color)7. this.x=x;8. this.y=y;9. this.speed=1;10. this.direct=direct;11. this.color=color;12. /上移13. this.moveUp=function()14. this.y-=this.speed;15. this.direct=0;16. 17. /右移18. this.moveRight=function()19. this.x+=this.speed;20. this.direct=1;21. 22. /下移23. this
18、.moveDown=function()24. this.y+=this.speed;25. this.direct=2;26. 27. /左移28. this.moveLeft=function()29. this.x-=this.speed;30. this.direct=3;31. 32. 33. 34. /定义一个Hero类35. functionHero(x,y,direct,color)36. /下面两句话的作用是通过对象冒充达到继承的效果37. this.tank=Tank;38. this.tank(x,y,direct,color);39. 40. 41. /定义一个Enem
19、yTank类42. functionEnemyTank(x,y,direct,color)43. this.tank=Tank;44. this.tank(x,y,direct,color);45. 46. 47. /绘制坦克48. functiondrawTank(tank)49. /考虑方向50. switch(tank.direct)51. case0:/向上52. case2:/向下53. /设置颜色54. cxt.fillStyle=tank.color0;55. /左边的矩形56. cxt.fillRect(tank.x,tank.y,5,30);57. /右边的矩形58. cxt
20、.fillRect(tank.x+17,tank.y,5,30);59. /画中间的矩形60. cxt.fillRect(tank.x+6,tank.y+5,10,20);61. /画出坦克的盖子62. cxt.fillStyle=tank.color1;63. cxt.arc(tank.x+11,tank.y+15,5,0,Math*PI*2,true);64. cxt.fill();65. /画出炮筒66. cxt.strokeStyle=tank.color1;67. cxt.lineWidth=1.5;68. cxt.beginPath();69. cxt.moveTo(tank.x+
21、11,tank.y+15);70. if(tank.direct=0)/只是炮筒的方向不同71. cxt.lineTo(tank.x+11,tank.y);72. else73. cxt.lineTo(tank.x+11,tank.y+30);74. 75. cxt.closePath();76. cxt.stroke();77. break;78. case1:79. case3:80. /设置颜色81. cxt.fillStyle=#BA9658;82. /上边的矩形83. cxt.fillRect(tank.x-4,tank.y+4,30,5);84. /下边的矩形85. cxt.fil
22、lRect(tank.x-4,tank.y+17+4,30,5);86. /画中间的矩形87. cxt.fillRect(tank.x+5-4,tank.y+6+4,20,10);88. /画出坦克的盖子89. cxt.fillStyle=#FEF26E;90. cxt.arc(tank.x+15-4,tank.y+11+4,5,0,Math*PI*2,true);91. cxt.fill();92. /画出炮筒93. cxt.strokeStyle=#FEF26E;94. cxt.lineWidth=1.5;95. cxt.beginPath();96. cxt.moveTo(tank.x+
23、15-4,tank.y+11+4);97. if(tank.direct=1)/只是炮筒的方向不同98. cxt.lineTo(tank.x+30-4,tank.y+11+4);99. else100. cxt.lineTo(tank.x-4,tank.y+11+4);101. 102. cxt.closePath();103. cxt.stroke();104. break;105. 106. 107. 坦克大战.htmlhtmlview plaincopyprint?1. 2. 3. 4. 5. 6. 7. html5-坦克大战8. 9. 10. 11. 12. 13. /得到画布14. varcanvas1=document.getElementById(tankMap);15. /得到绘图上下文16. varcxt=canvas1.getContext(2d);17. 18. /我的tan
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高端数字印刷项目运营管理方案
- 化学品仓储物流项目技术方案
- 检测站年检试题及答案
- 光储充土建施工方案
- 抽水蓄能电站模板安装方案
- 包装饮用水项目巡检保养方案
- LNG加气站管道施工协调方案
- 《既有建筑民俗空间功能定位策划方案》
- 基于LBS的店铺方案课程设计
- Spark日志分析平台部署方案课程设计
- 2026湖北武汉首义科技创新投资发展集团有限公司招聘8人笔试历年备考题库附带答案详解
- (四模)新疆2026年高三普通高考五月适应性文科综合试卷(含答案及解析)
- 邮政寄递活动方案策划(3篇)
- 2026四川宜宾市科教产业投资集团有限公司下属子公司第一批自主招聘33人考试备考题库及答案解析
- 微生物学-第九章-传染与免疫-zh-v7
- 儿童保健三基理论考核试题题库及答案
- 摄影构图(共86张PPT)
- DB33T 988-2022 柔性生态加筋挡土墙设计与施工技术规范
- DB31T 1234-2020 城市森林碳汇计量监测技术规程
- 对外经贸函电课程课件-新Unit-10-Packing
- 导线展放出口张力、牵引力计算表格
评论
0/150
提交评论