在游戏过程之,敌机是源源不断的冲屏幕上方往下飞,如果我们每一架敌机都直接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);

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

Egret学习笔记 (Egret打飞机-7.实现敌机工厂)的更多相关文章

  1. Egret学习笔记 (Egret打飞机-5.实现子弹对象)

    上一章把飞机添加到屏幕上,但是飞机要发射子弹对吧?那么这一章我们就来实现一下发射子弹,并实现一个简单的子弹对象池 先来捋一捋思路 1.创建一个子弹对象 2.然后添加一个bitmap,显示子弹贴图 3. ...

  2. Egret学习笔记 (Egret打飞机-6.实现敌机飞起来)

    有了子弹,总得有敌人来打吧,不然游戏有啥意思呢?今天我们来实现敌机从屏幕上边往下飞 参考微信打飞机游戏里面,敌机分为3种 1是特小飞机,2是小飞机,还有一种就是大飞机 面向对象编程提倡抽象,实现代码复 ...

  3. Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)

    今天继续写点击了开始之后,添加一个飞机到场景中,然后这个飞机的尾巴还在冒火的那种感觉 先拆解一下步骤 1.首先完成飞机容器的图片加载 2.然后把容器添加到场景中 3.然后实现动画 -首先,我们新建一个 ...

  4. Egret学习笔记 (Egret打飞机-3.实现背景循环滚动)

    游戏背景里面的猪脚飞机看起来是一直在向前飞,但是实际上只是一个视觉差而已. 猪脚是出于不动的状态,背景从上到下滚动,然后让玩家觉得飞机在不停的往前飞.(当然这只是其中一种实现思路) 差不多就是这样,然 ...

  5. Egret学习笔记 (Egret打飞机-1.大致思路)

    大致看了一遍Egret的官方文档,就开始打算使用Egret来开发一个打飞机游戏. 首先来捋一捋思路,先来看一看一个打飞机游戏的图片 基本上一个打飞机游戏分为 开始游戏   ----------进入游戏 ...

  6. Egret学习笔记 (Egret打飞机-2.开始游戏)

    打开 Egret Wing,新建一个Egret游戏项目,然后删掉默认生成的createGameScene方法里面的东西 然后新建一个BeginScene.ts的文件,作为我们的游戏的第一个场景 cla ...

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

    运行起来,虽然主角飞机和敌机都在互相发射子弹,但是子弹打中了就和没打中效果是一样的.. 这一章我们就来处理子弹和飞机的碰撞问题. 我们所有的操作都是基于Main这个容器来做的.所以我就把这个处理放到M ...

  8. Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)

    经过前面几章的准备,我们差不多已经具备了一个基本的框架,这一章我们就开始添砖加瓦了. 敌机定时发射一个子弹,子弹的方向是从上到下,但是发射子弹的代码应该放在哪儿呢? 从面向对象编程的思想来说,子弹是敌 ...

  9. Egret学习笔记.1 (写在前面的废话)

    我记得之前谁说过,大部分程序员入行,都是因为小的时候的游戏机啊,各种电子设备啊....觉得有意思,才入的行 . 至少我本人是因为之前上高中那会儿,喜欢玩手机.那会儿还是MTK,塞班的时代,喜欢拿着手机 ...

随机推荐

  1. git 签出(恢复)指定文件

    在项目开发中,偶尔会因为误删文件或其他原因需要从git仓库中恢复某些文件.此篇文章将介绍如何通过git从历史提交记录.分支记录恢复指定文件. 1. git checkout 说明:使用git chec ...

  2. -bash: warning: setlocale: LC_CTYPE: cannot change locale (EN_US.UTF-8): No such file or directory

    出问题原因: 通过 su - 切换用户时候,LANG设置为en或者设置错误,切换角色会出现这个错误 如何解决? echo $LANG # 查看 LANG 参数 sed 's#LANG=en#LANG= ...

  3. js_2_json

    js如何使用json? json.stringify(需要序列化对象)  // 序列化 josn.parse(已经序列化对象)       // 反序列化

  4. BSA Network Shell系列-nexec | runcmd | runscript | scriptutil的异同

    说明下nexec.runcmd.runscript.scriptutil的异同 相同点: 四者都可以在远程机器执行命令.或者调用脚本. 不同点: nexec支持NSH命令,可以执行远程机的本地命令(非 ...

  5. iphone启动图UI切图尺寸对照保存

  6. Java 生产者消费者模式详细分析

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. 基于 HTML5 WebGL 的 3D SCADA 主站系统

    这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 的模拟一般需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算是我对这次项 ...

  8. IIS与Apache禁止IP地址直接访问网站

    一.IIS 防止恶意域名指向解决方法 首先单击"开始"-"设置"-"控制面板"-"管理工具",找到"Inter ...

  9. java根据模板导出pdf

    在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模板,有的只是随便把数据放里面生成文件,完全不考虑数据怎样放置的以及以后的维护性,想想还是自己总结一个完全版的导出 ...

  10. 有关mysql的for update以及 死锁问题

    一.先说锁的概念 锁级别: 1.行级锁: InnoDB引擎(也支持表级锁,默认是行级锁),开销大,加锁慢:会出现死锁.锁定粒度最小,发生锁冲突的概率最低,并发度最高. 2.表级锁:MylSAM引擎和M ...