Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)

简介: Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)

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

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

我们所有的操作都是基于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事件。


目录
相关文章
|
5月前
|
安全 Java 程序员
巧用Optional之优雅规避NPE问题
本文探讨了Java中常见的NullPointerException问题及其解决方案,重点介绍了Optional类的使用。通过实例代码分析,展示了如何用Optional替代传统的空值检查,使代码更简洁、优雅。文章详细讲解了Optional的创建方法(如of、ofNullable、empty)及常用方法(如get、orElse、map、flatMap、filter),并通过实战案例演示了其在实际开发中的应用,帮助开发者有效避免NPE问题,提升代码质量。
138 2
巧用Optional之优雅规避NPE问题
|
11月前
|
自动驾驶 物联网 5G
标题:5G频段解析:低频、中频与毫米波的奥秘
标题:5G频段解析:低频、中频与毫米波的奥秘
1096 64
|
存储 C语言 数据安全/隐私保护
C语言实现简易银行账户管理系统
C语言实现简易银行账户管理系统
529 1
|
SQL Java 关系型数据库
手把手教学在线考试系统本地部署完美运行
手把手教学在线考试系统本地部署完美运行
486 0
FFmpeg开发笔记(五)更新MSYS的密钥环
在《FFmpeg开发实战:从零基础到短视频上线》中,介绍了解决MSYS下FFmpeg交叉编译时遇到的密钥环过期问题。当尝试安装mingw-w64-x86_64-toolchain时,可能出现签名不被信任的错误。这由于MSYS密钥环有效期仅为150天,过期后需更新。通过`pacman-key --list-sigs`检查密钥状态,发现密钥已过期。解决方法是访问`https://repo.msys2.org/msys/x86_64/`下载msys2-keyring最新版,然后验证并安装更新。更新后,密钥环有效期将延长至2024年4月10日,确保能正常安装交叉编译工具链。
204 2
FFmpeg开发笔记(五)更新MSYS的密钥环
|
JavaScript C++ Shell
原型制作与图解——墨刀工具
原型制作与图解——墨刀工具
588 0
原型制作与图解——墨刀工具
HTML table 表头和表格的合并
HTML table 表头和表格的合并
218 0
|
数据可视化 Python
python对网络图networkx进行社区检测和彩色绘图
python对网络图networkx进行社区检测和彩色绘图
|
编解码 监控 前端开发
如何实现Android平台GB28181前端设备接入
在实现Android平台GB28181前端设备接入之前,我们几年前就有了非常成熟的RTMP推送、RTSP推送和轻量级RTSP服务等模块,特别是RTMP推送,行业内应用非常广泛,好多开发者可能会问,既然有了以上模块,干嘛还要实现GB28181的前端接入呢?
276 0
|
存储 缓存 关系型数据库
PostgreSQL 14新特性--减少索引膨胀
PostgreSQL 14新特性--减少索引膨胀
618 0