[知了堂学习笔记]_JS小游戏之打飞机(3)-飞机之间的互相撞击,boss的出现,以及控制boss死亡

我的小飞机和敌军小飞机撞击的效果的实现:

 1 /**
 2  * 定义我的飞机与敌机碰撞的方法:
 3  */
 4 function destoryMyPlane(){
 5     for(var i=0;i<enemyArray.length;i++){//外部先循环遍历一次敌机数组:
 6         var enemyTop1=parseInt(enemyArray[i].enemyPlaneNode.style.top);
 7         var enemyLeft1=parseInt(enemyArray[i].enemyPlaneNode.style.left);
 8         var myPlaneTop=parseInt(myPlane.planeNode.style.top);
 9         var myPlaneLeft=parseInt(myPlane.planeNode.style.left);
10         if(myPlaneLeft>enemyLeft1&&myPlaneLeft<enemyLeft1+64&&myPlaneTop>enemyTop1&&myPlaneTop<enemyTop1+56){
11             playDiv.removeChild(enemyArray[i].enemyPlaneNode);
12             enemyArray.splice(i,1);
13             //myPlane
14             myPlane.blood=myPlane.blood-1;
15         }
16     }
17 }

敌军boss

1 boss类的声明

 1 /**
 2  * 定义敌方boss飞机的类
 3  * @param bossSrc
 4  * @param speed
 5  * @param x
 6  * @param y
 7  * @param blood
 8  */
 9 function createEnemyBoss(bossSrc,speed,x,y,blood){
10     this.bossSrc=bossSrc;
11     this.x=x;
12     this.y=y;
13     this.speed=speed;
14     this.blood=blood;
15     this.bossState=false;
16     this.dieTime=10;
17     this.bossNode=document.createElement("img");
18     this.create=function(){
19         this.bossNode.src=this.bossSrc;
20         this.bossNode.style.position="absolute";
21         this.bossNode.style.left=this.x+"px";
22         this.bossNode.style.top=this.y+"px";
23         playDiv.appendChild(this.bossNode);
24     }
25     this.move=function(){
26         if(bossLeft==false){
27             this.bossNode.style.left=parseInt(this.bossNode.style.left)-this.speed+"px";
28         }else{
29            this.bossNode.style.left=parseInt(this.bossNode.style.left)+this.speed+"px";
30         }
31         if(bossTop==false){
32             this.bossNode.style.top=parseInt(this.bossNode.style.top)-this.speed+"px";
33         }else{
34             this.bossNode.style.top=parseInt(this.bossNode.style.top)+this.speed+"px";
35         }
36     }
37     this.bossShot=function(){
38         if(bossArray.length<=1){
39             bossBulletArray.push(new createBossBullet("image/enemyBullet2.gif",parseInt(bossArray[0].bossNode.style.left)+80,parseInt(bossArray[0].bossNode.style.top)+80,10));
40         }
41     }
42     this.create();
43     this.move();
44 }

2 控制boss在屏幕上的出现

  这里可以声明一个boss数组,将创建出的boss方法到数组中,通过判断数组的长度,可以自定义屏幕上可以出现的boss的个数。

1 /**
2  * 定义敌方boss飞机出现的方法
3  */
4 function bossShow(){
5     if(bossArray.length<1){
6         var bossObj=new createEnemyBoss("image/enemy22.gif",5,200,200,10);
7         bossArray.push(bossObj);
8     }
9 }

3 控制boss 的移动

  在控制boss在屏幕上移动的时候,通过一个开关,控制boss移动的方法,并且可以控制boss不跑出界面。

 1 /**
 2  * 控制敌方boss飞机移动的方法
 3  */
 4 function bossMove(){
 5     for(i=0;i<bossArray.length;i++){
 6         if(parseInt(bossArray[i].bossNode.style.left)<10){
 7             bossLeft=true;
 8         }else if((parseInt(bossArray[i].bossNode.style.left)>353)){
 9             bossLeft=false;
10         }
11         if(parseInt(bossArray[i].bossNode.style.top)>400){
12             bossTop=false;
13         }else if(parseInt(bossArray[i].bossNode.style.top)<0){
14             bossTop=true;
15         }
16         bossArray[i].move();
17     }
18 }

4 控制boss发子弹

  为了控制boss子弹的发射间隔,我们定义了一个类似于控制子弹发射间隔时间的变量controlBossBullet=0。

  我们在使用setInterval方法发射子弹的时候,每次给controlBossBullet这个变量加1,

  当这个变量大于10的时候,执行一次boss的射击方法。同样的,这个子弹也会放入到一个数组中,这里放入在调用bossShot()方法的时候就将子弹放入了boss子弹的数组。

 1 function bossShot(){
 2     //控制boss发子弹的方法
 3     if(controlBossBullet>10){
 4         for(i=0;i<bossArray.length;i++) {
 5             bossArray[i].bossShot();
 6         }
 7         controlBossBullet=0;
 8     }
 9     controlBossBullet=controlBossBullet+1;
10 }

5 控制boss飞机子弹的移动

1 /**
2  * 控制boss的子弹的移动方法
3  */
4 function bossBulletMove(){
5     for(i=0;i<bossBulletArray.length;i++){
6         bossBulletArray[i].move();
7     }
8 }

6 控制boss飞机子弹打击我的小飞机

 1 /**
 2  * 定义敌机boss子弹与我的飞机碰撞的方法:
 3  */
 4 function enemyBossBulletCrashMyPlane(){
 5     for(i=0;i<bossBulletArray.length;i++) {//先循环一遍boss飞机子弹的数组
 6         //bossBulletNode
 7         bossBulletLeft=parseInt(bossBulletArray[i].bossBulletNode.style.left);
 8         bossBulletTop=parseInt(bossBulletArray[i].bossBulletNode.style.top);
 9         //console.log("boss飞机子弹的top:"+bossBulletTop);
10         myPlaneLeft=parseInt(myPlane.planeNode.style.left);
11         myPlaneTop=parseInt(myPlane.planeNode.style.top);
12         if(bossBulletLeft>myPlaneLeft&&bossBulletLeft<myPlaneLeft+50&&bossBulletTop>myPlaneTop&&bossBulletTop<myPlaneTop+50){
13             playDiv.removeChild(bossBulletArray[i].bossBulletNode);
14             bossBulletArray.splice(i,1);
15             myPlane.blood=myPlane.blood-1;
16         }
17     }
18 }

7 动画效果的实现

1 setBossShow=setInterval(bossShow,10000);//创建敌方boss的定时器
2 setBossMove=setInterval(bossMove,100);// 控制boss 移动的定时器
3 setbossShot=setInterval(bossShot,100);//控制boss 发射子弹的方法
4 setBoseBulletMove=setInterval(bossBulletMove,100);//控制boss子弹移动的方法
5 setEnemyBossBulletCrashMyPlane=setInterval(enemyBossBulletCrashMyPlane,100);//控制我的飞机的子弹与敌机boss碰撞的方法

敌军boss 的死亡

  通过setInterval方法循环调用方法,控制子弹打击boss,然后boss的血量减少,当减少为0的时候,boss消失。

  计时器调用方法:

  setDestroyEnemyBoss=setInterval(destroyEnemyBoss,1000);//控制我的飞机的子弹与敌机boss撞击的方法

 1 /**
 2  * 当我的子弹打到boss的时候,控制boss的血量消失,并且
 3  */
 4 function destroyEnemyBoss(){
 5     for(i=0;i<bossArray.length;i++){
 6         for(j=0;j<myPlane.bulletArray.length;j++){
 7             myPlaneBulletLeft=parseInt(myPlane.bulletArray[j].bulletNode.style.left);
 8             myPlaneBulletTop=parseInt(myPlane.bulletArray[j].bulletNode.style.top);
 9             bossTop=parseInt(bossArray[i].bossNode.style.top);
10             bossLeft=parseInt(bossArray[i].bossNode.style.left);
11             if(myPlaneBulletLeft>bossLeft&&myPlaneBulletLeft<bossLeft+150&&myPlaneBulletTop<bossTop+150&&myPlaneBulletTop>bossTop){
12                 bossArray[i].blood--;
13                 console.log("boss飞机的血量:"+bossArray[i].blood);
14                 for(a=0;a<bossArray.length;a++){
15                     if(bossArray[a].blood<=0){
16                         playDiv.removeChild(bossArray[a].bossNode);
17                         bossArray.splice(a,1);
18                         score=score+100;
19                         kill=kill+1;
20                     }
21                 }
22                 playDiv.removeChild(myPlane.bulletArray[j].bulletNode);
23                 myPlane.bulletArray.splice(j,1);
24             }
25         }
26     }
27 }

最后整个JS打飞机的连载就结束了,希望看到的小伙伴能够有自己的收获。

时间: 2024-10-10 17:13:37

[知了堂学习笔记]_JS小游戏之打飞机(3)-飞机之间的互相撞击,boss的出现,以及控制boss死亡的相关文章

知了堂学习笔记-微信小程序框架

开发者文档:https://mp.weixin.qq.com/debug/wxadoc/dev/framework/MINA.html 一.文件结构 小程序包含一个描述整体程序的app和多个描述各自页面的page. 一个小程序主题部分由三个文件组成,必须放在项目的根目录, 如下: app.js                   必填               小程序逻辑 app.json                必填              小程序公共设置 app.wxss    

[知了堂学习笔记]_纯JS制作《飞机大战》游戏_第1讲(实现思路与游戏界面的实现)

整体效果展示: 一.实现思路 如图,这是我完成该项目的一个逻辑图,也是一个功能模块完成的顺序图. 游戏界面的完成 英雄飞机对象实现,在实现发射子弹方法过程中,又引出了子弹对象并实现.在此时,英雄飞机能进行基本操作了. 敌机对象的实现,并且初步完成了boos出现(30s自动出现).然后又引出了许多方法的处理,如英雄子弹击中敌机和boos,英雄与敌机相撞等等.并一一解决. 随后又设置了一些游戏的参数,如血量,关卡数,等级,积分,必杀,道具对象等等. 最后又完成了一些辅助功能,暂停游戏,继续游戏,退出

[知了堂学习笔记]_用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)

一.查找素材: 二.分析游戏界面框架: 登录界面.游戏界面.暂停游戏界面.玩家死亡后弹出界面:并对应的界面包含什么元素: 三.分别搭建以上四个界面: 1.登录界面与游戏界面框架(隐藏游戏界面,四个界面的宽度和高度要一致): HTML代码: <!--main div是游戏界面的大DIV --> <div id="main" style="height: 643px;"> <!--玩家头像DIV--> <div id="

[知了堂学习笔记]_用JS制作《飞机大作战》游戏_第2讲(四大界面之间的跳转与玩家飞机的移动)

一.通过点击按钮事件,实现四大界面之间的跳转: (一)跳转的思路: 1.打开软件,只显示登录界面(隐藏游戏界面.暂停界面.玩家死亡界面) 2.点击微信登录(QQ登录)跳转到游戏界面,隐藏登录界面 3.点击暂停,弹出具有透明度的暂停界面 4.点击暂停界面的开始按钮,隐藏暂停界面,调用开始方法(点击登录跳转的方法): 5.点击暂停界面的退出游戏,只显示登录界面,隐藏其他界面: 6.游戏结束界面,该界面的跳转目前还不能通过游戏实现,可以先建设(根据上一讲的游戏界面图片制作). 7.点击游戏结束界面的开

[知了堂学习笔记]_纯JS制作《飞机大战》游戏_第3讲(逻辑方法的实现)

整体展示: 上一讲实现了诸多对象,这次我们就需要实现许多逻辑方法,如控制飞机移动,判断子弹击中敌机,敌机与英雄飞机相撞等等.并且我们在实现这些功能的时候需要计时器去调用这些方法.setInterval(fun,ms) 在调用setInterval()会返回一个类似id的字段,该字段在clearInterval(id)可以指定相应的计时器并清除 一.开始游戏 /** * 面板441*632 * 飞机 66*80 */ /** * 开始游戏 */ function startGame() { var

【知了堂学习笔记】java 接口与抽象类

本次主角:抽象类 .接口. 对于皮皮潇这样一类的Java初学者来说,接口和抽象类如果不去花大量的精力与时间是很难弄清楚的,而我也是在最近这周的项目学习中感觉到了我对这两个概念不熟悉,所以导致对一些问题不能理解清楚,然后就去查阅资料对抽象类与接口做了一些总结. 1.抽象类: 抽象类的建立,实在抽象方法之后的,所以想要了解抽象类得先了解抽象方法,抽象方法由名字可以知道它是一种特殊的方法,是抽象的,只有方法的声明,没有具体的实现.所以不能看到它的功能,表现得就很抽象. 抽象方法必须要用abstract

[知了堂学习笔记]_初始化顺序

在我们每次new一个对象的时候,对象都会被初始化,但是他们初始化的顺序又是怎样呢?现在我以存在继承与不存在继承的代码给大家演示. 一.对于没有继承的初始化的顺序(静态变量,静态块.构造函数.变量) package test; //没有继承情况下的代码 public class test5 { //静态变量 private static String st="静态变量"; //静态块 static{ System.out.println(st); System.out.println(&

【知了堂学习笔记】Eclipse,Myeclipse连接MySQL数据库和Oracle数据库

一.连接MySQL数据库 1.由于Eclipse,Myeclipse都没有连接MySQL数据的架包,我们需要自行下载MySQL连接架包 mysql-connector(官方链接:http://dev.mysql.com/downloads/connector/j/5.0.html),下载版本最好是最新版. 2.下载好后,复制到你的项目里任何位置,然后右键架包选择 Build path -> add to Build path,然后点击项目的Libraries里的Referenced Librar

【知了堂学习笔记】java 正则表达式

本文参考网络上面别人的博客知识产出 正则表达式基础 1.句号 假设你想要找出三个字母的单词,而且这些单词必须以"t"字母开头,以"n"字母结束.另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容.要构造出这个正则表达式,你可以使用一个通配符--句点符号".".这样,完整的表达式就是"t.n",它匹配"tan"."ten"."tin"和"ton&qu