Egret学习笔记 (Egret打飞机

Stella981
• 阅读 636

运行起来,虽然主角飞机和敌机都在互相发射子弹,但是子弹打中了就和没打中效果是一样的。。

这一章我们就来处理子弹和飞机的碰撞问题。

我们所有的操作都是基于Main这个容器来做的。所以我就把这个处理放到Main里面,监听Main的_ENTER_FRAME_事件

this.addEventListener(egret.Event.ENTER_FRAME, (e) => {
            //判断子弹是否和飞机碰撞
            let isHit = this._bullets.IsHit(this._Hero)
            // console.log("Hit:" + isHit)

            //判断Enemy是否和主角碰撞


        }, this)

这里面就两个操作,一个是判断主角子弹是否击中敌机,敌机子弹是否击中主角,因为是判断子弹是否打中飞机,那么我们就在子弹的工厂类_BulletFactory.ts_里面做这个检测操作

public IsHit(e: egret.DisplayObjectContainer): boolean {

        let arr = EnemyFactory.Init().GetIsUsePlane(); //1.从敌机对象池中取出已经在使用的飞机

        let isHit = false;
        let hitevent = new HitEvent(HitEvent.EventString);
        for (var i = 0; i < this._bullet.length; i++) {
            if (this._bullet[i].IsUse == true) {  //2.循环遍历子弹对象池,使用IsUse状态为true的子弹
                if (this._bullet[i].btype == IdentityType.ENEMY) {  //3.判断子弹类型,如果是敌机发射的,那么就和主角进行碰撞检测
                    isHit = GameUtils.hitTest(e, this._bullet[i])
                    hitevent.htype = HitType.ENEMY_TO_HERO;  
                }

                if (this._bullet[i].btype == IdentityType.HERO) { //4.如果是主角发射的。那么就和第一步的取出来的数组进行碰撞检测
                    for (var j = 0; j < arr.length; j++) {
                        if (arr[j].IsUse) {
                            isHit = GameUtils.hitTest(arr[j], this._bullet[i])
                            hitevent.enemy = arr[j];
                            hitevent.htype = HitType.HERO_TO_ENEMY;
                        }
                    }
                }
                if (isHit) {  //如果碰撞检测为true,那么触发HitEvent事件,并传递检测结果,并手动调用子弹的回收方法
                    this.dispatchEvent(hitevent);
                    this._bullet[i].Recycle();
                }
            }
        }
        return isHit;

    }

从敌机对象池中取出已经使用的敌机对象

public GetIsUsePlane(): EnemyPlane[] {
        let planes = [];
        for (var i = 0; i < this._enemys.length; i++) {
            if (!this._enemys[i].IsUse) {
                planes.push(this._enemys[i])

            }
        }
        return planes;
    }

然后监听HitEvent来对击中的事件做操作。

判断事件类型,知道是谁被击中了,然后对应做出不同的处理,如果主角被击中,那么可以做扣除HP值等操作,敌机被击中,可以做主角加分,把敌机抹除掉等操作

this._bullets.addEventListener(HitEvent.EventString, (e: HitEvent) => {
            console.log("子弹碰撞事件触发:" + e.htype)
            if (e.htype == HitType.ENEMY_TO_HERO) {
                //Hero被击中
            }
            if (e.htype == HitType.HERO_TO_ENEMY) {
                //Enemy被击中
                e.enemy.Recycle();
                this._Score += 1;
                console.log("当前分数:" + this._Score);
            }

        }, this)

然后运行,就可以看到子弹击中飞机,会被回收,然后触发HitEvent事件。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
2年前
Skynet 简单的服务编写 (2)
          前面我们简单的用Skynet写了个lua服务,实现了简单的发送消息并调用输出“HelloWorld!”  而由于Skynet是网络框架,所以我们这次用Skynet写一个简单的服务来监听80端口。  具体流程如下:      1、在main文件入口内监ip为:192.168.2.5,端口为:80    
Wesley13 Wesley13
2年前
unity仿微信飞机大战项目
开发路线:1,游戏背景(连续播放)2,添加主角3,设置游戏主角的动画4,添加两种子弹并设置子弹的运动5,添加三种子弹设置子弹的自动生成和运动6,添加两种奖励物品设置奖励物品的自动生成和运动7,设置主角的控制
Wesley13 Wesley13
2年前
Unity 子弹移动以及碰撞条件
一、子弹移动游戏物体移动最主要的是获取一个刚体组件,再对这个刚体组件添加一个向前的力;具体代码:publicclassBulletCtrl:MonoBehaviour{publicintdamage20;publicfloatspeed1000.0F;
Stella981 Stella981
2年前
Egret的按钮事件处理
首先要在exml内要设置有对应按钮的ID!(https://oscimg.oschina.net/oscnet/079d7f1add048600e12f2cff222cdb2fcf4.png)2,编写TypeScript脚本:publicmybutton:eui.Button;函数内部:this.mybutton
Wesley13 Wesley13
2年前
C语言程序真正的启动函数
为什么要用”真正”这个词?因为我们从学C语言开始,都会先明白这个道理,即C语言有且仅有一个main函数,main函数是C语言的入口点和出口点!(可以参考http://www.dotcpp.com/wp/184.htmll)不光C语言如此,C也如此,甚至无论黑窗口的控制台程序和Windows应用程序,都是从main函数或者WinMain函数开始执行,这当
Wesley13 Wesley13
2年前
Unity 2D游戏开发教程之游戏精灵的开火状态
Unity2D游戏开发教程之游戏精灵的开火状态精灵的开火状态“开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力。因为本游戏在后面会引入敌人,而精灵最好具备开火的能力,否则会被敌人轻易干掉!具体的实现方法是:(1)导入一个表
Wesley13 Wesley13
2年前
Unity 利用射线实现弹孔效果
1、利用 Camera.main.ScreenPointToRay从屏幕到鼠标点击位置生成一条射线。2、利用 Physics.Raycast 发射射线,同时判断是否碰撞到目标物体。3、通过 RaycastHit获取射线所碰撞到的位置。4、在目标位置生成一个弹孔预设体。 具体代码:using UnityEngine;
Stella981 Stella981
2年前
Servlet 原理
要介绍Servlet必须要先把Servlet容器说清楚,Servlet与Servlet容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。虽然它们是彼此依存的,但是又相互独立发展,这一切都是为了适应工业化生产的结果。从技术角度来说是为了解耦,通过标准化接口来相互协作。既然接口是连接Servlet与Servlet容器的
Stella981 Stella981
2年前
Egret实战开发笔记,飞行射击游戏(五)
今天是开发飞行射击游戏第五天,爆炸特效体系与NPC子弹弹幕。简介实现爆炸特效体系与NPC子弹弹幕。飞机爆炸也是一个类,爆炸也是个数可变的,也需要特效管理者类。实现效果本来想路视频转GIF的,但是gif文件过大,超过5M又上传不了,而且压缩后失帧严重,仅截取了一部
Wesley13 Wesley13
2年前
JAVA日常之三
一、Main方法的args参数args\\是程序运行前可传入的参数,比如javaHelloWorlda,那么在HelloWorld的main方法里面args就是{"a"},多个的话用空格隔开,比如javaHelloWorldabc,那么在HelloWorld的main方法里面args就是{"a","b",