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);
然后,就可以看到一大堆飞机在屏幕上飞了

Egret学习笔记 (Egret打飞机-7.实现敌机工厂)的更多相关文章
- Egret学习笔记 (Egret打飞机-5.实现子弹对象)
上一章把飞机添加到屏幕上,但是飞机要发射子弹对吧?那么这一章我们就来实现一下发射子弹,并实现一个简单的子弹对象池 先来捋一捋思路 1.创建一个子弹对象 2.然后添加一个bitmap,显示子弹贴图 3. ...
- Egret学习笔记 (Egret打飞机-6.实现敌机飞起来)
有了子弹,总得有敌人来打吧,不然游戏有啥意思呢?今天我们来实现敌机从屏幕上边往下飞 参考微信打飞机游戏里面,敌机分为3种 1是特小飞机,2是小飞机,还有一种就是大飞机 面向对象编程提倡抽象,实现代码复 ...
- Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)
今天继续写点击了开始之后,添加一个飞机到场景中,然后这个飞机的尾巴还在冒火的那种感觉 先拆解一下步骤 1.首先完成飞机容器的图片加载 2.然后把容器添加到场景中 3.然后实现动画 -首先,我们新建一个 ...
- Egret学习笔记 (Egret打飞机-3.实现背景循环滚动)
游戏背景里面的猪脚飞机看起来是一直在向前飞,但是实际上只是一个视觉差而已. 猪脚是出于不动的状态,背景从上到下滚动,然后让玩家觉得飞机在不停的往前飞.(当然这只是其中一种实现思路) 差不多就是这样,然 ...
- Egret学习笔记 (Egret打飞机-1.大致思路)
大致看了一遍Egret的官方文档,就开始打算使用Egret来开发一个打飞机游戏. 首先来捋一捋思路,先来看一看一个打飞机游戏的图片 基本上一个打飞机游戏分为 开始游戏 ----------进入游戏 ...
- Egret学习笔记 (Egret打飞机-2.开始游戏)
打开 Egret Wing,新建一个Egret游戏项目,然后删掉默认生成的createGameScene方法里面的东西 然后新建一个BeginScene.ts的文件,作为我们的游戏的第一个场景 cla ...
- Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)
运行起来,虽然主角飞机和敌机都在互相发射子弹,但是子弹打中了就和没打中效果是一样的.. 这一章我们就来处理子弹和飞机的碰撞问题. 我们所有的操作都是基于Main这个容器来做的.所以我就把这个处理放到M ...
- Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)
经过前面几章的准备,我们差不多已经具备了一个基本的框架,这一章我们就开始添砖加瓦了. 敌机定时发射一个子弹,子弹的方向是从上到下,但是发射子弹的代码应该放在哪儿呢? 从面向对象编程的思想来说,子弹是敌 ...
- Egret学习笔记.1 (写在前面的废话)
我记得之前谁说过,大部分程序员入行,都是因为小的时候的游戏机啊,各种电子设备啊....觉得有意思,才入的行 . 至少我本人是因为之前上高中那会儿,喜欢玩手机.那会儿还是MTK,塞班的时代,喜欢拿着手机 ...
随机推荐
- 要学的东西太多了,还想学习opencv
资料先放这里,以后好好学 http://m.blog.csdn.net/column/details?alias=opencv-tutorial eclipse加载opencv库成功! B站视频教程资 ...
- CSS深入理解学习笔记之relative
1.relative和absolute的相煎关系 限制作用:①限制left/top/right/bottom定位:②限制z-index层级:③限制在overflow下的嚣张气焰. relative和f ...
- Android更新主线程UI的两种方式handler与runOnUiThread()
在android开发过程中,耗时操作我们会放在子线程中去执行,而更新UI是要主线程(也叫做:UI线程)来更新的,自然会遇到如何更新主线程UI的问题.如果在主线程之外的线程中直接更新页面显示常会报错.抛 ...
- lua版本的一个状态机
这个状态机http://www.cnblogs.com/flytrace/p/5587033.html的lua版本 -- LUA 有实现枚举值的好办法么 local sc_enum = { -- ev ...
- 选择结构if、switch
选择结构if.switch 一.if三种形式 if if-else 3.if -else if -else 二.switch 针对某个表达式的值做出判断,成为决定执行代码块 switch 语句特点: ...
- 【php】RBAC 管理权限
用户 角色 权限 用户:张三 角色:管理员 权限:page/index1.php 能访问的页面
- 如何在eclipse中配置反编译工具JadClipse
Q:为什么有必要在开发环境中配置反编译工具呢? A: 当运行引用了第三方jar包项目时,突然报出了jar包中的某个类的某一行出现异常.我们想看一下这个class文件的代码时,经常出现了如下图所示的场 ...
- 机器学习01:使用scikit-learn的线性回归预测Google股票
这是机器学习系列的第一篇文章. 本文将使用Python及scikit-learn的线性回归预测Google的股票走势.请千万别期望这个示例能够让你成为股票高手.下面按逐步介绍如何进行实践. 准备数据 ...
- 2018/1/28 RocketMq学习笔记
RocketMq是支持Topic模式的MQ中间件,它的传输格式为topic(主题,一个product对应一个主题,),Tag(标签,其实就是副标题,是为了更好的支持集群模式而出现的,这样客户端可以指定 ...
- SpringMVC之使用requestMapping映射请求、映射参数、映射头
1. 映射请求 作用:使用requestMapping可以指定处理器可以处理那些请求 地方:类和方法前面都可以 @requestMapping 类定义处: 提供初步的请求映射信息,相对于web应用的根 ...