zoukankan      html  css  js  c++  java
  • 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事件。

  • 相关阅读:
    SharePoint开发
    SharePoint开发
    win32-如何识别哪个静态控件被点击
    win32
    win32-创建透明的图片按钮
    读取位图文件
    python--获得特定程序的屏幕截图并保存为文件
    win32--GetFileAttributes
    谈一下交换值之后并不能返回预料的结果
    链表--insert
  • 原文地址:https://www.cnblogs.com/boxrice/p/8250163.html
Copyright © 2011-2022 走看看