0


Html5版飞机大战游戏中(Boss战)制作

内容在“60行代码,制作飞机大战游戏”的基础上,继续追加入了Boss战的功能。

boss的血量默认设置为100了,可以二次开发调整……(^_^)

玩起来有一定难度哈。 试玩地址:点击试玩

实现功能

  1. 添加玩家飞机,并进行控制
  2. Boss能够左右移动
  3. Boss发射三种子弹
  4. 子弹击中玩家飞机
  5. 子弹击中Boss,血量计算

项目源码:http://pro.youyu001.com

待优化的功能

1)内存优化,子弹图片需要回收

(随着子弹数量增多,计算量一直增大,会卡死,设备发热,

想拼机器性能可以长时间运行试试)

2)血条的制作

(根据血量数值,控制血条图片宽度)

3)激光与玩家飞机的碰撞

(激光所在的区域范围,这里不能去)

代码说明

1)通过帧频计算时间相关

定义两个变量,用于记录帧频

  1. var fireSpeed1 = 30;//boss发射子弹的间隔帧数
  2. var fireSpeedSub1 = 0;//记录发射子弹后的帧数

在帧频函数中,执行下面代码。每0.5秒发射一次子弹

  1. //boss定时发射子弹(方式1)
  2. if(fireSpeedSub1 >= fireSpeed1) {
  3. boss_fire1();//发射子弹
  4. fireSpeedSub1 = 0;
  5. }
  6. fireSpeedSub1 ++;

2)发射多个子弹并控制

定义存放子弹图片的数组

  1. var bulletList = [];//boss子弹存放在这个数组

当发射子弹时,将子弹图片push到数组中

  1. function boss_fire1() {
  2. var bullet = new PIXI.Sprite.fromImage("res/bullet/img_bullet_17.png");
  3. bullet.anchor.set(0.5);//设置锚点为中心
  4. app.stage.addChild(bullet);
  5. bulletList.push(bullet);
  6. bullet.x = boss.x;
  7. bullet.y = boss.y;
  8. }

给子弹图片添加更多的属性,这样在子弹移动时可以做到差异化。(Javascript的特性)

  1. bullet.speedR = 0.1; //利用javascript对象的特性,临时记录下子弹旋转速度
  2. bullet.speedY = 3; //利用javascript对象的特性,临时记录下子弹y方向的速度

在帧频函数中,让bulletList数组中的子弹进行移动

  1. //boss子弹移动
  2. for(var i = 0; i < bulletList.length; i ++) {
  3. var bullet = bulletList[i];
  4. bullet.y += bullet.speedY;
  5. if(bullet.speedX) { //判断如果子弹有x方向速度,则进行横向移动
  6. bullet.x += bullet.speedX;
  7. }
  8. if(bullet.speedR) { //判断如果子弹有旋转速度,则进行旋转
  9. bullet.rotation += bullet.speedR;//自转
  10. }
  11. }

完整代码

  1. <body></body>
  2. <script src="pixi.js"></script>
  3. <script>
  4. //####### boss战 帧频控制 数组循环
  5. //散发子弹
  6. //1、boss左右移动
  7. //2、间隔一段时间发射子弹(两种子弹:直线、散弹)
  8. //3、利用数组循环处理多子弹
  9. //4、计算血量
  10. //创建应用
  11. var app = new PIXI.Application(512,768);
  12. document.body.appendChild(app.view);
  13. app.view.style.height = "100%";
  14. //添加背景
  15. var bg = new PIXI.Sprite.fromImage("res/bg/img_bg_level_3.jpg");
  16. app.stage.addChild(bg);
  17. //创建飞机图片
  18. var plane = new PIXI.Sprite.fromImage("res/plane_blue_01.png");
  19. app.stage.addChild(plane); //将图片放置到舞台
  20. plane.anchor.x = 0.5; //设置图片锚点为图片中心
  21. plane.anchor.y = 0.5;
  22. plane.x = 200; //设置图片的位置
  23. plane.y = 600;
  24. var planeBullet = new PIXI.Sprite.fromImage("res/bullet/img_bullet_13.png");
  25. app.stage.addChild(planeBullet);
  26. planeBullet.anchor.x = 0.5; //设置飞机图片锚点为图片中心
  27. planeBullet.anchor.y = 0.5;
  28. bg.interactive = true;//背景图片允许接受控制信息
  29. bg.on("pointermove", movePlane); //滑动控制
  30. function movePlane(event) {
  31. var pos = event.data.getLocalPosition(app.stage); //获取鼠标当前位置
  32. plane.x = pos.x;
  33. plane.y = pos.y;
  34. }
  35. //创建boss图片
  36. var boss = new PIXI.Sprite.fromImage("res/plane/main/img_plane_boss_12.png");
  37. app.stage.addChild(boss); //将图片放置到舞台
  38. boss.anchor.x = 0.5; //设置图片锚点为图片中心
  39. boss.anchor.y = 0.5;
  40. boss.x = 300; //设置图片的位置
  41. boss.y = 150;
  42. //Boss血量
  43. var bossHp = 100;
  44. var bossHpTxt = new PIXI.Text("Boss HP:" + bossHp);
  45. app.stage.addChild(bossHpTxt); //将文本添加到舞台
  46. var bossSpeed = 2;//boss左右移动速度
  47. var isGameOver = false; //是否游戏结束
  48. app.ticker.add(animate); //指定帧频函数
  49. function animate() {
  50. if(isGameOver == true) { //如果游戏结束,则不执行下面动画
  51. return;
  52. }
  53. //背景移动
  54. bg.y += 2;
  55. if(bg.y >= 0) {
  56. bg.y = -768;
  57. }
  58. //子弹移动
  59. planeBullet.y -= 40;
  60. if(planeBullet.y < -50) {
  61. planeBullet.x = plane.x;
  62. planeBullet.y = plane.y;
  63. }
  64. //击中Boss判断
  65. var pos = (planeBullet.x - boss.x) * (planeBullet.x - boss.x) + (planeBullet.y - boss.y) * (planeBullet.y - boss.y);
  66. if(pos < 100 * 100) {
  67. planeBullet.x = plane.x;
  68. planeBullet.y = plane.y;
  69. //boss -hp
  70. bossHp --;
  71. bossHpTxt.text = "Boss HP:" + bossHp;
  72. if(bossHp <= 0) {
  73. isGameOver = true;
  74. //通关
  75. if (confirm("Success!, restart?")==true){
  76. window.location.reload();
  77. }
  78. }
  79. }
  80. //boss左右移动
  81. boss.x += bossSpeed;
  82. if(boss.x > 400) {
  83. bossSpeed = -2;
  84. }
  85. if(boss.x < 100) {
  86. bossSpeed = 2;
  87. }
  88. //boss定时发射子弹(方式1)
  89. if(fireSpeedSub1 >= fireSpeed1) {
  90. boss_fire1();//发射子弹
  91. fireSpeedSub1 = 0;
  92. }
  93. fireSpeedSub1 ++;
  94. //boss定时发射子弹(方式2)
  95. if(fireSpeedSub2 >= fireSpeed2) {
  96. boss_fire2();//发射子弹
  97. fireSpeedSub2 = 0;
  98. }
  99. fireSpeedSub2 ++;
  100. //boss定时发射子弹(方式3)
  101. if(fireSpeedSub3 >= fireSpeed3) {
  102. boss_fire3();//发射子弹
  103. fireSpeedSub3 = 0;
  104. }
  105. fireSpeedSub3 ++;
  106. //如果激光已经发射
  107. if(bulletLeft.visible == true) {
  108. if(fire3TimeSub >= fire3Time) {
  109. bulletLeft.visible = false;
  110. bulletRight.visible = false;
  111. fire3TimeSub = 0;
  112. }
  113. fire3TimeSub ++;
  114. }
  115. //boss子弹移动
  116. for(var i = 0; i < bulletList.length; i ++) {
  117. var bullet = bulletList[i];
  118. bullet.y += bullet.speedY;
  119. if(bullet.speedX) { //判断如果子弹有x方向速度,则进行横向移动
  120. bullet.x += bullet.speedX;
  121. }
  122. if(bullet.speedR) { //判断如果子弹有旋转速度,则进行旋转
  123. bullet.rotation += bullet.speedR;//自转
  124. }
  125. }
  126. //碰撞子弹Game Over
  127. for(var i = 0; i < bulletList.length; i ++) {
  128. var bullet = bulletList[i];
  129. var pos = (bullet.x - plane.x) * (bullet.x - plane.x) + (bullet.y - plane.y) * (bullet.y - plane.y);
  130. if(pos < 30 * 30) { //这里调小一点,变的更简单
  131. //游戏结束标记
  132. isGameOver = true;
  133. //是否重玩
  134. if (confirm("Game Over, restart?")==true){
  135. window.location.reload();
  136. }
  137. }
  138. }
  139. }
  140. var bulletList = [];//boss子弹存放在这个数组
  141. //子弹1
  142. var fireSpeed1 = 30;//boss发射子弹的间隔帧数
  143. var fireSpeedSub1 = 0;//记录发射子弹后的帧数
  144. //boss子弹发射方式1
  145. function boss_fire1() {
  146. var bullet = new PIXI.Sprite.fromImage("res/bullet/img_bullet_17.png");
  147. bullet.anchor.set(0.5);//设置锚点为中心
  148. app.stage.addChild(bullet);
  149. bulletList.push(bullet);
  150. bullet.x = boss.x;
  151. bullet.y = boss.y;
  152. bullet.speedR = 0.1; //利用javascript对象的特性,临时记录下子弹旋转速度
  153. bullet.speedY = 3; //利用javascript对象的特性,临时记录下子弹y方向的速度
  154. var bullet = new PIXI.Sprite.fromImage("res/bullet/img_bullet_17.png");
  155. bullet.anchor.set(0.5);//设置锚点为中心
  156. app.stage.addChild(bullet);
  157. bulletList.push(bullet);
  158. bullet.x = boss.x;
  159. bullet.y = boss.y;
  160. bullet.speedX = 1; //利用javascript对象的特性,临时记录下子弹x方向的速度
  161. bullet.speedR = 0.1; //利用javascript对象的特性,临时记录下子弹旋转速度
  162. bullet.speedY = 3; //利用javascript对象的特性,临时记录下子弹y方向的速度
  163. var bullet = new PIXI.Sprite.fromImage("res/bullet/img_bullet_17.png");
  164. bullet.anchor.set(0.5);//设置锚点为中心
  165. app.stage.addChild(bullet);
  166. bulletList.push(bullet);
  167. bullet.x = boss.x;
  168. bullet.y = boss.y;
  169. bullet.speedX = -1; //利用javascript对象的特性,临时记录下子弹x方向的速度
  170. bullet.speedR = 0.1; //利用javascript对象的特性,临时记录下子弹旋转速度
  171. bullet.speedY = 3; //利用javascript对象的特性,临时记录下子弹y方向的速度
  172. }
  173. //boss子弹发射方式2
  174. var fireSpeed2 = 60;//boss发射子弹的间隔帧数
  175. var fireSpeedSub2 = 0;//记录发射子弹后的帧数
  176. function boss_fire2() {
  177. var bullet = new PIXI.Sprite.fromImage("res/bullet/img_bullet_15.png");
  178. bullet.anchor.set(0.5);//设置锚点为中心
  179. bullet.rotation = Math.PI;
  180. app.stage.addChild(bullet);
  181. bulletList.push(bullet);
  182. bullet.x = boss.x + 100;
  183. bullet.y = boss.y + 60;
  184. bullet.speedY = 8; //利用javascript对象的特性,临时记录下子弹y方向的速度
  185. var bullet = new PIXI.Sprite.fromImage("res/bullet/img_bullet_15.png");
  186. bullet.anchor.set(0.5);//设置锚点为中心
  187. bullet.rotation = Math.PI;
  188. app.stage.addChild(bullet);
  189. bulletList.push(bullet);
  190. bullet.x = boss.x - 100;
  191. bullet.y = boss.y + 60;
  192. bullet.speedY = 8; //利用javascript对象的特性,临时记录下子弹y方向的速度
  193. }
  194. //boss子弹发射方式3 激光
  195. var fireSpeed3 = 600;//boss发射子弹的间隔帧数
  196. var fireSpeedSub3 = 0;//记录发射子弹后的帧数
  197. var fire3Time = 300;//激光发射时长
  198. var fire3TimeSub = 0;//记录激光发射后的帧数
  199. var bulletLeft = new PIXI.Sprite.fromImage("res/bullet/img_bullet_laser_01.png");
  200. bulletLeft.anchor.x = 0.5;//设置锚点为中心
  201. bulletLeft.anchor.y = 1;//设置锚点为中心
  202. bulletLeft.scale.x = 2;
  203. bulletLeft.scale.y = 2;
  204. bulletLeft.rotation = Math.PI;
  205. boss.addChild(bulletLeft); //添加到boss图片上
  206. bulletLeft.x = 180;
  207. //隐藏激光图片
  208. bulletLeft.visible = false;
  209. var bulletRight = new PIXI.Sprite.fromImage("res/bullet/img_bullet_laser_01.png");
  210. bulletRight.anchor.x = 0.5;//设置锚点为中心
  211. bulletRight.anchor.y = 1;//设置锚点为中心
  212. bulletRight.scale.x = 2;
  213. bulletRight.scale.y = 2;
  214. bulletRight.rotation = Math.PI;
  215. boss.addChild(bulletRight); //添加到boss图片上
  216. bulletRight.x = -180;
  217. //隐藏激光图片
  218. bulletRight.visible = false;
  219. function boss_fire3() {
  220. bulletRight.visible = true;
  221. bulletLeft.visible = true;
  222. }
  223. </script>

本文转载自: https://blog.csdn.net/fujian87232/article/details/129745342
版权归原作者 弹了个球 所有, 如有侵权,请联系我们删除。

“Html5版飞机大战游戏中(Boss战)制作”的评论:

还没有评论