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事件。

 

posted on   快乐海盗  阅读(2392)  评论(2编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示