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


目录
相关文章
|
8月前
|
Python
飞机大战-发射子弹(5)
用Python语言编写飞机大战,主要编写发射子弹。
46 0
|
8月前
|
Python
飞机大战-显示敌机并发射子弹(6)
用Python语言编写显示敌机并发射子弹。
44 2
|
6月前
Egret 碰撞检测总结
Egret 碰撞检测总结
38 0
|
12月前
|
前端开发 JavaScript
2023跨年代码(烟花+背景音乐)
2023跨年代码(烟花+背景音乐)
275 0
|
12月前
|
Python
python及pygame雷霆战机游戏项目实战02 敌人精灵
python及pygame雷霆战机游戏项目实战02 敌人精灵
86 0
Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)
Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)
49 0
|
容器
Egret学习笔记 (Egret打飞机-6.实现敌机飞起来)
Egret学习笔记 (Egret打飞机-6.实现敌机飞起来)
67 0
|
容器
Egret学习笔记 (Egret打飞机-5.实现子弹对象)
Egret学习笔记 (Egret打飞机-5.实现子弹对象)
84 0
Egret学习笔记 (Egret打飞机-7.实现敌机工厂)
Egret学习笔记 (Egret打飞机-7.实现敌机工厂)
65 0
|
Web App开发 容器
Egret学习笔记 (Egret打飞机-2.开始游戏)
Egret学习笔记 (Egret打飞机-2.开始游戏)
59 0