Egret学习笔记 (Egret打飞机-7.实现敌机工厂)

简介: Egret学习笔记 (Egret打飞机-7.实现敌机工厂)

在游戏过程之,敌机是源源不断的冲屏幕上方往下飞,如果我们每一架敌机都直接new的话,在飞机很多的情况下,也许有性能问题。

就像前面子弹对象池一样,我们也要实现一个飞机对象池,也就是标题说的敌机工厂(之所以叫工厂,我觉得飞机是从工厂里面生产出来的,没有飞机冲池子里面捞出来吧。。。所以叫工厂。当然叫敌机对象池也没啥问题)

新建一个EnemyFactory.ts文件

class EnemyFactory extends egret.DisplayObjectContainer {
  _timer: egret.Timer;
  _main: Main;
  public constructor() {
    super();
  }
  _enemys: EnemyPlane[] = [];
  _giveevent: EnemyGiveEvent;
  /**
   * 初始化对象池
   */
  public InitEnemyPool(main: Main) {
    this._main = main;
    for (var i = 0; i < 20; i++) {
      var p = new SmallEnemyPlane(main)
      this._enemys.push(p)
    }
    this._giveevent = new EnemyGiveEvent(EnemyGiveEvent.TAG);
    this._timer = new egret.Timer(2000);
    this._timer.addEventListener(egret.TimerEvent.TIMER, this.timerFunc, this)
    this._timer.start();
    this.addEventListener(EnemyGiveEvent.TAG, (e: EnemyGiveEvent) => {
      console.log("生产Enemy +1")
      var x = GameUtils.GetRandomNum(0, 5.5) * 100;
      var small = this.GetSamllEnemyObject(EnemyType.SMALL);
      small.x = x;
      small.Use();
    }, this)
  }
  /**
 * 定时调用
 */
  public timerFunc() {
    this.dispatchEvent(this._giveevent);
  }
  public GetSamllEnemyObject(type: EnemyType): SmallEnemyPlane {
    for (var i = 0; i < this._enemys.length; i++) {
      if (!this._enemys[i].IsUse && this._enemys[i]._tyle == type) {
        return this._enemys[i];
      }
    }
  }
}

InitEnemyPool方法中,我们初始化了20个small类型的飞机,然后放置了一个timer对象,每2秒调用一次,定时调用只触发一个事件EnemyGiveEvent.,然后EnemyFactory自己监听EnemyGiveEvent事件。并从对象池里面捞出一个没有使用的飞机对象,然后把随机生成的x坐标赋值给从对象池捞出来的飞机对象,然后调用飞机的Use方法,但是飞机回收就不用管,我们之前编写飞机的基类的时候,已经实现过自动回收了。

可能大家会问,我直接在timerfunc里面调用生产飞机不就可以了吗,干嘛还要写一个事件在里面啊?

class EnemyGiveEvent extends egret.Event {
  public static TAG = "生产EnemyPalne"
  public planetype: EnemyType = EnemyType.SMALL;
  public constructor(type: string, bubbles: boolean = false, cancelable: boolean = false) {
    super(type, bubbles, cancelable);
  }
}

在EnemyGiveEvent事件里面,我们定义了EnemyType 的枚举,传递事件的时候,可以带上当前事件的类型,这样在监听事件的时候,可以根据枚举类型判断当前应该从对象池里面捞什么样的飞机。

其实不用事件也是可以的,只是我个人比较喜欢这样的写,才找了上面的理由,第一次写的时候,也可以先实现功能,再考虑优化问题

然后使用这个工程也是很简单的,在main里面

this._EnemyPool = new EnemyFactory();
this._EnemyPool.InitEnemyPool(this);

然后,就可以看到一大堆飞机在屏幕上飞了

目录
相关文章
|
10月前
|
Python
飞机大战-发射子弹(5)
用Python语言编写飞机大战,主要编写发射子弹。
51 0
|
2天前
|
图形学
【unity实战】实现实体子弹射击
【unity实战】实现实体子弹射击
7 0
|
16天前
|
Python
使用Pygame做一个乒乓球游戏(2)使用精灵重构
使用Pygame做一个乒乓球游戏(2)使用精灵重构
|
8月前
Egret 碰撞检测总结
Egret 碰撞检测总结
53 0
|
API 图形学
unity之子弹发射小demo
unity之子弹发射
139 0
|
容器
Egret学习笔记 (Egret打飞机-5.实现子弹对象)
Egret学习笔记 (Egret打飞机-5.实现子弹对象)
93 0
|
容器
Egret学习笔记 (Egret打飞机-6.实现敌机飞起来)
Egret学习笔记 (Egret打飞机-6.实现敌机飞起来)
75 0
|
容器
Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)
Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)
88 0
|
Web App开发 容器
Egret学习笔记 (Egret打飞机-2.开始游戏)
Egret学习笔记 (Egret打飞机-2.开始游戏)
64 0
Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)
Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)
55 0