diff --git a/Conversion/ASCodeTool/56b1ac1e245c0.png b/Conversion/ASCodeTool/56b1ac1e245c0.png
new file mode 100644
index 0000000..03150fc
Binary files /dev/null and b/Conversion/ASCodeTool/56b1ac1e245c0.png differ
diff --git a/Conversion/ASCodeTool/56b1ac1e2e299.png b/Conversion/ASCodeTool/56b1ac1e2e299.png
new file mode 100644
index 0000000..24bfbe1
Binary files /dev/null and b/Conversion/ASCodeTool/56b1ac1e2e299.png differ
diff --git a/Conversion/ASCodeTool/README.md b/Conversion/ASCodeTool/README.md
new file mode 100644
index 0000000..b5944de
--- /dev/null
+++ b/Conversion/ASCodeTool/README.md
@@ -0,0 +1,19 @@
+“AS代码转换工具”可将as3件导出为egret项目ts代码。作为EgretConversion附属工具,可以在as3件有更改时,单独转换该as3件,而不用转换整个项目。
+
+**如何使用“AS代码转换工具”单独转换as3件?**
+
+ 点击工具栏的按钮“SWF转换工具”
+
+ ![](56b1ac1e245c0.png)
+
+ 打开AS代码转换面板:
+
+ ![](56b1ac1e2e299.png)
+
+具体操作:
+
+1. 直接把as3文件或文件夹拖到面板中
+
+2. 转换后的代码会在C:\Users\xxxx\Desktop\astemp中
+
+3. 可以直接把代码拷贝到egret项目中直接使用(错误自己还是需要改的)
\ No newline at end of file
diff --git a/Conversion/SWFTool/56b1ac0cbd1f8.jpg b/Conversion/SWFTool/56b1ac0cbd1f8.jpg
new file mode 100644
index 0000000..2a0ed48
Binary files /dev/null and b/Conversion/SWFTool/56b1ac0cbd1f8.jpg differ
diff --git a/Conversion/SWFTool/56b1ac0d06bb9.jpg b/Conversion/SWFTool/56b1ac0d06bb9.jpg
new file mode 100644
index 0000000..314308f
Binary files /dev/null and b/Conversion/SWFTool/56b1ac0d06bb9.jpg differ
diff --git a/Conversion/SWFTool/README.md b/Conversion/SWFTool/README.md
new file mode 100644
index 0000000..b4b2e98
--- /dev/null
+++ b/Conversion/SWFTool/README.md
@@ -0,0 +1,69 @@
+“SWF转换工具”可将swf文件导出为Egret项目可用的资源。作为Egret Conversion附属工具,可以在swf文件有更改时,单独转换该swf文件,而不用转换整个项目。要注意的是,“SWF转换工具”是为Egret定制的工具,转出的格式只能用于egret项目(需要三方库的支持),无法在其他h5项目中使用。
+
+## 一、如何使用“SWF转换工具”单独转换swf文件?
+
+点击工具栏的按钮“SWF转换工具”
+
+![](56b1ac0cbd1f8.jpg)
+
+打开SWFExporter面板:
+
+![](56b1ac0d06bb9.jpg)
+
+1:提示信息区
+
+2:swf文件的导出位置
+
+3:当前导出swf文件的进度信息
+
+4:正在导出的swf文件全路径
+
+以Flashbuilder项目为例:
+
+从Flash项目的bin-debug或源码目录下拖入一个或多个swf文件到面板中,也可拖入目录。转换时在面板底部显示有转换的进度,当转换完成将显示“complete!”。
+
+如果选择了一个转换项目,所有转换的swf都会生成资源到转换项目下的egret项目resource/swfres目录下。
+
+如果没有选择任何转换项目,所有转换的swf都会生成到桌面上resource/swfres下。
+
+## 二、怎样在 Egret 项目中使用生成的资源?
+
+把生成到resource/swfres路径下的资源文件夹拷贝到egret项目的相应位置(resource下)。然后可以像在flash中写as3代码一样加载swf文件。
+
+例如在as3中这样写:
+
+```
+var url:String = "123.swf";
+var urlRequest:URLRequest = new URLRequest(url);
+var loader:Loader = new Loader();
+loader.load(urlRequest, null);
+loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
+```
+
+在egret项目中这样写:
+
+```
+var url:String = "123.swf";
+var urlRequest:egret.URLRequest = new egret.URLRequest(url);
+var loader:flash.Loader = new flash.Loader();
+loader.load(urlRequest,null);
+loader.contentLoaderInfo.addEventListener(egret.Event.COMPLETE,flash.bind(this.onLoadComplete,this),null);
+```
+
+可以看到egret项目的typescript代码直接加载了swf格式的文件。
+
+egret项目直接支持swf文件格式吗?答案是不支持。
+
+而使用Egret Conversion转换生成的egret项目支持swf。这是因为EgretConversion在底层封装了swf文件格式,在代码层模拟了这一功能,请看下文讲解。
+
+## 三、egret中是怎么实现载入swf的?
+
+在flash中可以直接加载swf格式的文件,然后从文件中取到各种资源,而egret是不支持swf文件格式的。Egret Conversion通过转换操作,将flash项目的as3语法翻译为egret项目的ts语法,将swf文件解析为可为egret项目识别的资源格式,通过底层的封装最终可在代码层直接加载swf。要注意的是,这种加载swf并不是真的load了一个.swf文件,而是在底层载入了经过转换后的图片等文件。
+
+## 四、支持swf资源的三方库
+
+Egret Conversion转换的swf资源可在任意egret项目中使用,通过导入一个开源的三方库。
+
+获得三方库:用EgretConversion转换任意一个flash项目(可以用示例项目),在生成的egret项目中,src/as3目录即是这个三方库文件。
+
+将三方库拷贝到自己的egret项目相应路径下。
\ No newline at end of file
diff --git a/Conversion/debugger/56b1ac3f5904b.jpg b/Conversion/debugger/56b1ac3f5904b.jpg
new file mode 100644
index 0000000..72b20fc
Binary files /dev/null and b/Conversion/debugger/56b1ac3f5904b.jpg differ
diff --git a/Conversion/debugger/56b1ac402f21a.jpg b/Conversion/debugger/56b1ac402f21a.jpg
new file mode 100644
index 0000000..7096104
Binary files /dev/null and b/Conversion/debugger/56b1ac402f21a.jpg differ
diff --git a/Conversion/debugger/56b1ac409fa73.jpg b/Conversion/debugger/56b1ac409fa73.jpg
new file mode 100644
index 0000000..2ccba09
Binary files /dev/null and b/Conversion/debugger/56b1ac409fa73.jpg differ
diff --git a/Conversion/debugger/README.md b/Conversion/debugger/README.md
new file mode 100644
index 0000000..43b8ea4
--- /dev/null
+++ b/Conversion/debugger/README.md
@@ -0,0 +1,47 @@
+转换Flash项目只是第一步,用EgretConversion转换完项目并按照提示修改错误的语法,以保证项目可以通过编译,然后才能运行项目 。这里提供一些技巧以便于您能快速调试自己的项目。
+
+1. 源项目只需转换一次,剩余的工作都在Egret项目端完成。
+
+2. 做好项目备份。
+
+EgretConversion不会修改源Flash项目的任何内容,但是每次转换操作会覆盖Egret项目的所有代码。因此如果在Egret端已经修复了很多错误,需要谨慎使用“转换按钮”。建议是转换过项目之后所有的改动在Egret端做,不要在Flash项目中继续修改as3代码。
+
+3. Egret项目开发工具可以使用Egret Wing或者Webstorm或者visual studio。wing的断点调试功能很方便。
+
+4. 在Chrome中调试Egret的程序,可以断点查看运行时变量值。
+
+5. 给Chrome安装Egret Inspector插件(从Egret下载器里下载),可以直观的看到显示对象的层级关系,并可动态修改所选目标的属性值以查看效果。查看当前帧率也在这里:
+
+![](56b1ac3f5904b.jpg)
+
+6. 修改舞台背景色。舞台背景默认是黑色。
+
+打开Egret项目launcher下的index.html文件,修改 background: #000000;字段
+
+7. 设置横竖屏,如上。修改
+
+8. 以WebGL模式运行项目:(Filter等效果只有在WebGL模式下有效果)
+
+打开Egret项目下launcher下的egret_loader.js,修改var rendererType = 0;变量为1。
+
+9. 修改舞台默认大小。
+
+打开Egret项目下launcher下的egret_loader.js,修改egret.StageDelegate.getInstance().setDesignSize(600,600);
+
+10. 修改帧频
+
+打开Egret项目下launcher下的egret_loader.js,修改stage.frameRate = 10;
+
+要注意的是该值必须为可被60整除的数(10,15,20,30,60),否则在运行时会将60作为默认值。
+
+![](56b1ac402f21a.jpg)
+
+11. 更新老项目的库文件
+
+EgretConversion升级之后,库文件(as3目录下的类库)会有所更新。创建新的转换项目会使用最新的库文件,对于之前的转换项目,需要把最新的库文件拷贝到项目中替换旧文件。也可以在自动检测到库更新后点“更新配置”自动更新。
+
+![](56b1ac409fa73.jpg)
+
+12. 更新老项目的引擎版本
+
+本机升级Egret后,在命令行中cd到egret项目目录,执行egret upgrade升级项目,然后执行egret build -e编译项目。
\ No newline at end of file
diff --git a/Conversion/errorDeal/README.md b/Conversion/errorDeal/README.md
new file mode 100644
index 0000000..1a195f5
--- /dev/null
+++ b/Conversion/errorDeal/README.md
@@ -0,0 +1,201 @@
+### 一,工具基本功能报错
+
+* 无法新建转换项目
+
+新建转换项目时,工具没有反应,进入假死状态。这种情况下可能与本地没有配置好egret环境有关,参考[准备与安装](../../Conversion/installation/README.md)。
+
+* 项目转换后编译报错
+
+首先确定本机当前所用的Egret版本为EgretConversion所要求的版本。如果低于所需最低版本,则要更新Egret([准备与安装](../../Conversion/installation/README.md))。
+
+* 3000端口被占用,无法运行项目
+
+egret本机项目运行在3000端口上,需要结束其他占用了3000端口的进程。参考“Getting Started”文档的“KILL3000端口”部分。
+
+### 二,代码转换报错
+
+* 类型转换报错
+
+ts中任意类型转换报错,可在表达式前加强转一下。
+
+使用'as'操作符做类型转换时,如果要转为Class类型,会有一个编译报错:
+
+“error TS2304: Cannot find name 'any'.”
+
+例如从加载的swf中取链接类定义:
+
+```
+var btnCls:Class = loaderInfo.applicationDomain.getDefinition("MyButton") as Class;
+```
+
+转换之后的TS代码为:
+
+```
+var btnCls:any = as3.As3As(loaderInfo.applicationDomain.getDefinition ("MyButton"),any);
+```
+
+这是因为ts中没有与Class对应的类类型,需要手动修改如下:
+
+```
+var cls:any = loaderInfo.applicationDomain.getDefinition ("MyButton");
+```
+
+* 类型转换报错error TS2345
+
+```
+private myFunc():void{
+ var employees:Array;
+ var isManager:Function = function (element:any,index:number,arr:Array):boolean
+ {
+ return true;
+ };
+ employees.filter(isManager);
+}
+```
+
+编译时经常会报错: error TS2345: Argument of type 'Function' is not assignable to parameter of type '(value: any, index: number, array: any[]) => boolean'.
+
+大部分情况下这是编译器的误报,可以忽略不管。也可以手动在右侧表达式前加强转,再次编译就不会报类型强转的错误。
+
+* 接口继承接口,类型判定需手动修改。
+
+* 判断一个对象是否实现了某接口,需手动修改。
+
+* 对于闭包,如果有嵌套的写法可能会转换失效,根据错误提示修改写法。
+
+* 对于出现的API警告,有未实现的API请参考手册里“手动填充API”章节。
+
+* namespace引起的转换错误
+
+暂时不支持命名空间的语法规则,as3中的namespace在ts中被忽略,在as3的namesapce中定义的变量和方法视为public属性。因此要防止同名变量的冲突,例如在类MyClass.as中定义变量如下:
+
+```
+public var nsvar1:int = 10;
+ns1 var nsvar1:int = 30;//ns1是我定义的命名空间
+```
+
+在转换为ts代码之后为:
+
+```
+public nsvar1:number = 10;
+public nsvar1:number = 30;//这里会与类变量冲突
+```
+
+对于此冲突,目前需要手动修改,namespace写法在EgretConversion的后续版本中将会支持。
+
+* 子类父类同名属性同名方法冲突
+
+as3代码中子类可以override父类的方法,可以重新定义重名属性(改变属性的访问域private/public/protected),可以定义重名的static属性/方法。
+
+对于同名的属性/方法,EgretConversion在转换之后,会重命名子类中的同名属性/方法,以与父类区分。
+
+如以下基类与子类:
+
+```
+public class BaseCls
+{
+ public var myVar:int;
+ public static var TYPE:String = "red";
+ public function func():void{
+ }
+ public static function sfunc():void{
+ }
+}
+```
+
+```
+public class ExtendCls extends BaseCls
+{
+ protected var myVar:int;//改变属性访问限制
+ public static var TYPE:String = "red";//重定义static变量
+ public override function func():void{//override函数
+ }
+ public static function sfunc():void{//重定义static函数
+ }
+}
+```
+
+看下转换后的ts代码:
+
+```
+ class ExtendCls extends BaseCls {
+ protected myVar_ExtendCls:number = 0;//重命名
+ public static TYPE_static_ExtendCls:string;//重命名
+ public func() {
+ }
+ public static sfunc_static_ExtendCls() {//重命名
+ }
+}
+ExtendCls.TYPE_static_ExtendCls = "red";
+```
+
+
+* get set方法在ts中不可调用super,需要手动修改。
+
+如果在as3中子类重写了get 或set方法,转换后在ts端不会报错,但是子类无法获取父类的 get/set方法了。
+
+例如父类中有get & set方法:
+
+```
+private _age:number = 0;
+public get age():number{
+ return this._age;
+}
+public set age(value:number){
+ this._age = value;
+}
+```
+
+子类中重写set:
+
+```
+public override set age(value:number){
+ ….
+}
+```
+
+子类中将无法访问 age的get方法。
+
+EgretConversion转换as3项目后会重命名get set方法的方法名。如:
+
+```
+protected set age_ExtendCls(value:number)
+```
+
+三,资源转换报错
+
+* 转换过程中有swf文件无法转换(卡死、闪退)
+
+在转换swf资源时,如果卡在某个swf文件无法转换可能导致工具的崩溃、闪退、卡死等现象。一般是由于工具尚不支持的功能引起的。解决办法:可暂时通过删除该swf以跳过转换该资源。并将有问题文件提交给官方。有下列情形的可按照相应的办法解决:
+
+a. avm1格式的swf,需要在fla中重新发布为avm2格式。
+
+b. 有视频等尚不支持的资源类型,可以在fla中删除尚不支持的资源,重新发布swf。
+
+* 转换过程死循环,重复转同一个swf文件
+
+使用SwfExporter工具单独转有问题的swf。或者重启EgretConversion继续转换。
+
+* swf有更改需要重新导出
+
+已经转过的swf不会重新转换,如果原swf文件有改动,需删除已经转换出的资源文件夹(在resource\swfres目录下)。或者使用“swf转换工具”的功能拖入swf文件转换。
+
+* 文本都是白色
+
+升级egret到2.0.3之后的版本。
+
+* 转换后动画播放不正确
+
+是否用帧代码控制播放了,比如加个stop()。目前转换项目会忽略帧代码。
+
+其他错误联系官方团队。
+
+论坛热帖 [转换错误解决方案](http://bbs.egret.com/thread-10741-1-1.html)
+
+----
+
+EgretConversion联系方式:
+
+官方QQ群:Egret Conversion VIP 249685517
+
+官方论坛:[http://bbs.egret.com/forum.php?mod=forumdisplay&fid=70](http://bbs.egret.com/forum.php?mod=forumdisplay&fid=70)
\ No newline at end of file
diff --git a/Conversion/fillingConfiguration/56b1abfa0ce8e.png b/Conversion/fillingConfiguration/56b1abfa0ce8e.png
new file mode 100644
index 0000000..02c09d3
Binary files /dev/null and b/Conversion/fillingConfiguration/56b1abfa0ce8e.png differ
diff --git a/Conversion/fillingConfiguration/56b1abfa302f6.png b/Conversion/fillingConfiguration/56b1abfa302f6.png
new file mode 100644
index 0000000..be7499b
Binary files /dev/null and b/Conversion/fillingConfiguration/56b1abfa302f6.png differ
diff --git a/Conversion/fillingConfiguration/README.md b/Conversion/fillingConfiguration/README.md
new file mode 100644
index 0000000..781087f
--- /dev/null
+++ b/Conversion/fillingConfiguration/README.md
@@ -0,0 +1,66 @@
+本文讲述EgretConversion中遇到的API报错的处理方式。包括没有实现的Flash类,没有实现的Flash属性、API接口等的手动补充方法。
+
+在转换完项目后,“API警告统计”页面会显示所有未能转换的Flash类或属性,并在详情页定位到项目代码的位置。如果项目必须使用这些类或函数则必须补全这些API,即在egret项目端有相应的flash api的映射。
+
+手动补全过程如下:
+
+### 1. 配置csv表:
+
+配置文件CSV表结构
+
+| 类别 | 含义 |
+|--|--|
+| 类 | as3 中的类 全路径 |
+| 继承类 | s3 中的父类 全路径 |
+| 静态 | 静态1 非静态不填写 |
+| 属性 | 对象的属性 |
+| 属性get/set | 读1 只写2 读写不 填写|
+| 函数 | 对象的方法 |
+| 类型 | 类型、方法的返回值类型 |
+| 转换类 | ts 中对应的类 |
+| 是否需要删除前缀 | 静态属性、静态方法才写 |
+| 转换属性| 属性对应不一致填写(mouseEnable /uchEnabled) |
+| 转换属性格式 | 是1 给属性方法转成object[“xxx”]而不是object.xxx |
+| 转换函数 | 应as3.sorton |
+| 转换参数 | 意义不一样时 a.b() as3.sorton (a,b) 应填写b0 a1 |
+| 是否转换实现 | 是1 否0 |
+| 错误提示 | 可以备注错误信息 |
+| 权重 | api出现频率 |
+| 测试 | 是否测试过 |
+
+填写完后放到项目文件夹的config目录下:
+
+![](56b1abfa0ce8e.png)
+
+## 2. 增加映射的类文件或API
+
+除了填写配置表还要补充相应的ts文件才能正确执行,例如api目录下的配置表对应的文件大部分都在Egret引擎中,也有少部分在扩展库as3中
+
+![](56b1abfa302f6.png)
+
+具体操作步骤:
+
+**1. 当发现缺失的API需要补充时,从附件“API模板”中找到API的文件。**
+
+例如没找到InvokeEventReason类的STANDARD属性,这是一个静态属性。在egret项目中没找到InvokeEventReason.ts这个类,说明当前还没有实现这个API。
+
+**2. 在egret项目目录相应目录下创建ts类。**
+
+InvokeEventReason的flash包路径为flash.desktop.InvokeEventReason,在目录C:\Users\chenpeng\Desktop\out\demo1\src\as3\flash\desktop下创建InvokeEventReason.ts文件。填充内容如下:
+
+```
+module flash
+ {
+ export class InvokeEventReason
+ {
+ public static STANDARD:string = "standard";
+ public static NOTIFICATION:string = "notification";
+ public static OPEN_URL:string = "openUrl";
+ public static LOGIN:string = "login";
+ constructor(){
+ }
+ }
+ }
+```
+
+**3.InvokeEventReason.csv放到C:\Users\chenpeng\Desktop\out\config\api\flash\desktop下。**
\ No newline at end of file
diff --git a/Conversion/guide/56b1ab987e000.png b/Conversion/guide/56b1ab987e000.png
new file mode 100644
index 0000000..9281586
Binary files /dev/null and b/Conversion/guide/56b1ab987e000.png differ
diff --git a/Conversion/guide/56b1ab9895aef.png b/Conversion/guide/56b1ab9895aef.png
new file mode 100644
index 0000000..6927156
Binary files /dev/null and b/Conversion/guide/56b1ab9895aef.png differ
diff --git a/Conversion/guide/56b1ab989f694.png b/Conversion/guide/56b1ab989f694.png
new file mode 100644
index 0000000..96b287d
Binary files /dev/null and b/Conversion/guide/56b1ab989f694.png differ
diff --git a/Conversion/guide/56b1ab98afb53.png b/Conversion/guide/56b1ab98afb53.png
new file mode 100644
index 0000000..a6a2e83
Binary files /dev/null and b/Conversion/guide/56b1ab98afb53.png differ
diff --git a/Conversion/guide/56b1ab98bdbdc.png b/Conversion/guide/56b1ab98bdbdc.png
new file mode 100644
index 0000000..5ce80ab
Binary files /dev/null and b/Conversion/guide/56b1ab98bdbdc.png differ
diff --git a/Conversion/guide/56b1ab98d19a8.png b/Conversion/guide/56b1ab98d19a8.png
new file mode 100644
index 0000000..fdd2bce
Binary files /dev/null and b/Conversion/guide/56b1ab98d19a8.png differ
diff --git a/Conversion/guide/56b1ab98dffc5.png b/Conversion/guide/56b1ab98dffc5.png
new file mode 100644
index 0000000..3701377
Binary files /dev/null and b/Conversion/guide/56b1ab98dffc5.png differ
diff --git a/Conversion/guide/56b1ab98efc4a.png b/Conversion/guide/56b1ab98efc4a.png
new file mode 100644
index 0000000..49c5e4b
Binary files /dev/null and b/Conversion/guide/56b1ab98efc4a.png differ
diff --git a/Conversion/guide/56b1ab990bea9.png b/Conversion/guide/56b1ab990bea9.png
new file mode 100644
index 0000000..1b82dfa
Binary files /dev/null and b/Conversion/guide/56b1ab990bea9.png differ
diff --git a/Conversion/guide/56b1ab991d532.png b/Conversion/guide/56b1ab991d532.png
new file mode 100644
index 0000000..43f7d57
Binary files /dev/null and b/Conversion/guide/56b1ab991d532.png differ
diff --git a/Conversion/guide/56b1ab992cda3.png b/Conversion/guide/56b1ab992cda3.png
new file mode 100644
index 0000000..d0a9465
Binary files /dev/null and b/Conversion/guide/56b1ab992cda3.png differ
diff --git a/Conversion/guide/56b1ab993d585.png b/Conversion/guide/56b1ab993d585.png
new file mode 100644
index 0000000..d6fc862
Binary files /dev/null and b/Conversion/guide/56b1ab993d585.png differ
diff --git a/Conversion/guide/56b1ab994d310.png b/Conversion/guide/56b1ab994d310.png
new file mode 100644
index 0000000..e4aeea4
Binary files /dev/null and b/Conversion/guide/56b1ab994d310.png differ
diff --git a/Conversion/guide/56b1ab9bc0ca0.png b/Conversion/guide/56b1ab9bc0ca0.png
new file mode 100644
index 0000000..c9309ef
Binary files /dev/null and b/Conversion/guide/56b1ab9bc0ca0.png differ
diff --git a/Conversion/guide/56b1ab9f1566a.png b/Conversion/guide/56b1ab9f1566a.png
new file mode 100644
index 0000000..d7c0cda
Binary files /dev/null and b/Conversion/guide/56b1ab9f1566a.png differ
diff --git a/Conversion/guide/README.md b/Conversion/guide/README.md
new file mode 100644
index 0000000..7a4570b
--- /dev/null
+++ b/Conversion/guide/README.md
@@ -0,0 +1,187 @@
+前面的文章介绍了Egret Conversion的界面,示例项目的演示。本文将讲述新手如何开始使用工具,更加详细的讲述工具的功能和细节,在转换过程中的问题和解决办法。
+
+在开始转换一个Flash的项目之前,建议您先阅读[EgretConversion FAQ](../..//Conversion/questions/README.md)文档,以了解本工具目前的可用范围。
+
+接下来以转换工具自带的示例项目“连连看”为例,演示创建转换项目到最终执行的整个过程。
+
+## 首先获取示例项目
+
+在Egret Conversion工具中切换到“欢迎界面”页面,选择“示例项目一:连连看”,工具立刻开始解压连连看项目到系统的文档文件夹下,windows系统下解压后的项目路径为:C:\Users\***\Documents\project\LianLianKan,我把这个项目拷贝到D盘下并重新命名为FlashGame,以便路径更短便于下文的截图展示。接下来开始转换项目:
+
+### 1. 创建转换项目
+
+点“新建转换项目”,在弹框中填入相应的参数如下:
+
+![](56b1ab987e000.png)
+
+名称EgretGame是指转换后的Egret项目名称,这个可以取任何名字(合法的文件夹名)。
+
+项目路径选择刚才的FlashGame目录路径。
+
+输出路径填入的是转换项目目录,与转换相关的配置文件及转换后的Egret项目,log等都保存在这个目录下。建议提前创建一个空的目录,然后拷贝目录路径到输出路径,在工作区中删除转换项目时可以选择删除整个目录,因此要小心影响到不相关文件。
+
+**提示:输出路径支持中文路径。**
+
+FlashGame这个项目是flash builder项目,在源项目类型中选择“FlashBuilder项目”。
+
+源项目类型可以选择“FlashBuilder项目”、“FlashDevelop项目”、“Flash Professional项目”、“其他Flash项目”四个选项。根据自己的项目类型来选择正确的类型。工具根据项目类型来自动识别项目的目录结构。
+
+![](56b1ab9895aef.png)
+
+不能自动识别的项目需要手动填入项目的代码路径、项目启动文件、资源路径。
+
+**填好配置后,点确定按钮即开始创建转换项目。工具将在转换项目的目录下生成项目配置文件、日志文件夹、以及一个空的Egret项目。此时工具在后台进行以下一些操作:**
+
+1. 调用egret的命令来创建一个新的egret项目LianLianKan。
+
+提示:如果没有安装egret,则无法创建项目,现象就是在日志区没有任何输出信息,工具卡在这里。
+
+2. 从工具的安装目录下copy启动文件EgretMain.ts、API转换配置表到到”输出目录/config“目录下。
+
+3. 从工具安装目录下copy文件LoadingUI.ts到”输出目录/LianLianKan/src/LoadingUI.ts“。
+
+4. copy类库(与flash一一对应的ts类库)到”输出目录/LianLianKan/src“下。
+
+5. 生成项目属性文件conversion.cts,存储项目的配置信息。
+
+如果成功创建了转换项目,在日志区有如下信息输出:
+
+![](56b1ab989f694.png)
+
+此时按钮”转换Flash项目“会高亮显示。
+
+### 2. 转换项目
+
+点按钮”转换Flash项目“,工具在后台将执行以下步骤:
+
+#### 源码转换:
+
+1)工具会根据一些好的语法转换规则和”输出路径/config“下的API映射关系转换as3源码到“输出路径/名称/src”目录下。
+
+具体的源码转换步骤如下:
+
+ 1. 载入API转换配置,分析配置表中的类信息
+
+ 2. 载入as3源码,解析源码的语法结构,类的继承关系,基本类信息,如类的成员名称,类型信息等。
+
+![](56b1ab98afb53.png)
+
+3. 按照文件逐一进行类型检查、转换特殊语法结构、API名称变换,最后把该文件的语法树打印成ts文件。
+
+![](56b1ab98bdbdc.png)
+
+2) copy并适当修改”输出路径\config\EgretMain.ts”文件到”输出路径\名称\src\EgretMain.ts”,主要修改启动类的名称和Embed资源列表。
+
+### 资源拷贝
+
+自动copy Flash项目输出目录(如bin-debug)下的资源文件,如png、xml、txt等文件,到D:\ConversionOut\EgretGame\对应的目录下。
+
+![](56b1ab98d19a8.png)
+
+### swf资源转换
+
+转换Flash项目输出目录下的swf资源文件,并生成对应的资源到
+
+”输出路径\名称\resources\”对应的目录下
+
+![](56b1ab98dffc5.png)
+
+### 显示转换过程的统计信息
+
+![](56b1ab98efc4a.png)
+
+ 1) 代码文件转换率,统计了代码文件个数,以及成功生成的文件个数。
+
+如果有文件生成失败则会在文件转换信息面板下显示
+
+![](56b1ab990bea9.png)
+
+1. 源码转换错误
+
+例如在LianLianKan.as中写了如下代码:
+
+![](56b1ab991d532.png)
+
+则会在面板中有如下提示:
+
+![](56b1ab992cda3.png)
+
+出现这种情况就要根据提示查看源代码是否有语法错误,或者用了很生僻的写法,目前工具还没有记录这种写法。
+
+2. 资源转换错误
+
+遇到无法转换的swf文件,可以根据log信息查看哪个资源转换出错。目前工具对低版本swf文件的支持可能有问题,也缺少对视频等资源的支持。
+
+可以采取的措施是暂时删除该类型资源或该swf文件,等待后续工具版本对资源的更多支持。
+
+2) API转换率,是指用了多少个API,其中有API错误的个占比是多少,详细信息在
+
+![](56b1ab993d585.png)
+
+![](56b1ab994d310.png)
+
+ API的问题一共分为4种:
+
+1. 缺少类信息。有以下几种情况:
+
+ 情况一:文件转换失败,导致整个文件的结构信息都没有解析出来,其它代码中引用了这个文件的类或方法就会报缺少类信息错误。
+
+ 情况二:用了第三方库swc,工具解析的过程中无法得知swc中的类信息。如果是这种情况请把swc中的代码文件复制到项目的src目录下。
+
+ 情况三:使用了未支持的flash类库,比如AIR的一些类库,或者flex的类库,这种情况也会导致找不到类信息。
+
+2. 缺少属性信息。主要是因为没有解析到相关类里有这个属性名称。
+
+3. 没有实现的类。在API转换表(见附录)中填写了标志“是否转换实现”。
+
+4. 没有实现的属性。在API转换表中填写了标志“是否转换实现”。
+
+### 3. 编译项目
+
+在代码和资源转换完成之后,下一步是编译项目。当然前提是项目转换之后没有严重的错误。
+
+点第二步“编译Egret项目”。此时编译的是Egret的项目了。
+
+如果出现编译错误请参考提示说明,或者参见开发者中心的[文档说明](http://edn.egret.com/cn/)。在代码和资源转换完成之后,下一步是编译项目。当然前提是项目转换之后没有严重的错误。
+
+点第二步“编译Egret项目”。此时编译的是Egret的项目了。
+
+如果出现编译错误请参考提示说明,或者参见开发者中心的[文档说明](http://edn.egret.com/cn/)。
+
+### 4. 运行项目
+
+点第三步“运行Egret项目”。
+
+连连看小游戏在我的默认浏览器chrome上运行了。
+
+![](56b1ab9bc0ca0.png)
+
+注意,本地项目都会运行在3000端口上, 如果3000端口被占用,请先kill掉占用程序再尝试启动项目。见“附1:KILL 3000端口”。
+
+### 5. 查看与调试
+
+游戏运行起来之后可在浏览器中调试程序。建议用chrome启动游戏。
+
+在chrome中右键菜单里选择“审查元素”,打开相应的的js文件,可以断点执行,查看变量的内容等。
+
+选择Egret标签页可以查看当前帧率,可以定位到游戏中具体的对象上,然后在右侧更改该对象的属性可实时生效。例如我找到右侧一个小格子,对其旋转45度,效果如下:
+
+![](56b1ab9f1566a.png)
+
+附1:KILL 3000端口
+
+MAC下:
+
+打开终端:sudo lsof -i :3000
+
+sudo kill -9 xxxx
+
+Windows下:
+
+先查询占用3000端口的pid:
+
+netstat –ano | findstr 3000
+
+杀掉进程:
+
+Taskkill /pid xxxx /f
\ No newline at end of file
diff --git a/Conversion/importProj/56b1abe353e63.jpg b/Conversion/importProj/56b1abe353e63.jpg
new file mode 100644
index 0000000..d34d4e8
Binary files /dev/null and b/Conversion/importProj/56b1abe353e63.jpg differ
diff --git a/Conversion/importProj/56b1abe4280de.jpg b/Conversion/importProj/56b1abe4280de.jpg
new file mode 100644
index 0000000..88c8fcd
Binary files /dev/null and b/Conversion/importProj/56b1abe4280de.jpg differ
diff --git a/Conversion/importProj/56b1abe57ee5e.jpg b/Conversion/importProj/56b1abe57ee5e.jpg
new file mode 100644
index 0000000..c8051da
Binary files /dev/null and b/Conversion/importProj/56b1abe57ee5e.jpg differ
diff --git a/Conversion/importProj/README.md b/Conversion/importProj/README.md
new file mode 100644
index 0000000..eaaac2b
--- /dev/null
+++ b/Conversion/importProj/README.md
@@ -0,0 +1,46 @@
+安装好EgretConversion后,为了快速上手,可以用工具自带的示例项目来熟悉基本操作流程。
+
+**查看示例项目的流程如下:**
+
+----
+
+打开工具后,自动切换到了欢迎界面。
+
+**1. 选择欢迎界面的“导入示例项目”->“示例项目一:连连看”。**
+
+工具将自动跳转到“转换步骤”页面,并开始加压示例项目的过程,在下方的日志区会显示当前解压进度,大概20秒左右解压完成。
+
+然后开始自动创建一个空egret项目并编译。
+
+**2. 在创建egret项目完成后,按照转换页面的提示,依次点“转换Flash项目”,“编译Egret项目”,“运行Egret项目”,即可自动在浏览器中打开转换之后的html5游戏。**
+
+![](56b1abe353e63.jpg)
+
+**3.步走:**
+
+![](56b1abe4280de.jpg)
+
+运行效果:
+
+![](56b1abe57ee5e.jpg)
+
+可以看到游戏成功在浏览器页面上运行起来了,而没有使用flash player。
+
+这里要注意的是:开发时最好使用chrome浏览器,如果当前无法自动弹出浏览器页面,可以手动在浏览器里打开
+
+**3. 查看示例项目代码**
+
+打开的示例项目源码位置如下,可用相应IDE打开查看。
+
+源Flash builder项目:C:\Users\***\Documents\project\LianLianKan
+
+生成的egret项目: C:\Users\***\Documents\project\llk\lianliankanhttp://localhost:3000/launcher/index.html。
+
+**4. 修改代码查看转换结果**
+
+如果修改原flash项目,需要从“转换Flash项目”这一步转换项目。
+
+如果修改的是egret项目,从“编译Egret项目”这一步开始。
+
+注意:“转换Flash项目”操作会重新生成所有代码,如果在转换后的egret项目有修改要注意备份。
+
diff --git a/Conversion/installation/56b1abb8c38c2.jpg b/Conversion/installation/56b1abb8c38c2.jpg
new file mode 100644
index 0000000..6b2c919
Binary files /dev/null and b/Conversion/installation/56b1abb8c38c2.jpg differ
diff --git a/Conversion/installation/56b1abb8e5249.jpg b/Conversion/installation/56b1abb8e5249.jpg
new file mode 100644
index 0000000..3b58191
Binary files /dev/null and b/Conversion/installation/56b1abb8e5249.jpg differ
diff --git a/Conversion/installation/56b1abb921522.jpg b/Conversion/installation/56b1abb921522.jpg
new file mode 100644
index 0000000..fdcfbd1
Binary files /dev/null and b/Conversion/installation/56b1abb921522.jpg differ
diff --git a/Conversion/installation/README.md b/Conversion/installation/README.md
new file mode 100644
index 0000000..8a79551
--- /dev/null
+++ b/Conversion/installation/README.md
@@ -0,0 +1,67 @@
+## 使用EgretConversion转换工具之前需要做哪些准备工作呢?
+
+### 一. 在本机安装Egret环境
+
+转换工具EgretConversion可将Flash的项目转换为基于Egret的项目。因此需要事先安装Egret Engine,否则工具无法运作。
+
+Egret Engine下载地址在[http://www.egret.com/products/engine.html](http://www.egret.com/products/engine.html),这里提供了Egret最新发行版和各个历史版本,目前提供的有Windows和Mac两个版本的下载。
+
+下载之后直接双击安装。
+
+检查是否安装Egret Engine成功,可在命令行中输入Egret,如果列出了可用的Egret命令列表,这就表明已经安装成功。
+
+下面是egret安装文档链接:
+
+[安装与部署](../../Engine2D/projectConfig/installation/README.md)
+
+二. 使用EgretConversion所需的Egret版本
+
+工具使用特定版本的Egret,当前EgretConversion使用的是 [2.0版本的Egret](http://www.egret.com/products/engine.html)。
+
+如果本机正在使用的Egret版本低于EgretConversion所要求的版本号,则可能出现转换后项目报错情况。
+
+查看本机Egret版本的命令为`egret info`
+
+这是我的本机版本:
+
+![](56b1abb8c38c2.jpg)
+
+配置本机Egret版本为EgretConversion可用的版本:
+
+a. 在引擎管理面板升级Egret为最新版。[参考Egret引擎更新](http://edn.egret.com/cn/docs/page/581#检查更新按钮)
+
+b. 切换egret版本:
+
+通过在引擎管理面板配置Egret位置可以切换到其他版本Egret。
+
+![](56b1abb8e5249.jpg)
+
+点“更改”按钮选择其他路径下的egret为要使用的版本。
+
+不同版本的Egret可从github获取到,egret的github地址是[https://github.com/egret-labs/egret-core](https://github.com/egret-labs/egret-core)。
+
+更换Egret版本后用egret info命令检查最新版本号,然后重新启动EgretConversion工具,否则工具创建的egret项目依然是之前版本的。
+
+注意:如果升级了EgretConversion,所需的Egret版本也可能会提升。打开EgretConversion后会自动检测到Egret的版本并提示升级。
+
+### 三、安装EgretConversion
+
+Egret配置正确后,接下来安装EgretConversion:
+
+下载地址:http://www.egret.com/egretconversion,也可通过引擎管理面板获取和升级EgretConversion。
+
+安装EgretConversion,安装过程的任何问题请联系我们的支持团队。
+
+### 四、升级EgretConversion
+
+在引擎管理面板中升级EgretConversion到最新的版本。打开EgretConversion,选择已存在的项目有如下类库升级提示:
+
+![](56b1abb921522.jpg)
+
+点更新配置升级旧项目到最新的工具类库。
+
+EgretConversion联系方式:
+
+官方QQ群:Egret Conversion VIP 249685517
+
+官方论坛:[http://bbs.egret.com/forum.php?mod=forumdisplay&fid=70](http://bbs.egret.com/forum.php?mod=forumdisplay&fid=70)
\ No newline at end of file
diff --git a/Conversion/introduction/56b1abcd6d6dd.jpg b/Conversion/introduction/56b1abcd6d6dd.jpg
new file mode 100644
index 0000000..9e0fae3
Binary files /dev/null and b/Conversion/introduction/56b1abcd6d6dd.jpg differ
diff --git a/Conversion/introduction/56b1abcdad74e.jpg b/Conversion/introduction/56b1abcdad74e.jpg
new file mode 100644
index 0000000..867338f
Binary files /dev/null and b/Conversion/introduction/56b1abcdad74e.jpg differ
diff --git a/Conversion/introduction/56b1abcdd1b27.jpg b/Conversion/introduction/56b1abcdd1b27.jpg
new file mode 100644
index 0000000..1871f13
Binary files /dev/null and b/Conversion/introduction/56b1abcdd1b27.jpg differ
diff --git a/Conversion/introduction/56b1abcde7e59.jpg b/Conversion/introduction/56b1abcde7e59.jpg
new file mode 100644
index 0000000..16fd765
Binary files /dev/null and b/Conversion/introduction/56b1abcde7e59.jpg differ
diff --git a/Conversion/introduction/56b1abce13e7e.jpg b/Conversion/introduction/56b1abce13e7e.jpg
new file mode 100644
index 0000000..bf70293
Binary files /dev/null and b/Conversion/introduction/56b1abce13e7e.jpg differ
diff --git a/Conversion/introduction/56b1abce322a2.jpg b/Conversion/introduction/56b1abce322a2.jpg
new file mode 100644
index 0000000..975ef7c
Binary files /dev/null and b/Conversion/introduction/56b1abce322a2.jpg differ
diff --git a/Conversion/introduction/56b1abce99c22.jpg b/Conversion/introduction/56b1abce99c22.jpg
new file mode 100644
index 0000000..b9935d2
Binary files /dev/null and b/Conversion/introduction/56b1abce99c22.jpg differ
diff --git a/Conversion/introduction/56b1abced2c08.jpg b/Conversion/introduction/56b1abced2c08.jpg
new file mode 100644
index 0000000..27b5233
Binary files /dev/null and b/Conversion/introduction/56b1abced2c08.jpg differ
diff --git a/Conversion/introduction/56b1abcf53c29.jpg b/Conversion/introduction/56b1abcf53c29.jpg
new file mode 100644
index 0000000..e092b15
Binary files /dev/null and b/Conversion/introduction/56b1abcf53c29.jpg differ
diff --git a/Conversion/introduction/56b1abcf709b9.jpg b/Conversion/introduction/56b1abcf709b9.jpg
new file mode 100644
index 0000000..723ceaf
Binary files /dev/null and b/Conversion/introduction/56b1abcf709b9.jpg differ
diff --git a/Conversion/introduction/56b1abcfbe8a8.jpg b/Conversion/introduction/56b1abcfbe8a8.jpg
new file mode 100644
index 0000000..9a1fcd8
Binary files /dev/null and b/Conversion/introduction/56b1abcfbe8a8.jpg differ
diff --git a/Conversion/introduction/README.md b/Conversion/introduction/README.md
new file mode 100644
index 0000000..08d91d4
--- /dev/null
+++ b/Conversion/introduction/README.md
@@ -0,0 +1,121 @@
+本文档对EgretConversion工具做个大概介绍,通过本文档可以总览工具的所有功能特征,每个功能的具体用法在之后相应的文档中做详细解释。
+
+## 一、菜单
+
+**菜单->文件**
+
+![](56b1abcd6d6dd.jpg)
+
+新建转换项目:这是EgretConversion的入口,所有的转换项目都要从这里创建。点击将弹出”新建转换项目“面板,填入项目名称、项目路径、项目类型、输出路径等几项参数。确定后将创建一个转换项目。
+
+导入转换项目:导入一个之前已经创建好的转换项目。点击将弹出”导入项目“面板,选择或输入转换项目目录即可导入已存在的转换项目。
+
+**菜单->帮助**
+
+![](56b1abcdad74e.jpg)
+
+欢迎界面:点击后标签页跳转到欢迎页
+
+官网:点击在浏览器中打开Egret官网页面。
+
+文档中心:点击在浏览器中打开EDN中心。
+
+官方论坛:点击在浏览器中打开官方论坛。
+
+使用手册:点击在浏览器中打开EgretConversion文档页面。
+
+提交bug:点击弹出”问题反馈“面板,可直接在这里提交遇到的bug,或者给工具的开发团队提任何建议等反馈。并可上传附件。
+
+关于EgretConversion:点击打开关于面板,主要用于查看当前EgretConversion版本号。
+
+## 二、工具栏
+
+![](56b1abcdd1b27.jpg)
+
+1:"新建转换项目"按钮,功能同菜单->文件->新建转换项目。
+
+2:"导入转换项目"按钮,功能同菜单->文件->导入转换项目。
+
+3:"转换"按钮,点击将开始转换Flash的项目到Egret的项目,转换过程在日志区中会有相关提示。详见后续文档。
+
+4:"编译"按钮,点击将编译转换后的Egret项目,编译过程在日志区有相关提示,编译错误会直接显示在日志区。详见后续文档。
+
+5:"运行"按钮,如果编译通过,点击将直接运行egret的项目。详见后续文档。
+
+6:"停止运行"按钮,如果转换后的项目正在运行,点击可关闭egret内部服务器,再刷新浏览器页面项目就无法运行了。参考运行项目。
+
+7:"SWF转换工具"按钮,点击打开转换swf面板,拖入swf文件即可单独转换为egret项目的资源。这部分在后面的文档中做详细解释。
+
+8:"问题反馈"按钮,功能同菜单->帮助->提交Bug。
+
+## 三、项目工作区
+
+![](56b1abcde7e59.jpg)
+
+项目工作区位于界面左侧,这里列出了之前创建的转换项目。点选某个项目,在工具中所做的操作都是针对该项目。左键选择项目,右键可打开快捷菜单:
+
+![](56b1abce13e7e.jpg)
+
+删除:删除选中的转换项目。会弹出删除确定面板:
+
+![](56b1abce322a2.jpg)
+
+同时删除包含:删除项目的同时删掉转换项目目录下的所有文件。
+
+不删除内容:只删除项目在工作区的引用,不真实删项目文件。
+
+项目属性:点击打开项目的属性配置界面:
+
+![](56b1abce99c22.jpg)
+
+浏览输出目录:点击直接打开转换项目目录。
+
+新建转换项目:功能同菜单->文件->新建转换项目。
+
+导入转换项目:功能同菜单->文件->导入转换项目。
+
+**标签页**
+
+![](56b1abced2c08.jpg)
+
+1:转换步骤:转换项目时的工作区,详见下文。
+
+2:转换信息:转换完项目后,代码文件与swf文件的转换情况报告在这里全部列出。
+
+3:语法差异:在as3代码转换到ts代码后,typescript与actionscript不兼容语法都在这里列出,可以对照提示逐条修改。详见后续文档的语法差异部分。
+
+4:API警告统计:转换过程中遇到的API或者不可转换的as3类在这里列出,详见后续文档如何手动修复此类警告信息。
+
+5:欢迎界面:转换工具的欢迎页。有转换项目、导入项目等快捷方式,示例项目,相关教程链接等。
+
+6:登陆:提供登陆和注册功能,登陆后可以特定身份提交bug反馈给官方。
+
+## 四、日志区
+
+![](56b1abcf53c29.jpg)
+
+ 日志区实时显示转换项目当前进度,log信息,提示信息等。
+
+## 五、转换步骤标签页:
+
+![](56b1abcf709b9.jpg)
+
+转换Flash项目:功能同工具栏->转换按钮
+
+编译Egret项目:功能同工具栏->编译按钮
+
+运行Egret项目:功能同工具栏->运行按钮
+
+## 六、转换率评估区
+
+![](56b1abcfbe8a8.jpg)
+
+* 代码文件转换率:as3文件到ts文件转换情况,每个as3的文件都会被转换对应的ts文件,语法从actionscript3转换为typescript的语法。这里显示了文件转换个数。点击条目会切换到”转换信息“页面,在这里可看到具体的哪个文件转换成功了,哪个转换失败了。
+
+* API转换率:统计了Flash的API转换到Egret过程中,API成功转换的个数和比例,此数值越高越好。点击条目会切换到“API警告统计”标签页。见“API警告统计”说明。
+
+* 类型识别率:统计了as3与ts在语法上类型转换一项上的个数统计与转换比例,此数值越高越好。点击条目会切换到“语法差异”。见“语法差异”说明。
+
+* swf文件转换率:swf文件被解析的个数统计。点击条目会切换到”转换信息“页面,在这里可看到具体的哪个文件转换成功了,哪个转换失败了。
+
+* 总体评价:对上述几项数值做出的综合评估,大体反应当前项目转换到egret的比例。此项数值越高越好,但也不表明100%就表示完全转换成功,不到100%就是转换失败,具体情况需视项目而论。
\ No newline at end of file
diff --git a/Conversion/questions/README.md b/Conversion/questions/README.md
new file mode 100644
index 0000000..a612c47
--- /dev/null
+++ b/Conversion/questions/README.md
@@ -0,0 +1,100 @@
+* EgretConversion适用范围
+
+使用Flash工具actionscript3.0语言开发的页游项目。
+
+通过EgretConversion的转换,可以把项目中as3代码转换为基于egret的typescript代码,把swf资源文件转换为egret项目可以使用的资源类型。
+
+* EgretConversion不适用范围
+
+暂不支持3D内容。
+
+暂不支持Starling项目。
+
+不支持flex组件及flash原生组件(fl下的组件)。
+
+不支持blendMode,遮罩。
+
+* EgretConversion需要的Egret Engine版本
+
+EC2.3.0支持egret2.0.5之前的版本,EC2.5+支持egret2.5+
+
+* 是否支持骨骼动画
+
+暂不支持
+
+* 可否使用第三方库
+
+必须使用开源的第三方,不支持第三方以SWC的方式使用。需要将三方库的源码放入项目中作为项目代码的一部分,如果SWC中有资源,需要提取出来改为用loader的方式加载使用。
+
+* 是否支持链接类,链接类命名有什么限制
+
+支持链接类,链接类命名规则无限制。
+
+* 是否支持中文路径和文件名
+
+支持。
+
+* 是否支持加密
+
+不支持加密过的swf文件解析,或者其他方式改写过swf。
+
+* 为什么swf中的矢量图在转换为Egret后有锯齿?
+
+swf中的矢量图在Egret端以位图的形式呈现,如果缩放则会出现模糊有锯齿的现象。现已默认开启图片的smoothing效果来抗锯齿。
+
+* 是否支持转换swf中的音频
+
+部分支持,可以导出库里的音频文件,暂不支持时间轴上的音频
+
+* 是否支持转换swf中的视频
+
+不支持
+
+* 是否支持swf中的帧代码
+
+不支持
+
+* 是否支持滤镜Filter
+
+不支持
+
+* 是否支持九切
+
+支持位图九切,支持矢量图形九切。
+
+* 是否支持文档类
+
+不支持swf的文档类。如果有文档类,把文档类与swf分离。
+
+* 是否支持embed标签
+
+支持嵌入图片和文本文件,不支持嵌入swf、字体、音频等。
+
+* 对文本的字体支持
+
+swf中的文本在转换之后都会使用设备字体来显示。不支持嵌入字,要使用嵌入字需要在egret项目中通过TextureMerger工具来制作。
+
+* 无法导入示例Demo?
+
+现象:点击欢迎界面的“导入示例项目”,选择示例项目,但工具卡住无法创建Egret项目。
+
+解决办法:1.检查是否安装了Egret。2.以管理员方式重新打开工具。
+
+* 是否支持as1、as2时代的项目
+
+大部分此类项目未经过测试。as1、as2时代的项目可以尝试转换,但是建议改写为as3项目再转
+
+* 是否支持老版swf资源(flash8以前avm1格式)
+
+一般支持,可以像使用avm2的swf那样使用。不过对于avm1编译的的swf(flash8以前版本),最好用Flash Pro或者CC重新导出为avm2格式,否则有可能无法分析其中一些资源。
+
+* 转换的swf文件在H5项目中使用
+
+转换swf得到的资源只能在egret项目中使用,不支持其他H5项目
+
+
+EgretConversion联系方式:
+
+官方QQ群:Egret Conversion VIP 249685517
+
+官方论坛:http://bbs.egret.com/forum.php?mod=forumdisplay&fid=70
\ No newline at end of file
diff --git a/Conversion/update/update201/LmDmsz1.jpg b/Conversion/update/update201/LmDmsz1.jpg
new file mode 100644
index 0000000..7d48a15
Binary files /dev/null and b/Conversion/update/update201/LmDmsz1.jpg differ
diff --git a/Conversion/update/update201/README.md b/Conversion/update/update201/README.md
new file mode 100644
index 0000000..b262b36
--- /dev/null
+++ b/Conversion/update/update201/README.md
@@ -0,0 +1,108 @@
+![](LmDmsz1.jpg)
+
+## Egret Conversion 2.0.1 特性解读
+
+Egret Conversion是一款可以快速的将现有的Flash项目转换到Egret HTML5项目的转换工具。随着 Egret Conversion 版本的不断迭代,其转换项目的成功率进一步提升。
+
+### 单文件转换
+
+在2.0.0以前的版本中我们有着非常多的需求是,转换一些功能相对独立的代码模块,如A*,通信库以及自定义的功能类等等,旧有的方法:
+
+1. 建立一个新的Flash项目。
+
+1. 复制所需代码到新的项目中。
+
+1. 新建一个转换项目导入Flash项目。
+
+1. 转换Flash项目-》编辑Egret项目-》运行
+
+我们每次都需要通过复杂的步骤去转换我们需要的一些功能模块或资源,现在通过单文件转换功能,我们可以非常方便的将ActionScript 3代码以及SWF转换为Egret项目所使用的语言或资源,不管从转换成本与调试成本都极大的提高了我们效率,通过拖拽方式进行便捷转换。友好反馈机制,可以了解到转换过程中一些问题所在,方便定位去修复问题。
+
+> 注意:这里指的单文件转换不只是单个文件,也可以是文件夹形式。
+
+### 支持Flash Pro项目
+
+通过Flash Pro建立的项目或文档类现在可以进行导入。
+
+![](wtBCdKy.png)
+
+现在Egret Conversion可以直接导入的项目包含Flash Pro、Flash Builder、FlashDeveloper以及自定义模式。自定义模式允许我们设置代码路径、AS启动类、资源路径三项来确定我们项目导入的基本参数。
+
+### 支持final public class的写法
+
+后续对于新添加语法分析的部分直接看代码比较直观,现在可以转换类似的代码:
+
+```
+package
+{
+ public final class Math
+ {
+ //...
+ }
+}
+```
+
+### 支持全局函数的写法
+
+```
+package starling.utils
+{
+ public function deg2rad(deg:Number):Number
+ {
+ return deg / 180.0 * Math.PI;
+ }
+}
+```
+
+### 支持全局变量的写法
+
+```
+package Math
+{
+ public var E:Number = 2.718 ;
+}
+```
+
+### 引擎更新
+
+Egret Conversion是基于Egret引擎最新版进行语法转换,有时候我们由于调试或其他原因,我们的引擎版本可能低于转换要求的版本。使我们转换出现一些问题,主要集中在缺少引擎新增API。 现在通过内部的检测机制给出提示信息定位问题:
+
+* 为保证转换项目正常运行,请更新 Egret Engine 到 2.0.n
+
+* 未找到Egret引擎,请安装Egret引擎
+
+### Retina屏幕适配
+
+### 需要手动解决的
+
+目前遇到的一些问题,不过这些问题都可以通过简单方式避免:
+
+1. int.MAXVALUE 转换后变成 number["MAXVALUE" + ""] 这个是要手动修改成 Number.MAX_VALUE 当然这样不能保证你的逻辑是对的。
+
+1. Socket 转换 后变成 WebSocket 的同时服务器也是要修改的,不然会出现 WebSocket connection to 'ws://xxx:8080/' failed: Connection closed before receiving a handshake response 握手失败。
+
+1. set、get同名方法子类重写会出现出错。目前需要规避这类写法。
+
+1. namespace 暂时不推荐使用。Retina屏幕适配与代码以及资源无关,主要是为了软件在一些高分屏(视网膜显示屏)提供更加友好的体验。其实从这里能看出团队对于用户的的态度。不过还是希望把重点放在对代码与资源的转换上。
+
+### 修复
+
+* [修复] ts 修改LoaderInfo.ts 资源重复加载
+
+* [修复]英文状态下Api详细提示界面排版错乱
+
+* [修复]修改导入项目不能转换项目
+
+* [修复]修改再次打开Egret Conversion 已创建项目运行报错
+
+* [修复]修复代码转换bug,跳过namespace导致的无法转换代码(代码转换遇到namespace 失败 ,转换继续进行)
+
+* [修复]单独转换swf卡死问题
+
+* [修复]修改再次打开Egret Conversion 已创建项目运行报错
+
+* [修复]修复代码转换bug,跳过namespace导致的无法转换代码
+
+* [优化]界面表格放缩异常
+
+* [优化]单独转换swf弹框增加提示信息,转换过程进度等
\ No newline at end of file
diff --git a/Conversion/update/update201/wtBCdKy.png b/Conversion/update/update201/wtBCdKy.png
new file mode 100644
index 0000000..8bd115b
Binary files /dev/null and b/Conversion/update/update201/wtBCdKy.png differ
diff --git a/Conversion/update/update220/566002be9965b.jpg b/Conversion/update/update220/566002be9965b.jpg
new file mode 100644
index 0000000..7d48a15
Binary files /dev/null and b/Conversion/update/update220/566002be9965b.jpg differ
diff --git a/Conversion/update/update220/566002beba851.png b/Conversion/update/update220/566002beba851.png
new file mode 100644
index 0000000..1dbbb88
Binary files /dev/null and b/Conversion/update/update220/566002beba851.png differ
diff --git a/Conversion/update/update220/566002bed5690.png b/Conversion/update/update220/566002bed5690.png
new file mode 100644
index 0000000..93e6598
Binary files /dev/null and b/Conversion/update/update220/566002bed5690.png differ
diff --git a/Conversion/update/update220/566002bee0d7a.png b/Conversion/update/update220/566002bee0d7a.png
new file mode 100644
index 0000000..348a548
Binary files /dev/null and b/Conversion/update/update220/566002bee0d7a.png differ
diff --git a/Conversion/update/update220/566002bef10be.png b/Conversion/update/update220/566002bef10be.png
new file mode 100644
index 0000000..1ca63b5
Binary files /dev/null and b/Conversion/update/update220/566002bef10be.png differ
diff --git a/Conversion/update/update220/566002bf0d586.png b/Conversion/update/update220/566002bf0d586.png
new file mode 100644
index 0000000..b701a9b
Binary files /dev/null and b/Conversion/update/update220/566002bf0d586.png differ
diff --git a/Conversion/update/update220/README.md b/Conversion/update/update220/README.md
new file mode 100644
index 0000000..d9a4511
--- /dev/null
+++ b/Conversion/update/update220/README.md
@@ -0,0 +1,67 @@
+![](566002be9965b.jpg)
+
+## Egret Conversion 2.2.0 特性解读
+
+在 Egret Conversion 进入2.0以来,团队更加注重优化用户体验,解决实际项目转换过程中遇到的问题。让我们一起来看看,刚刚发布的 Egret Conversion 2.2.0 带来了哪些优化和新功能来帮助我们把 Flash 项目转换成 Egret 项目吧。
+
+### 遇到类库需要升级怎么办?
+
+需要手动拷贝过去?不需要这么做。在新版本的 Egret Conversion 里,选择项目,如果需要升级类库的话将会有下面的提示:
+
+![](566002beba851.png)
+
+点击更新项目配置,工具会将旧项目升级到最新的工具类库。Egret Conversion 新增的检测项目类库是否需要升级并给出提示的功能,方便我们在转换过程中快速定位到问题所在,并轻松解决之。同样的,在其他方面 Egret Conversion 2.2.0 也做出了相应的优化改善。
+
+### 优化的swf转换工具
+
+单swf文件导出资源增加识别项目源码中swf的能力,项目源代码路径下swf可通过SWF转换工具(SWFExporter)直接生成到egret资源目录下。
+
+![](566002bed5690.png)
+
+遇到坑了怎么办呢?在日志区域打印着转换的过程,我们可以直接看到遇到了哪些坑,是否能跳过去。
+
+![](566002bee0d7a.png)
+
+上面我拖拽了两个swf文件,可以看到头一个转换成功,并且输出到了相关文件夹下。第二个文件告诉我转换失败,并不是一个swf文件。看来我要检查一下我的文件本身了。转换成功的文件我就可以在 egret 项目中使用了。
+
+### 提升转出项目的质量
+
+我们把 Flash 项目转换成 egret 项目之后,当然要先看看转换的效果如何。为了提高转出项目的质量 Egret Conversion 2.2.0 修复和优化了很多内容:
+
+* 动态文本颜色只显示白色的bug修复,现在可以显示正确的颜色了。
+
+* 动画播放过程中跳动现象已修复。
+
+* 优化了动画播放性能,增加了缓存机制。
+
+* UI对复杂多层级面板支持更好。
+
+### 新特性
+
+* 增加对位图填充矢量图形的支持,完美支持填充的位图缩放、旋转及打散后使用部分图形。
+
+* 静态文本使用字形字体,不再导出为图片。统一转换为使用设备字体,以提升效率和支持文字着色。
+
+### 发布项目
+
+现在可以直接将转换好的 egret 项目发布出来了。
+
+![](566002bef10be.png)
+
+转换 Flash 项目到 egret 项目之后可以编译-运行 egret 项目来查看效果。之后可以直接点击上面的发布按钮来发布一份 html5 版本的项目啦。
+
+![](566002bf0d586.png)
+
+上面就是刚刚发布出来的html5项目。
+
+#### Egret Conversion 还在不断完善当中
+
+Egret Conversion 2.2.0 还修优化了很多地方,比如大幅减少了工具卡死闪退等。
+
+Egret Conversion 还在不断完善当中,希望您能留下宝贵意见。
+
+EgretConversion联系方式:
+
+官方QQ群:Egret Conversion VIP 249685517
+
+官方论坛:http://bbs.egret.com/forum.php?mod=forumdisplay&fid=70
\ No newline at end of file
diff --git a/Conversion/update/update253/README.md b/Conversion/update/update253/README.md
new file mode 100644
index 0000000..436bbe5
--- /dev/null
+++ b/Conversion/update/update253/README.md
@@ -0,0 +1,8 @@
+Egret Conversion v2.5.3
+
+更新日志
+
+[更新]对engine 3.0.5的支持。
+[修复]修复 BitmapData 的 BUG。
+Windows版本下载
+Mac版本下载
\ No newline at end of file
diff --git a/Conversion/whitePaper/56b1ab7e9c3df.jpg b/Conversion/whitePaper/56b1ab7e9c3df.jpg
new file mode 100644
index 0000000..06df8b7
Binary files /dev/null and b/Conversion/whitePaper/56b1ab7e9c3df.jpg differ
diff --git a/Conversion/whitePaper/56b1ab7ed42f8.png b/Conversion/whitePaper/56b1ab7ed42f8.png
new file mode 100644
index 0000000..4ef2b8d
Binary files /dev/null and b/Conversion/whitePaper/56b1ab7ed42f8.png differ
diff --git a/Conversion/whitePaper/56b1ab7f293c3.png b/Conversion/whitePaper/56b1ab7f293c3.png
new file mode 100644
index 0000000..18b6492
Binary files /dev/null and b/Conversion/whitePaper/56b1ab7f293c3.png differ
diff --git a/Conversion/whitePaper/56b1ab7fb9336.jpg b/Conversion/whitePaper/56b1ab7fb9336.jpg
new file mode 100644
index 0000000..e1d5ffd
Binary files /dev/null and b/Conversion/whitePaper/56b1ab7fb9336.jpg differ
diff --git a/Conversion/whitePaper/56b1ab7fd7fa7.png b/Conversion/whitePaper/56b1ab7fd7fa7.png
new file mode 100644
index 0000000..9281586
Binary files /dev/null and b/Conversion/whitePaper/56b1ab7fd7fa7.png differ
diff --git a/Conversion/whitePaper/56b1ab8004933.png b/Conversion/whitePaper/56b1ab8004933.png
new file mode 100644
index 0000000..ec377e1
Binary files /dev/null and b/Conversion/whitePaper/56b1ab8004933.png differ
diff --git a/Conversion/whitePaper/56b1ab80266aa.png b/Conversion/whitePaper/56b1ab80266aa.png
new file mode 100644
index 0000000..dbe36a4
Binary files /dev/null and b/Conversion/whitePaper/56b1ab80266aa.png differ
diff --git a/Conversion/whitePaper/56b1ab805b4a6.png b/Conversion/whitePaper/56b1ab805b4a6.png
new file mode 100644
index 0000000..18b6492
Binary files /dev/null and b/Conversion/whitePaper/56b1ab805b4a6.png differ
diff --git a/Conversion/whitePaper/56b1ab8075879.png b/Conversion/whitePaper/56b1ab8075879.png
new file mode 100644
index 0000000..ca2e847
Binary files /dev/null and b/Conversion/whitePaper/56b1ab8075879.png differ
diff --git a/Conversion/whitePaper/56b1ab80979fd.png b/Conversion/whitePaper/56b1ab80979fd.png
new file mode 100644
index 0000000..dba6ba2
Binary files /dev/null and b/Conversion/whitePaper/56b1ab80979fd.png differ
diff --git a/Conversion/whitePaper/README.md b/Conversion/whitePaper/README.md
new file mode 100644
index 0000000..f32decf
--- /dev/null
+++ b/Conversion/whitePaper/README.md
@@ -0,0 +1,148 @@
+Version 2.0.0
+
+Egret Technology
+
+Egret Conversion 2.0 产品白皮书
+
+2015年7月
+
+![](56b1ab7ed42f8.png)
+
+**Egret Conversion 2.0 产品白皮书**
+
+## 什么是Egret Conversion 2.0?
+
+Egret Conversion是白鹭时代推出的一款重要产品,可以快速的将现有的Flash项目转换到Egret HTML5项目。界面友好易用,无需其他工具的辅助。功能强大可扩展,支持AS3各种复杂语法特性,涵盖绝大部分的Flash API,并且支持swf资源的直接转换。
+
+随着Flash技术移动版的缺失和HTML5市场的不断成熟,越来越多的Flash项目需要向HTML5平台迁移转换。而Flash工程师更加迫切的需要选择一款高效易用,成熟度和认可度高的HTML5引擎作为技术移植和项目转换的目标。
+
+Egret Conversion提供的是一整套的项目转换解决方案。不仅能够帮助开发者高效的迁移Flash项目,而且提供后期项目优化和维护的高效解决方案;不仅帮助生成Egret HTML5项目,还可以帮助转换后的项目更好的接入HTML5整个生态渠道,享受更好的后期服务。
+
+Egret Conversion的产品特性:
+
+* 集成化界面,转换过程的所有操作均在这一个工具中完成。通过自带的demo项目可迅速了解整个转换流程。
+
+* 支持99%的AS3语法特性,甚至包括Embed等标签,Dictionary,XML,For each...
+
+* 对Flash API的支持达到90%以上。
+
+* API定制功能可以轻松自行扩展尚未支持的API,无需等待新版本的发布。
+
+* 轻松扩展第三方库。可用工具快速转换第三方库。
+
+* 对swf强大的支持,支持直接转换swf资源。对位图、文本、SimpleButton、矢量动画、帧动画、声音等常用类型有良好的支持。
+
+* 支持动态创建链接类对象。
+
+* 转换过程全面的智能提示。
+
+* 丰富详尽的转换结果报告,包括语法兼容性及转换率报告,API转换和警告列表,类型提示列表报告,资源转换报告等。
+
+
+
+## Egret Conversion 2.0能用来做什么?
+
+ 1. 转换AS3项目到Egret HTML5项目。
+
+ 2. 转换Flash第三方类库、个人类库到Egret HTML5项目。
+
+ 3. 支持使用Flash制作的swf资源转换成Egret可用的资源。
+
+ 4. 支持位图,动画,矢量等单个资源的转换。
+
+
+
+## 为什么选择Egret Conversion 2.0?
+
+### 1. 强大的HTML5游戏引擎Egret Engine
+
+* Flash页游领域是个成熟的市场,有很多成功优秀的案例。随着Flash移动版的缺失和HTML5市场的逐渐火爆,大量优秀的传统Flash项目需要快速低成本的往移动端迁移。而Flash开发者也需要寻找一个市场覆盖广,熟识度高,易上手的引擎做项目的平台迁移。
+
+* 白鹭引擎Egret Engine为HTML5而生,引领H5游戏整个生态的发展,其基于TypeScript语言封装的语法结构与Flash AS3非常相似,所以Egret成为Flash开发者在做项目转换时考虑的首选方向。
+
+### 2. 项目转换功能的强大
+
+* 支持AS3的绝大部分语法结构,类、接口、函数、各种语句、操作符等。
+
+* 支持AS3的特殊语法结构和类型,如Embed、for each和XML、Dictionary等。
+
+* 支持Flash制作的swf资源的转换。
+
+### 3. 简洁的操作,实现高效转换
+
+无需任何配置,从打开Egret Conversion 2.0到转换完成一个Egret项目只需简单几步操作即可。
+
+![](56b1ab7e9c3df.jpg)
+
+### 4. 全面友好的提示,支持错误的快速定位和解决
+
+简洁的转换率报表让你了解整体的转换情况。
+
+![](56b1ab7f293c3.png)
+
+在转换过程中不可避免的会出现Flash和Egret不兼容的地方,比如语法兼容性问题,API兼容性问题,这些都不用你担心,工具会告诉你问题出在哪,只要按照我们建议的方案修改即可。
+
+### 5. 强大的后续Egret项目调优,打包,发布以及运营的一站式解决方案的支持
+
+选择了Egret Conversion 2.0就是选择了Egret HTML5工具流和发布平台解决方案,从产品研发,项目转换,调试优化,打包发布到上线运营,一站式解决方案,解决后顾之忧。
+
+转换后的Egret项目运行在集成Runtime的渠道平台上,将获得接近于原始页游项目的性能体验。Egret开放平台更可以帮助转换后的项目迅速接入HTML5主流渠道,实现流量变现。
+
+![](56b1ab7fb9336.jpg)
+
+## Egret Conversion 2.0 入门
+
+**使用Egret Conversion 2.0之前需要先下载更新Egret Engine 最新版本。从官网下载Egret Engine:[http://www.egret.com/products/engine.html](http://www.egret.com/products/engine.html)**
+
+* 新建一个转换项目
+
+![](56b1ab7fd7fa7.png)
+
+点击确定后会在输出路径D:\ConversionOut下创建一个名为EgretGame的Egret项目,并且Copy一些必要的配置文件到D:\ConversionOut\config目录下。
+
+* 点击转换按钮
+
+![](56b1ab8004933.png)
+
+1) 源码转换。工具会根据已写好的语法转换规则和D:\ConversionOut\config目录下的API映射关系转换as3源码到D:\ConversionOut\EgretGame\src目录下。
+
+2) 资源拷贝。自动copy Flash项目输出目录(如bin-debug)下的资源文件,如png、xml、txt等文件,到D:\ConversionOut\EgretGame\对应的目录下。
+
+3) swf资源转换。转换Flash项目输出目录下的swf资源文件,并生成对应的资源到D:\ConversionOut\EgretGame\resources\对应的目录下
+
+在上面的每一个过程中都会输出日志到主界面下面的日志面板中:
+
+![](56b1ab80266aa.png)
+
+并且生成一个转换统计结果:
+
+![](56b1ab805b4a6.png)
+
+统计结果的每一项都会反映当前项目的转换概况。
+
+* 点击编译按钮
+
+![](56b1ab8075879.png)
+
+点击后工具会调用Egret Engine的build命令,编译转换后的Egret项目。
+
+编译的错误提示会在日志窗口显示出来。
+
+* 点击运行按钮
+
+![](56b1ab80979fd.png)
+
+点击后工具会调用Egret Engine的run命令,可以在浏览器中预览Egret项目效果。
+
+更加详细的Egret Conversion 2.0使用方法请参考:[http://edn.egret.com/cn/](http://edn.egret.com/cn/)
+
+更多信息
+
+Egret官方网站 [http://www.egret.com](http://www.egret.com)
+
+Egret Conversion 2.0产品页 [http://www.egret.com/products-conversion](http://www.egret.com/products-conversion)
+
+开发者中心 [http://edn.egret.com/cn/](http://edn.egret.com/cn/)
+
+
+
diff --git a/DB/dbLibs/5foramt/README.md b/DB/dbLibs/5foramt/README.md
new file mode 100644
index 0000000..2d8e965
--- /dev/null
+++ b/DB/dbLibs/5foramt/README.md
@@ -0,0 +1,347 @@
+
+```javascript
+{
+ // DragonBones 数据名称
+ "name": "dragonBonesName",
+ // 数据版本
+ "version": "5.0",
+ // 兼容版本
+ "compatibleVersion": "4.5",
+ // 动画帧频
+ "frameRate": 24,
+ // 自定义数据 (可选属性 默认: null)
+ "userData": null,
+ // 骨架列表
+ "armature": [{
+ // 骨架名称 (一个 DragonBones 数据可包含多个骨架)
+ "name": "armatureName",
+ // 动画帧频 (可选属性 默认: 使用全局帧频)
+ "frameRate": 24,
+ // 动画类型 (可选属性 默认: "Armature")
+ // ["Armature": 骨骼动画, "MovieClip": 基本动画, "Stage": 场景动画]
+ "type": "Armature",
+ // 自定义数据 (可选属性 默认: null)
+ "userData": null,
+ // 添加到舞台后的默认行为列表 (可选属性 默认: null)
+ "defaultActions": [
+ // 此骨架播放指定动画
+ ["gotoAndPlay", "animationName"],
+ // 此骨架播放指定动画并停止
+ ["gotoAndStop", "animationName"],
+ ],
+ // 此骨架包含的骨骼列表
+ "bone": [{
+ // 骨骼名称
+ "name": "boneName",
+ // 父级骨骼的名称
+ "parent": "parentBoneName",
+ // 自定义数据 [任何类型] (可选属性 默认: null)
+ "userData": null,
+ // 骨骼注册到骨架的位移/ 斜切/ 缩放 (可选属性 默认: null)
+ "transform": {
+ "x": 0.00, // 水平位移 (可选属性 默认: 0.00)
+ "y": 0.00, // 垂直位移 (可选属性 默认: 0.00)
+ "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000)
+ "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000)
+ "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ "scY": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ }
+ }],
+ // 此骨架包含的插槽列表
+ "slot": [{
+ // 插槽名称
+ "name": "slotName",
+ // 插槽所属的骨骼名称
+ "parent": "parentBoneName",
+ // 默认显示对象的索引 (可选属性 默认: 0)
+ "displayIndex": 0,
+ // 混合模式 (可选属性 默认: null)
+ "blendMode": null,
+ // 自定义数据 [任何类型] (可选属性 默认: null)
+ "userData": null,
+ // 显示对象的颜色叠加 (可选属性 默认: null)
+ "color": {
+ "aM": 100, // 透明叠加 [0~100] (可选属性 默认: 100)
+ "rM": 100, // 红色叠加 [0~100] (可选属性 默认: 100)
+ "gM": 100, // 绿色叠加 [0~100] (可选属性 默认: 100)
+ "bM": 100, // 蓝色叠加 [0~100] (可选属性 默认: 100)
+ "aO": 0.00, // 透明偏移 [-255~255] (可选属性 默认: 0)
+ "rO": 0.00, // 红色偏移 [-255~255] (可选属性 默认: 0)
+ "gO": 0.00, // 绿色偏移 [-255~255] (可选属性 默认: 0)
+ "bO": 0.00, // 蓝色偏移 [-255~255] (可选属性 默认: 0)
+ },
+ // 添加到舞台后的行为列表 (可选属性 默认: null)
+ "actions": [
+ // 子骨架播放指定动画 (仅对显示对象为骨架时有效)
+ ["gotoAndPlay", "animationName"],
+
+ // 子骨架播放指定动画并停止 (仅对显示对象为骨架时有效)
+ ["gotoAndStop", "animationName"],
+ ]
+ }],
+ // 此骨架包含的皮肤列表
+ "skin": [{
+ // 皮肤名称
+ "name": "skinName",
+ // 此皮肤包含的插槽列表
+ "slot": [{
+ // 插槽名称
+ "name": "slotName",
+ // 此插槽包含的显示对象列表
+ "display": [{
+ // 显示对象名称
+ "name": "displayName",
+ // 显示对象类型 (可选属性 默认: "image")
+ // ["image": 贴图, "armature": 骨架, "mesh": 网格, "boundingBox": 包围盒, ... 其他扩展的类型]
+ "type": "image",
+ // 子骨架指向的骨架名、网格包含的贴图名 (可选属性 默认: null, 仅对子骨架、网格有效)
+ "path": "path",
+ // 共享网格的索引 (可选属性 默认: null, 仅对网格有效)
+ "share": "meshName",
+ // 是否继承动画 (可选属性 默认: true, 仅对共享网格有效)
+ "inheritFFD": true,
+ // 包围盒类型 (可选属性 默认: "rectangle", 仅对包围盒有效)
+ // ["rectangle": 矩形, "ellipse": 椭圆, "polygon": 自定义多边形]
+ "subType": "rectangle",
+ // 显示对象颜色 (可选属性 默认: 0, 仅对包围盒有效)
+ "color": 0,
+ // 显示对象相对于骨骼的位移/ 斜切/ 缩放 (可选属性 默认: null)
+ "transform": {
+ "x": 0.00, // 水平位移 (可选属性 默认: 0.00)
+ "y": 0.00, // y 垂直位移 (可选属性 默认: 0.00)
+ "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000)
+ "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000)
+ "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ "scY": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ },
+ // 显示对象的轴点 (可选属性 默认: null, 对骨架无效)
+ "pivot": {
+ "x": 0.50, // 水平轴点 [0.00~1.00] (可选属性 默认: 0.50)
+ "y": 0.50, // 垂直轴点 [0.00~1.00] (可选属性 默认: 0.50)
+ },
+ // 矩形或椭圆的宽高 (可选属性 默认: 0, 仅对包围盒有效),
+ "width": 100, "height": 100,
+ // 顶点相对显示对象轴点的坐标列表 (可选属性 默认: null, 仅对网格或自定义多边形包围盒有效)
+ // [x0, y0, x1, y1, ...]
+ "vertices": [-64.00, -64.00, 64.00, -64.00, 64.00, 64.00, -64.00, 64.00],
+ // 顶点的 UV 坐标列表 (可选属性 默认: null, 仅对网格有效)
+ // [u0, v0, u1, v1, ...]
+ "uvs": [0.0000, 0.0000, 1.0000, 0.0000, 1.0000, 1.0000, 0.0000, 1.0000],
+ // 三角形顶点索引列表 (可选属性 默认: null, 仅对网格有效)
+ "triangles": [0, 1, 2, 2, 3, 0],
+ // 顶点权重列表 (可选属性 默认: null, 仅对网格有效)
+ // [骨骼数量, 骨骼索引, 权重, ..., ...]
+ "weights": [1, 0, 1.00, 2, 0, 0.50, 1, 0.50],
+ // 蒙皮插槽注册的矩阵变换 (可选属性 默认: null, 仅对网格有效)
+ // [a, b, c, d, tx, ty]
+ "slotPose": [1.0000, 0.0000, 0.0000, 1.0000, 0.00, 0.00],
+ // 蒙皮骨骼注册的矩阵变换 (可选属性 默认: null, 仅对网格有效)
+ // [骨骼索引, a, b, c, d, tx, ty, ...]
+ "bonePose": [0, 1.0000, 0.0000, 0.0000, 1.0000, 0.00, 0.00]
+ }]
+ }]
+ }],
+ // 此骨架包含的 ik 约束列表
+ "ik": [{
+ // ik 约束名称
+ "name": "ikName",
+ // 绑定骨骼的名称
+ "bone": "boneName",
+ // 目标骨骼的名称
+ "target": "ikBoneName",
+ // 弯曲方向 (可选属性 默认: true)
+ // [true: 正方向/ 顺时针, false: 反方向/ 逆时针]
+ "bendPositive": true,
+ // 骨骼链的长度 (可选属性 默认: 0)
+ // [0: 只约束 bone, n: 约束 bone 及 bone 向上 n 级的父骨骼]
+ "chain": 0,
+ // 权重 [0.00: 不约束 ~ 1.00: 完全约束] (可选属性 默认: 1.00)
+ "weight": 1.00
+ }],
+ // 此骨架包含的动画列表
+ "animation": [{
+ // 动画名称
+ "name": "animationName",
+ // 循环播放次数 [0: 循环播放无限次, n: 循环播放 n 次] (可选属性 默认: 1)
+ "playTimes": 1,
+ // 动画帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 此动画包含的关键帧列表 (可选属性 默认: null)
+ "frame": [{
+ // 帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 帧声音 (可选属性 默认: null)
+ "sound": "soundName",
+ // 帧事件列表 (可选属性 默认: null)
+ "events": [{
+ // 事件名称
+ "name": "eventName",
+ // 骨骼名称 (可选属性 默认: null)
+ "bone": "boneName",
+ // 插槽名称 (可选属性 默认: null)
+ "slot": "slotName",
+ // 事件参数列表 (可选属性 默认: null)
+ "ints":[0, 1, 2],
+ "floats":[0.01, 1.01, 2.01],
+ "strings":["a", "b", "c"]
+ }],
+ // 帧行为列表 (可选属性 默认: null)
+ "actions": [
+ // 此骨架播放指定动画
+ ["gotoAndPlay", "animationName"],
+ // 此骨架播放指定动画并停止
+ ["gotoAndStop", "animationName"],
+ ]
+ }],
+
+ // 深度排序时间轴
+ "zOrder": {
+ "frame": [{
+ // 帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 插槽偏移 [slotIndexA, offsetA, slotIndexB, offsetB, ...] (可选属性 默认: null)
+ "zOrder": [0, 2, 4, 1, 6, -1]
+ }]
+ },
+
+ // 此动画包含的骨骼时间轴列表 (可选属性 默认: null)
+ "bone": [{
+ // 时间轴名称 (与骨骼名称对应)
+ "name": "boneName",
+ // 时间轴缩放 (可选属性 默认: 1.00)
+ "scale": 1.00,
+ // 时间轴偏移 (可选属性 默认: 0.00)
+ "offset": 0.00,
+ // 此时间轴包含的关键帧列表 (可选属性 默认: null)
+ "frame": [{
+ // 帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 缓动类型 [0: 由 tweenEasing 或 curve 描述缓动类型,1~N: 其他扩展缓动类型枚举(具体如何枚举未来再定义)] (可选属性 默认: 0)
+ "tweenType": 0,
+ // 缓动值 [0.00: 线性, null: 无缓动] (可选属性 默认: null)
+ "tweenEasing": 0.00,
+ // 贝塞尔曲线缓动参数列表 [x1, y1, x2, y2, ...] (可选属性 默认: null)
+ "curve": [0.00, 0.00, 1.00, 1.00],
+ // 骨骼的位移/ 斜切/ 缩放 (可选属性 默认: null)
+ "transform": {
+ "x": 0.00, // 水平位移 (可选属性 默认: 0.00)
+ "y": 0.00, // 垂直位移 (可选属性 默认: 0.00)
+ "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000)
+ "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000)
+ "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ "scY": 1.0000 // 垂直缩放 (可选属性 默认: 1.0000)
+ },
+ }]
+ }],
+ // 此动画包含的插槽时间轴列表
+ "slot": [{
+ // 时间轴名称 (与插槽名称对应)
+ "name": "slotName",
+ // 此时间轴包含的关键帧列表 (可选属性 默认: null)
+ "frame": [{
+ // 帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 缓动类型 [0: 由 tweenEasing 描述缓动类型,N: 其他扩展缓动属性] (可选属性 默认: 0)
+ "tweenType": 0,
+ // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null)
+ "tweenEasing": 0.00,
+ // 补间缓动贝塞尔曲线 [x1, y1, x2, y2, ...] (可选属性 默认: null)
+ "curve": [0.00, 0.00, 1.00, 1.00],
+ // 此帧的显示对象索引 (皮肤中对应的插槽显示对象列表) (可选属性 默认: 0)
+ "displayIndex": 0,
+ // 显示对象的颜色叠加 (可选属性 默认: null)
+ "color": {
+ "aM": 100, // 透明叠加 [0~100] (可选属性 默认: 100)
+ "rM": 100, // 红色叠加 [0~100] (可选属性 默认: 100)
+ "gM": 100, // 绿色叠加 [0~100] (可选属性 默认: 100)
+ "bM": 100, // 蓝色叠加 [0~100] (可选属性 默认: 100)
+ "aO": 0.00, // 透明偏移 [-255~255] (可选属性 默认: 0)
+ "rO": 0.00, // 红色偏移 [-255~255] (可选属性 默认: 0)
+ "gO": 0.00, // 绿色偏移 [-255~255] (可选属性 默认: 0)
+ "bO": 0.00, // 蓝色偏移 [-255~255] (可选属性 默认: 0)
+ },
+ // 播放到当前帧时,执行的动作行为列表 (可选属性 默认: null)
+ "actions": [
+ // 子骨架播放指定动画 (仅对显示对象为骨架时有效)
+ ["gotoAndPlay", "animationName"],
+ // 子骨架播放指定动画并停止 (仅对显示对象为骨架时有效)
+ ["gotoAndStop", "animationName"],
+ ]
+ }],
+ }],
+ // 此动画包含的自由变形时间轴列表 (可选属性 默认: null)
+ "ffd": [{
+ // 时间轴名称 (与网格名称对应)
+ "name": "timelineName",
+ // 皮肤名称
+ "skin": "skinName",
+ // 插槽名称
+ "slot": "slotName",
+ // 此时间轴包含的关键帧列表 (可选属性 默认: null)
+ "frame": [{
+ // 帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 缓动类型 [0: 由 tweenEasing 描述缓动类型,N: 其他扩展缓动属性] (可选属性 默认: 0)
+ "tweenType": 0,
+ // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null)
+ "tweenEasing": 0.00,
+ // 补间缓动贝塞尔曲线 [x1, y1, x2, y2, ...] (可选属性 默认: null)
+ "curve": [0.00, 0.00, 1.00, 1.00],
+ // 顶点坐标列表索引偏移 (可选属性 默认: 0)
+ "offset": 0,
+ // 顶点坐标相对位移列表 [x0, y0, x1, y1, ...] (可选属性 默认: null)
+ "vertices": [0.01, 0.01]
+ }]
+ }]
+ }]
+ }]
+}
+```
+
+------------------------------
+# 5.0 相对 4.5 格式变化
+
+## Root
+* 增加 "compatibleVersion" 属性。
+* 删除 "isGlobal" 属性。
+ * 不再支持绝对坐标,只支持相对坐标,相当于isGlobal设置为0。
+ * isGlobal为1的情况(绝对坐标)只存在于使用2.3及以前的数据格式。
+ * 从3.0开始支持相对坐标,于是引入isGlobal属性用于向下兼容,同时支持相对坐标和绝对坐标。
+ * 从5.0开始不再支持绝对坐标。
+
+## Display
+* 增加 "path" 属性,与 name 区分,用于标识图片指向的贴图路径、Mesh包含的贴图路径或子骨架指向的骨架名。
+* name属性的意义变为display的唯一标示符,不再代表路径。
+
+## 支持包围盒
+* "display"的"type" 属性的值增加 "boundingBox" ,用于标记包围盒。
+* 包围盒类型的 display 会包含如下属性
+ * "subType" : 标记包围盒的类型,可能的值为"rectangle": 矩形, "ellipse": 椭圆, "polygon": 自定义多边形
+ * "width", "height": 宽高(仅对矩形或椭圆类型的包围盒生效)
+ * "vertices": 顶点列表(仅对自定义多边形类型的包围盒生效)
+
+## 支持共享网格(Linked Mesh)
+* 网格类型的Display增加 "share" 属性,可以通过设置share属性将之变为共享网格。
+* 共享网格可以通过 "inheritFFD" 属性控制共享网格是否继承主网格的FFD动画。
+
+## 支持动画中改变插槽的显示顺序(ZOrder)
+* "animation" 中增加 "zOrder" 属性,代表深度排序时间轴
+* "zOrder" 包含frames属性,代表时间轴上的关键帧列表。包含的每个关键帧对象会包含如下属性:
+ * "duration": 关键帧持续的长度。
+ * "zOrder": 该关键帧上zOrder需要变化的插槽以及变化的幅度组成的数组。
+
+## 事件统一由主时间轴抛出,支持多事件和事件参数列表
+* 去掉骨骼时间轴包含的关键帧的event属性。(版本升级的时候会把数据移动到主时间轴相同位置的关键帧上)
+* "animation" 的 "frame"(主时间轴包含的关键帧列表)包含的关键帧数据的 event 属性改为 "events", 表示需要在该帧上抛出的事件列表。
+* 事件对象包含如下属性
+ * "name": 事件名
+ * "bone": 抛出事件的骨骼,默认为null(原骨骼时间轴包含的事件,将把骨骼名记录在这里)
+ * "slot": 抛出事件的插槽,默认为null(该属性和上面的bone属性不可能同时存在,都不存在代表事件由骨架抛出)
+ * "ints": 整形参数列表
+ * "floats": 浮点形参数列表
+ * "strings": 字符串形参数列表
+
+## 增加更多缓动类型的定义
+* "frame"包含的关键帧数据增加 "tweenType" 属性。
+* "tweenType" 默认为0 代表由 tweenEasing 或 curve 描述缓动类型(和4.5一致)
+* "tweenType" 不为0 代表使用其他扩展缓动类型的枚举,具体每个枚举代表的意义未来再定义。
diff --git a/DB/dbLibs/animationSpeed/README.md b/DB/dbLibs/animationSpeed/README.md
new file mode 100644
index 0000000..20ca0af
--- /dev/null
+++ b/DB/dbLibs/animationSpeed/README.md
@@ -0,0 +1,26 @@
+有时在游戏的运行过程中,需要动态的改变动画的播放速度。DragonBones 提供了几种不同的方式,可以在不同的场景下,实现动画的变速效果。
+
+* 第一种:调节动画速度
+
+对时钟的调节一般是要影响一组动画。如果要直接调节某个动画的播放速度,DragonBones提供了更加直接的接口。直接调节animation中的timeScale属性即可。
+
+~~~javascript
+let armatureDisplay = factory.buildArmatureDisplay("Dragon");
+armatureDisplay.animation.timeScale = 0.5;
+~~~
+
+* 第二种:调节动画状态速度
+
+对动画速度的调节会影响到所有的动画状态,如果你只想调节角色动画中某一个动画状态的速度,则需要对播放动画之后产生的 AnimationState 实例进行操作。
+
+~~~javascript
+let armatureDisplay = factory.buildArmatureDisplay("Dragon");
+armatureDisplay.play("walk").timeScale = 0.5;
+~~~
+
+可以访问示例中心查看参考示例的效果和下载源码:
+* [DragonBones 在线演示](http://dragonbones.com/demo/index.html)
+* [DragonBones 事例源码](https://github.com/DragonBones/DragonBonesJS/tree/master/Egret/Demos)
+
+
+
diff --git a/DB/dbLibs/changeClothing/577f7e440fb58.png b/DB/dbLibs/changeClothing/577f7e440fb58.png
new file mode 100644
index 0000000..d052dba
Binary files /dev/null and b/DB/dbLibs/changeClothing/577f7e440fb58.png differ
diff --git a/DB/dbLibs/changeClothing/577f7e442a524.png b/DB/dbLibs/changeClothing/577f7e442a524.png
new file mode 100644
index 0000000..0ff4386
Binary files /dev/null and b/DB/dbLibs/changeClothing/577f7e442a524.png differ
diff --git a/DB/dbLibs/changeClothing/577f7e4445bba.png b/DB/dbLibs/changeClothing/577f7e4445bba.png
new file mode 100644
index 0000000..bac41a6
Binary files /dev/null and b/DB/dbLibs/changeClothing/577f7e4445bba.png differ
diff --git a/DB/dbLibs/changeClothing/577f7e4460b84.png b/DB/dbLibs/changeClothing/577f7e4460b84.png
new file mode 100644
index 0000000..0eb7a29
Binary files /dev/null and b/DB/dbLibs/changeClothing/577f7e4460b84.png differ
diff --git a/DB/dbLibs/changeClothing/README.md b/DB/dbLibs/changeClothing/README.md
new file mode 100644
index 0000000..707fc97
--- /dev/null
+++ b/DB/dbLibs/changeClothing/README.md
@@ -0,0 +1,76 @@
+# DragonBones局部换装与全局换装
+
+DragonBones 4.7中增加一些全新API,并提供全新的局部换装与整体换装功能。
+
+### 创建DragonBones动画新API
+
+`dragonBones.EgretFactory`中内置文件解析器,可以方便的设置骨骼动画数据,同时新增`buildArmatureDisplay`方法,快速获取骨骼动画所需要的显示对象。
+
+```
+//定义dragonBones.EgretFactory对象
+private factory:dragonBones.EgretFactory;
+
+this.factory = new dragonBones.EgretFactory();
+this.factory.parseDragonBonesData(RES.getRes("man_json"));
+this.factory.parseTextureAtlasData(RES.getRes("man_texture_json"), RES.getRes("man_texture_png"));
+
+//直接生成骨骼动画显示对象,该对象实现IArmatureDisplay接口
+var ar:dragonBones.EgretArmatureDisplay = this.factory.buildArmatureDisplay("man");
+ar.animation.play("runFront",0);
+ar.x = 200;
+ar.y = 800;
+this.addChild( ar );
+```
+
+`dragonBones.EgretArmatureDisplay`对象会自动绑定`WorkClock`,无需手动添加。
+
+运行后效果如图:
+
+![](db1.png)
+
+### 局部换装
+
+原有换装方案,可以替换对应slot中的图片实现,但会存在图片位置错位问题。新版本局部换装功能,可通过DragonBones预设置替换内容实现此功能。
+
+原始动画如下:
+
+![](db2.png)
+
+我们可以替换其头发的内容,新建一个DragonBones项目,将新头发加入其资源库,然后放入场景中。
+
+具体替换创建新项目的原因在于获取图片轴点与骨骼原点的相对位置。
+
+在新项目中调整好头发的位置后,导出数据。
+
+![](db3.png)
+
+在上面的代码中继续添加如下代码。
+
+```
+this.factory.parseDragonBonesData(RES.getRes("new_json"));
+this.factory.parseTextureAtlasData(RES.getRes("new_texture_json"), RES.getRes("new_texture_png"));
+
+this.factory.replaceSlotDisplay( "NewProject", "Armature", "ti", "bb", ar.armature.getSlot("Atoufa"));
+```
+
+通过`replaceSlotDisplay`方法来替换其中头发的内容,其中第一个参数为DragonBonesName,如果你在解析DragonBones数据时为添加其参数,那么该参数可以填写`null`或者填写项目名称。
+
+后面三个参数均为数据源标记,最后一个参数则是要替换的目标slot。
+
+编译后运行效果如图:
+
+![](db4.png)
+
+**你可以在新项目中放置多个即将替换的纹理素材,然后在局部替换时,选择你所需要的贴图纹理。**
+
+### 全局换装
+
+全局换装可实现将一个骨骼动画的骨架中全部贴图替换,如果使用全局换装功能,则新骨骼动画纹理集与源骨骼动画纹理集必须尺寸以及内部元素尺寸相同。
+
+你可以使用如下代码来进行全局换装
+
+```
+ar.armature.replaceTexture(RES.getRes("new_db_texture_png"));
+```
+
+
diff --git a/DB/dbLibs/copy/README.md b/DB/dbLibs/copy/README.md
new file mode 100644
index 0000000..bf7ac10
--- /dev/null
+++ b/DB/dbLibs/copy/README.md
@@ -0,0 +1,39 @@
+在做大型游戏项目时,我们可能会为不同的角色设计相同的动画。这种情况下,可以利用 DragonBones 的动画复用功能,轻松实现这个需求。
+DragonBones 的动画复用功能够把同名骨骼的动画数据从一个骨架拷贝到另一个骨架中。
+
+正常播放两个骨骼动画代码如下:
+
+~~~javascript
+let egretFactory = dragonBones.EgretFactory.factory;
+
+egretFactory.parseDragonBonesData(RES.getRes("DragonBonesDataA"));
+egretFactory.parseTextureAtlasData(RES.getRes("TextureAtlasDataA"), RES.getRes("TextureAtlasA"));
+
+egretFactory.parseDragonBonesData(RES.getRes("DragonBonesDataB"));
+egretFactory.parseTextureAtlasData(RES.getRes("TextureAtlasDataB"), RES.getRes("TextureAtlasB"));
+
+// let armatureDisplayA = egretFactory.buildArmatureDisplay("armatureA");
+// this.addChild(armatureDisplayA);
+// armatureDisplayA.x = 200;
+// armatureDisplayA.y = 300;
+// armatureDisplayA.scaleX = 0.5;
+// armatureDisplayA.scaleY = 0.5;
+
+let armatureDisplayB = egretFactory.buildArmatureDisplay("armatureB");
+this.addChild(armatureDisplayB);
+armatureDisplayB.x = 200;
+armatureDisplayB.y = 300;
+armatureDisplayB.scaleX = 0.5;
+armatureDisplayB.scaleY = 0.5;
+
+egretFactory.copyAnimationsToArmature(armatureDisplayB, "armatureA");
+
+armatureDisplayB.animation.play("animationName");
+~~~
+
+使用 `Factory` 中的 `copyAnimationsToArmature` 方法可实现该效果。
+`copyAnimationsToArmature` 方法第一个参数为接收动画数据的骨架,第二个参数为被拷贝动画数据的骨架名称。
+
+可以访问示例中心查看参考示例的效果和下载源码:
+* [DragonBones 在线演示](http://www.dragonbones.com/demo/egret/animation_copy_test/index.html)
+* [DragonBones 事例源码](https://github.com/DragonBones/DragonBonesJS/blob/master/Egret/Demos/src/demo/AnimationCopyTest.ts)
diff --git a/DB/dbLibs/createAnimation/55937e0a59ba9.zip b/DB/dbLibs/createAnimation/55937e0a59ba9.zip
new file mode 100644
index 0000000..debd9a0
Binary files /dev/null and b/DB/dbLibs/createAnimation/55937e0a59ba9.zip differ
diff --git a/DB/dbLibs/createAnimation/56c3144fce23f.png b/DB/dbLibs/createAnimation/56c3144fce23f.png
new file mode 100644
index 0000000..dfaf7c5
Binary files /dev/null and b/DB/dbLibs/createAnimation/56c3144fce23f.png differ
diff --git a/DB/dbLibs/createAnimation/56c314504fd66.png b/DB/dbLibs/createAnimation/56c314504fd66.png
new file mode 100644
index 0000000..dd092a6
Binary files /dev/null and b/DB/dbLibs/createAnimation/56c314504fd66.png differ
diff --git a/DB/dbLibs/createAnimation/README.md b/DB/dbLibs/createAnimation/README.md
new file mode 100644
index 0000000..441aa0a
--- /dev/null
+++ b/DB/dbLibs/createAnimation/README.md
@@ -0,0 +1,52 @@
+首先从DragonBones Pro中导出一份骨骼动画数据。你可以点击下面的连接下载。
+
+[Robot.zip](55937e0a59ba9.zip)
+
+我们通过Res Depot工具将资源中的`texture.png`,`texture.json`和`RobotGame_1.json` 添加到项目组中。
+
+使用RES模块加载资源完成后,可以创建基于DragonBones的骨骼动画。
+
+实例化DragonBones所需要的数据。
+
+~~~ javascript
+var dragonbonesData = RES.getRes( "RobotGame_1_json" );
+var textureData = RES.getRes( "texture_json" );
+var texture = RES.getRes( "texture_png" );
+~~~
+
+DragonBones动画由工厂类进行管理,可以使用EgretFactory对象来处理所有的动画数据以及贴图。
+步骤如下:
+
+1. 解析外部数据,并添加至EgretFactory中
+2. 设置动画中绑定的贴图
+
+~~~ javascript
+let egretFactory: dragonBones.EgretFactory = dragonBones.EgretFactory.factory;
+egretFactory.parseDragonBonesData(dragonbonesData);
+egretFactory.parseTextureAtlasData(textureData, texture);
+~~~
+
+数据准备好后,需要从数据中提取出需要的骨架系统。在DragonBones中,骨架有多个骨骼组成。每个骨架中绑定了当前骨架的动画数据。
+
+`let armatureDisplay: dragonBones.EgretArmatureDisplay = egretFactory.buildArmatureDisplay("robot");`
+
+通过`buildArmatureDisplay`方法,我们提取名称为`robot`的骨架。要想在舞台中看到该骨架,我们需要将其显性的添加到的舞台当中,可以使用下面语句。
+
+~~~ javascript
+this.addChild(armatureDisplay);
+armatureDisplay.x = 200;
+armatureDisplay.y = 300;
+armatureDisplay.scaleX = 0.5;
+armatureDisplay.scaleY = 0.5;
+
+armatureDisplay.animation.play("Walk");
+~~~
+
+`armatureDisplay`是名称为`robot`的骨架对象的显示对象。将其添加到显示列表中,就可以在舞台中看到当前提取的机器人。效果如图:
+
+![](56c3144fce23f.png)
+
+需要播放的动画名称,可参考下图,在DragonBones Pro中,动画面板罗列了所有可播放的动画名称。
+
+![](56c314504fd66.png)
+
diff --git a/DB/dbLibs/createProject/README.md b/DB/dbLibs/createProject/README.md
new file mode 100644
index 0000000..0f6da27
--- /dev/null
+++ b/DB/dbLibs/createProject/README.md
@@ -0,0 +1,46 @@
+DragonBones作为Egret引擎的扩展库已经集成在安装包中。如果你的项目需要使用到DragonBones,需要在项目配置中开启DragonBones配置项。操作步骤如下:
+
+1、新建 Egret项目
+
+2、修改项目中的 egretProperties.json文件
+
+在配置文件中,找到modules标签,添加DragonBones绑定项。
+
+```
+"name": "dragonbones"
+```
+
+添加后配置内容如下:
+
+~~~ javascript
+"modules": [
+ {
+ "name": "egret"
+ },
+ {
+ "name": "game"
+ },
+ {
+ "name": "tween"
+ },
+ {
+ "name": "res"
+ },
+ {
+ "name": "dragonbones"
+ }
+]
+~~~
+
+3、重新编译项目
+
+
+重新编译请执行 `egret build -e`
+
+通过上述三个步骤操作,你可以在项目中直接使用DragonBones。
+
+测试配置是否成功,可以使用下面语句进行调试。在控制台中直接打印出当前 DragonBones 的版本。
+
+```
+console.log(dragonBones.DragonBones.VERSION);
+```
diff --git a/DB/dbLibs/dataFormat/README.md b/DB/dbLibs/dataFormat/README.md
new file mode 100644
index 0000000..c9d07b7
--- /dev/null
+++ b/DB/dbLibs/dataFormat/README.md
@@ -0,0 +1,423 @@
+
## 4.5 数据格式标准说明
+```javascript
+{
+ // DragonBones 数据名称
+ "name": "dragonBonesName",
+ // 数据版本
+ "version": "4.5",
+ // 动画帧频
+ "frameRate": 24,
+ // 是否使用绝对数据 [0: 使用相对数据, 1: 使用绝对数据] (可选属性 默认: 1)
+ "isGlobal": 1,
+ // 骨架列表
+ "armature": [{
+ // 骨架名称 (一个 DragonBones 数据可包含多个骨架)
+ "name": "armatureName",
+ // 动画帧频 (可选属性 默认: 使用全局帧频)
+ "frameRate": 24,
+ // 动画类型 (可选属性 默认: "Armature")
+ // ["Armature": 骨骼动画, "MovieClip": 基本动画, "Stage": 场景动画]
+ "type": "Armature",
+ // 自定义数据 [任何类型] (可选属性 默认: null)
+ "userData": null,
+ // 添加到舞台后的默认行为列表 (可选属性 默认: null)
+ "defaultActions": [
+ // 此骨架播放指定动画
+ ["gotoAndPlay", "animationName"],
+ // 此骨架播放指定动画并停止
+ ["gotoAndStop", "animationName"],
+ ],
+ // 此骨架包含的骨骼列表
+ "bone": [{
+ // 骨骼名称
+ "name": "boneName",
+ // 父级骨骼的名称
+ "parent": "parentBoneName",
+ // 自定义数据 [任何类型] (可选属性 默认: null)
+ "userData": null,
+ // 骨骼注册到骨架的位移/ 斜切/ 缩放 (可选属性 默认: null)
+ "transform": {
+ "x": 0.00, // 水平位移 (可选属性 默认: 0.00)
+ "y": 0.00, // 垂直位移 (可选属性 默认: 0.00)
+ "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000)
+ "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000)
+ "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ "scY": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ }
+ }],
+ // 此骨架包含的插槽列表
+ "slot": [{
+ // 插槽名称
+ "name": "slotName",
+ // 插槽所属的骨骼名称
+ "parent": "parentBoneName",
+ // 默认显示对象的索引 (可选属性 默认: 0)
+ "displayIndex": 0,
+ // 混合模式 (可选属性 默认: null)
+ "blendMode": null,
+ // 自定义数据 [任何类型] (可选属性 默认: null)
+ "userData": null,
+ // 显示对象的颜色叠加 (可选属性 默认: null)
+ "color": {
+ "aM": 100, // 透明叠加 [0~100] (可选属性 默认: 100)
+ "rM": 100, // 红色叠加 [0~100] (可选属性 默认: 100)
+ "gM": 100, // 绿色叠加 [0~100] (可选属性 默认: 100)
+ "bM": 100, // 蓝色叠加 [0~100] (可选属性 默认: 100)
+ "aO": 0.00, // 透明偏移 [-255~255] (可选属性 默认: 0)
+ "rO": 0.00, // 红色偏移 [-255~255] (可选属性 默认: 0)
+ "gO": 0.00, // 绿色偏移 [-255~255] (可选属性 默认: 0)
+ "bO": 0.00, // 蓝色偏移 [-255~255] (可选属性 默认: 0)
+ },
+ // 添加到舞台后的行为列表 (可选属性 默认: null)
+ "actions": [
+ // 子骨架播放指定动画 (仅对显示对象为骨架时有效)
+ ["gotoAndPlay", "animationName"],
+ // 子骨架播放指定动画并停止 (仅对显示对象为骨架时有效)
+ ["gotoAndStop", "animationName"],
+ ]
+ }],
+ // 此骨架包含的皮肤列表
+ "skin": [{
+ // 皮肤名称
+ "name": "skinName",
+ // 此皮肤包含的插槽列表
+ "slot": [{
+ // 插槽名称
+ "name": "slotName",
+ // 此插槽包含的显示对象列表
+ "display": [{
+ // 显示对象名称
+ "name": "displayName",
+ // 显示对象类型 (可选属性 默认: "image")
+ // ["image": 贴图, "armature": 骨架, "mesh": 网格, ... 其他扩展的类型]
+ "type": "image",
+ // 显示对象相对于骨骼的位移/ 斜切/ 缩放 (可选属性 默认: null)
+ "transform": {
+ "x": 0.00, // 水平位移 (可选属性 默认: 0.00)
+ "y": 0.00, // y 垂直位移 (可选属性 默认: 0.00)
+ "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000)
+ "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000)
+ "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ "scY": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ },
+ // 显示对象的轴点 (可选属性 默认: null, 仅对贴图或网格有效)
+ "pivot": {
+ "x": 0.50, // 水平轴点 [0.00~1.00] (可选属性 默认: 0.50)
+ "y": 0.50, // 垂直轴点 [0.00~1.00] (可选属性 默认: 0.50)
+ },
+ // 顶点的 UV 坐标列表 (可选属性 默认: null, 仅对网格有效)
+ // [u0, v0, u1, v1, ...]
+ "uvs": [0.0000, 0.0000, 1.0000, 0.0000, 1.0000, 1.0000, 0.0000, 1.0000],
+ // 三角形顶点索引列表 (可选属性 默认: null, 仅对网格有效)
+ "triangles": [0, 1, 2, 2, 3, 0],
+ // 顶点权重列表 (可选属性 默认: null, 仅对网格有效)
+ // [顶点索引, 骨骼索引, 权重, ...]
+ "weights": [0, 0, 1.00, 1, 0, 1.00, 2, 0, 1.00, 3, 0, 1.00],
+ // 顶点相对显示对象轴点的坐标列表 (可选属性 默认: null, 仅对网格有效)
+ // [x0, y0, x1, y1, ...]
+ "vertices": [-64.00, -64.00, 64.00, -64.00, 64.00, 64.00, -64.00, 64.00],
+ // 蒙皮插槽注册的矩阵变换 (可选属性 默认: null, 仅对网格有效)
+ // [x, y, skewX, skewY, scaleX, scaleY]
+ "slotPose": [0.00, 0.00, 0.0000, 0.0000, 1.0000, 1.0000],
+ // 蒙皮骨骼注册的矩阵变换 (可选属性 默认: null, 仅对网格有效)
+ // [骨骼索引, x, y, skewX, skewY, scaleX, scaleY, ...]
+ "bonePose": [0, 0.00, 0.00, 0.0000, 0.0000, 1.0000, 1.0000],
+ "edges": [0, 1, 1, 2, 2, 3, 3, 1],
+ "userEdges": [],
+ }]
+ }]
+ }],
+
+ // 此骨架包含的 ik 约束列表
+ "ik": [{
+ // ik 约束名称
+ "name": "ikName",
+ // 绑定骨骼的名称
+ "bone": "boneName",
+ // 目标骨骼的名称
+ "target": "ikBoneName",
+ // 弯曲方向 (可选属性 默认: true)
+ // [true: 正方向/ 顺时针, false: 反方向/ 逆时针]
+ "bendPositive": true,
+ // 骨骼链的长度 (可选属性 默认: 0)
+ // [0: 只约束 bone, n: 约束 bone 及 bone 向上 n 级的父骨骼]
+ "chain": 0,
+ // 权重 [0.00: 不约束 ~ 1.00: 完全约束] (可选属性 默认: 1.00)
+ "weight": 1.00
+ }],
+ // 此骨架包含的动画列表
+ "animation": [{
+ // 动画名称
+ "name": "animationName",
+ // 循环播放次数 [0: 循环播放无限次, n: 循环播放 n 次] (可选属性 默认: 1)
+ "playTimes": 1,
+ // 动画帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 此动画包含的关键帧列表 (可选属性 默认: null)
+ "frame": [{
+ // 帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 帧事件 (可选属性 默认: null)
+ "event": "eventName",
+ // 帧声音 (可选属性 默认: null)
+ "sound": "soundName",
+ // 帧行为列表 (可选属性 默认: null)
+ "actions": [
+ // 此骨架播放指定动画
+ ["gotoAndPlay", "animationName"],
+ // 此骨架播放指定动画并停止
+ ["gotoAndStop", "animationName"],
+ ]
+ }],
+ // 此动画包含的骨骼时间轴列表 (可选属性 默认: null)
+ "bone": [{
+ // 时间轴名称 (与骨骼名称对应)
+ "name": "boneName",
+ // 时间轴缩放 (可选属性 默认: 1.00)
+ "scale": 1.00,
+ // 时间轴偏移 (可选属性 默认: 0.00)
+ "offset": 0.00,
+ // 此时间轴包含的关键帧列表 (可选属性 默认: null)
+ "frame": [{
+ // 帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null)
+ "tweenEasing": 0.00,
+ // 补间缓动曲线 [x1, y1, x2, y2, ...: 贝塞尔曲线] (可选属性 默认: null)
+ "curve": [0.00, 0.00, 1.00, 1.00],
+ // 帧事件 (可选属性 默认: null)
+ "event": "eventName",
+ // 帧声音 (可选属性 默认: null)
+ "sound": "soundName",
+ // 骨骼的位移/ 斜切/ 缩放 (可选属性 默认: null)
+ "transform": {
+ "x": 0.00, // 水平位移 (可选属性 默认: 0.00)
+ "y": 0.00, // 垂直位移 (可选属性 默认: 0.00)
+ "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000)
+ "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000)
+ "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000)
+ "scY": 1.0000 // 垂直缩放 (可选属性 默认: 1.0000)
+ },
+ }]
+ }],
+ // 此动画包含的插槽时间轴列表
+ "slot": [{
+ // 时间轴名称 (与插槽名称对应)
+ "name": "slotName",
+ // 此时间轴包含的关键帧列表 (可选属性 默认: null)
+ "frame": [{
+ // 帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null)
+ "tweenEasing": 0.00,
+ // 补间缓动曲线 [x1, y1, x2, y2, ...: 贝塞尔曲线] (可选属性 默认: null)
+ "curve": [0.00, 0.00, 1.00, 1.00],
+ // 此帧的显示对象索引 (皮肤中对应的插槽显示对象列表) (可选属性 默认: 0)
+ "displayIndex": 0,
+ // 显示对象的颜色叠加 (可选属性 默认: null)
+ "color": {
+ "aM": 100, // 透明叠加 [0~100] (可选属性 默认: 100)
+ "rM": 100, // 红色叠加 [0~100] (可选属性 默认: 100)
+ "gM": 100, // 绿色叠加 [0~100] (可选属性 默认: 100)
+ "bM": 100, // 蓝色叠加 [0~100] (可选属性 默认: 100)
+ "aO": 0.00, // 透明偏移 [-255~255] (可选属性 默认: 0)
+ "rO": 0.00, // 红色偏移 [-255~255] (可选属性 默认: 0)
+ "gO": 0.00, // 绿色偏移 [-255~255] (可选属性 默认: 0)
+ "bO": 0.00, // 蓝色偏移 [-255~255] (可选属性 默认: 0)
+ },
+ // 播放到当前帧时,执行的动作行为列表 (可选属性 默认: null)
+ "actions": [
+ // 子骨架播放指定动画 (仅对显示对象为骨架时有效)
+ ["gotoAndPlay", "animationName"],
+ // 子骨架播放指定动画并停止 (仅对显示对象为骨架时有效)
+ ["gotoAndStop", "animationName"],
+ ]
+ }],
+ }],
+ // 此动画包含的自由变形时间轴列表 (可选属性 默认: null)
+ "ffd": [{
+ // 时间轴名称 (与插槽名称对应)
+ "name": "slotName",
+ // 此时间轴包含的关键帧列表 (可选属性 默认: null)
+ "frame": [{
+ // 帧长度 (可选属性 默认: 1)
+ "duration": 1,
+ // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null)
+ "tweenEasing": 0.00,
+ // 补间缓动曲线控制点列表 [x1, y1, x2, y2, ...: 贝塞尔曲线] (可选属性 默认: null)
+ "curve": [0.00, 0.00, 1.00, 1.00],
+ // 顶点坐标列表索引偏移 (可选属性 默认: 0)
+ "offset": 0,
+ // 顶点坐标列表 [x0, y0, x1, y1, ...: 相对位移] (可选属性 默认: null)
+ "vertices": [0.01, 0.01]
+ }]
+ }]
+ }]
+ }]
+}
+```
+
+------------------------------
+
+# 4.5 相对 4.0 格式变化
+
+* Armature
+ 1. 增加 "frameRate" 属性: 可为每个骨架设置独立帧率
+ 2. 增加 "type" 属性: 骨骼动画/基本动画/场景动画
+ 3. 增加 "defaultActions" 列表: 可为骨架分配默认行为 (删除 "gotoAndPlay" 属性, 其功能与 "actions" 合并)
+ 4. 增加 "ik" 列表
+
+* Slot
+ 1. 增加 "actions" 列表: 插槽可为子骨架分配默认行为 (删除 "gotoAndPlay" 属性, 其功能与 "actions" 合并)
+
+* Display
+ 1. "type" 属性增加 "mesh" 类型以及与其匹配的其他属性
+
+* Animation
+ 1. 增加 "ffd" 时间轴
+
+* Frame
+ 1. 增加 "actions" 列表: 控制子骨架行为 (删除 "action" "gotoAndPlay" 属性, 其功能与 "actions" 合并)
+
+* actions
+ 暂时只支持 "gotoAndPlay" 行为, 后续会扩展更多对动画的控制行为和交互行为
+
+------------------------------
+
+# 4.0 相对 3.0 格式变化
+
+* Armature 中包含Slot列表
+
+* Skin 中增加默认Skin, 默认skin有如下特性:
+ 1. 在skin列表中排第一
+ 2. 名字为空字符串“”
+ 3. 包含的slot会同时存在于其他的skin,相当于保存所有其他skin中共有的slot(相当于其他skin的基类)
+
+* Skin中包含的Slot的Display的transform属性中不在有pX,pY属性
+ 1. Display不再有初始轴点属性,所有display的轴点均为中心点。
+ 2. 因为display在运动时的轴点是骨骼的原点,所以这里的轴点信息可以在初始化时换算成display的位置信息,从而可以完美还原动画。
+
+* Animation中有下面的改动
+ 1. 去掉"tweenEasing": 动画不会覆盖关键帧的缓动值
+ 2. 去掉"autoTween": 动画不会覆盖关键帧的补件值
+ 3. "loop"改名为"playtime"
+ 4. "colorTransform"改名为"color"
+
+* 区分Bone时间轴和Slot时间轴
+ 1. Bone时间轴包含平移旋转缩放,自定义事件和声音事件
+ 2. Slot时间轴包含颜色变换,dispalyIndex变换和zorder变换
+
+* Armature, Bone 和Slot中均添加了userData字段用于记录用户自定义信息,同时方便第三方扩展
+
+* Frame中有如下改动
+ 1. 中去掉了hide 属性,动画中如果想隐藏某个插槽,改为设置dispalyIndex为-1. visible属性完全留给开发者使用,用于动态设置slot是否隐藏。
+ 2. 增加curve属性,使用贝塞尔曲线描述动画补间的缓动效果
+
+## 4.0 数据格式标准说明
+
+——DragonBones 4.1 依然沿用 4.0 的数据格式规范——
+
+~~~ javascript
+{
+ // DB数据名称,不同的DB数据文件内可以有同名的骨架,在这种情况下这个字段用于区分骨架所对应的数据。
+ "name": "dataName",
+ // DB版本号
+ "version": "4.0",
+ // DB动画帧频
+ "frameRate": 24
+ //【可选属性】是否使用绝对数据,默认0(使用相对数据)
+ "isGlobal": 0,
+ "armature": [{
+ "name": "armatureName", // 骨架名称,一个数据文件可以有多个骨架
+ "userData": //【可选属性】自定义数据区,可以是任何类型,默认是空
+ "bone": [{ // 骨架中拥有的所有骨骼列表
+ "name": "boneName" // 骨骼名称
+ "parent": "parentBoneName" // 父骨骼名称
+ "userData": //【可选属性】自定义数据区,可以是任何类型,默认是空
+ "length": 0 //【可选属性】骨骼长度,默认0
+ // x:X轴坐标偏移, y: Y轴坐标偏移,默认0
+ // scX:X轴缩放值,scY:Y轴缩放值,默认1
+ // skX:X轴旋转值,skY:Y轴旋转值, 默认0
+ "transform": {x, y, scX, scY, skX, skY}// 骨骼的属性参数(属性可选)
+ ]
+ "slot": [{ // 骨架中拥有的插槽列表
+ "name": "slotName" // 插槽名称
+ "parent": "parentBoneName" // 插槽绑定的骨骼
+ "userData": //【可选属性】自定义数据区,可以是任何类型,默认是空
+ "displayIndex": 0 //【可选属性】插槽中的默认图片在插槽包含的图片列表中的索引。默认是0
+ "blendMode"="" //【可选属性】混合模式。默认值是空。
+ }]
+ "skin": [{ // 骨架中拥有的皮肤列表
+ "name": "skinName" // 皮肤名称,默认皮肤name为"",包含所有其他皮肤公用的插槽
+ "slot": [{ // 皮肤中包含的插槽列表
+ "name": "slotName" // 插槽名称
+ "display": [{ // 插槽中拥有的显示对象列表
+ "name": "displayName" // 显示对象对应的显示对象名称,包含二级目录相对路径
+ "type": "image" // 显示对象类型,可为图片(image),子骨架(armature)
+ // 可以根据不同引擎自由扩充。
+ "transform": {x, y, scX, scY, skX, skY} // 显示对象的属性参数(属性可选),
+ // x:X轴坐标偏移, y: Y轴坐标偏移,默认0
+ // scX:X轴缩放值,scY:Y轴缩放值,默认1
+ // skX:X轴旋转值,skY:Y轴旋转值, 默认0
+ }]
+ }]
+ }]
+ "animation": [{ // 骨架中拥有的动画列表
+ "name": "animationName" // 动画名称
+ "duration":0 // 动画总帧数
+ "fadeInTime": 0 //【可选属性】淡入时间,默认为0
+ "scale": 1 //【可选属性】动画时间轴的缩放,默认为1,数值越大,播放时间越长, 目前DB Pro暂未实现
+ "playTimes": 1 //【可选属性】播放次数,默认为1,0是无限循环
+ "frame": [{ // 动画中包含的关键帧列表
+ "duration": 1 //【可选属性】关键帧持续帧数,默认1
+ "event": //【可选属性】关键帧包含事件名,默认为空
+ "sound": //【可选属性】关键帧包含声音名,默认为空
+ "action": //【可选属性】跳转动作名,默认为空
+ }]
+ "bone": [{ // 动画中包含的骨骼列表(骨骼时间轴列表)
+ "name": "boneName" // 骨骼名称
+ "scale": 1 //【可选属性】骨骼时间轴缩放值,默认是1(不缩放)
+ "offset": 0 //【可选属性】骨骼时间轴延时[0, 1],默认值为0
+ // 比如一个循环跑步动作有 4 秒, 其中对腿的动作设置此值为 0.25
+ // 那么腿的循环比其他骨骼动作提前1秒。
+ "pX": 0 //【可选属性】默认值为0 代表动画的中该骨骼轴点的初始值。
+ // 这个属性只有用相对Parent的数据才有意义
+ // 如果用相对Global的数据,这个值会在数据解析时被覆盖。
+ "pY": 0 //【可选属性】默认值为0 代表动画的中该骨骼轴点的初始值。
+ // 这个属性只有用相对Parent的数据才有意义
+ // 如果用相对Global的数据,这个值会在数据解析时被覆盖。
+ "frame": [{ // 骨骼时间轴包含的关键帧列表
+ "duration": 1 //【可选属性】关键帧持续帧数,默认1
+ "tweenEasing":0 //【可选属性】是否缓动,默认为NaN,不缓动,0:线性缓动。
+ "tweenRotate":0 //【可选属性】顺时针或逆时针旋转几周,从补间动画中读取, 必须为整数,默认值为0。
+ "event": //【可选属性】关键帧包含事件名,默认为空
+ "sound": //【可选属性】关键帧包含声音名,默认为空
+ "transform": {x, y, scX, scY, skX, skY} // 此帧骨骼的属性参数(属性可选)
+ // x:X轴坐标偏移, y: Y轴坐标偏移,默认0
+ // scX:X轴缩放值,scY:Y轴缩放值,默认1
+ // skX:X轴旋转值,skY:Y轴旋转值, 默认0
+ }]
+ }]
+ "slot": [{ // 动画中拥有的插槽列表(插槽时间轴列表)
+ "name": "slotName" // 插槽的名称
+ "scale": 1 //【可选属性】插槽的缩放值,默认是1
+ "offset": 0 //【可选属性】动作的延时[0, 1],默认值为0
+ // 比如一个循环跑步动作有 4 秒,其中对腿的动作设置此值为 0.25
+ // 那么腿的循环比其他骨骼动作提前1秒。
+ "frame": [{ // 插槽中的关键帧列表
+ "duration": 1 //【可选属性】关键帧持续帧数,默认1
+ "displayIndex":0 //【可选属性】此帧中显示图片的索引,默认是0, -1不显示
+ // 对应是skin里的slot中的图片列表索引
+ "visible":1 //【可选属性】此帧中插槽是否可见,默认是1。
+ "zOrder": 0 //【可选属性】插槽所在的层级,默认是0
+ "hide": 0 //【可选属性】是否隐藏,默认是0(不隐藏)
+ "tweenEasing":0 //【可选属性】是否缓动,默认为NaN,不缓动,0:线性缓动。
+ "action": //【可选属性】此帧执行的动作,默认是空
+ "color": {aM, rM, gM, bM, aO, rO, gO, bO} // 颜色叠加。所有属性均为可选属性,默认值如下:
+ // aO,rO,gO,bO默认值为0; aM,rM,gM,bM 默认值为100
+ }]
+ }]
+ }]
+ }]
+}
+~~~
diff --git a/DB/dbLibs/events/567b5c831a732.png b/DB/dbLibs/events/567b5c831a732.png
new file mode 100644
index 0000000..c12364b
Binary files /dev/null and b/DB/dbLibs/events/567b5c831a732.png differ
diff --git a/DB/dbLibs/events/567b5c83ad7a9.png b/DB/dbLibs/events/567b5c83ad7a9.png
new file mode 100644
index 0000000..183ba42
Binary files /dev/null and b/DB/dbLibs/events/567b5c83ad7a9.png differ
diff --git a/DB/dbLibs/events/567b5c847db08.png b/DB/dbLibs/events/567b5c847db08.png
new file mode 100644
index 0000000..3a8db1d
Binary files /dev/null and b/DB/dbLibs/events/567b5c847db08.png differ
diff --git a/DB/dbLibs/events/567b5c85ae7c9.png b/DB/dbLibs/events/567b5c85ae7c9.png
new file mode 100644
index 0000000..ac4b0d3
Binary files /dev/null and b/DB/dbLibs/events/567b5c85ae7c9.png differ
diff --git a/DB/dbLibs/events/567b5c893a5c3.png b/DB/dbLibs/events/567b5c893a5c3.png
new file mode 100644
index 0000000..b99c52f
Binary files /dev/null and b/DB/dbLibs/events/567b5c893a5c3.png differ
diff --git a/DB/dbLibs/events/567b5c8ab158f.png b/DB/dbLibs/events/567b5c8ab158f.png
new file mode 100644
index 0000000..3256849
Binary files /dev/null and b/DB/dbLibs/events/567b5c8ab158f.png differ
diff --git a/DB/dbLibs/events/567b5c8d06710.png b/DB/dbLibs/events/567b5c8d06710.png
new file mode 100644
index 0000000..bf2013d
Binary files /dev/null and b/DB/dbLibs/events/567b5c8d06710.png differ
diff --git a/DB/dbLibs/events/567b5c90d72c2.png b/DB/dbLibs/events/567b5c90d72c2.png
new file mode 100644
index 0000000..2bcc9a4
Binary files /dev/null and b/DB/dbLibs/events/567b5c90d72c2.png differ
diff --git a/DB/dbLibs/events/README.md b/DB/dbLibs/events/README.md
new file mode 100644
index 0000000..f104fab
--- /dev/null
+++ b/DB/dbLibs/events/README.md
@@ -0,0 +1,41 @@
+DragonBones 本身并不实现事件派发,动画事件和自定义事件的派发与接收都依赖引擎的事件系统,这样可以使得 DragonBones 的事件融合到所支持的各个引擎的事件系统之中。
+
+在 Egret 中,DragonBones 是依赖 EgretArmatureDisplay 来派发和接收事件的,所以通过对其进行事件监听,就可以收到所有来自骨架的动画事件和自定义事件(更多关于 Egret 的事件知识请参考 Egret 的相关教程和文档)。
+
+[dragonBones.EventObject](http://developer.egret.com/cn/apidoc/index/name/dragonBones.EventObject) 定义了 DragonBones 中相关的事件类型,同时他也会做为一个事件参数通过 [dragonBones.EgretEvent](http://developer.egret.com/cn/apidoc/index/name/dragonBones.EgretEvent) 传递给事件监听器。
+
+代码如下:
+
+~~~javascript
+let armatureDisplay = factory.buildArmatureDisplay("armatureName");
+this.addChild(armatureDisplay);
+
+// Event listener.
+function animationEventHandler(event: dragonBones.EgretEvent): void {
+ let eventObject = event.eventObject;
+ console.log(eventObject.animationState.name, event.type, eventObject.name ? eventObject.name : "");
+}
+
+// Add animation event listener.
+armatureDisplay.addEventListener(dragonBones.EventObject.START, animationEventHandler, this);
+armatureDisplay.addEventListener(dragonBones.EventObject.LOOP_COMPLETE, animationEventHandler, this);
+armatureDisplay.addEventListener(dragonBones.EventObject.COMPLETE, animationEventHandler, this);
+armatureDisplay.addEventListener(dragonBones.EventObject.FADE_IN, animationEventHandler, this);
+armatureDisplay.addEventListener(dragonBones.EventObject.FADE_IN_COMPLETE, animationEventHandler, this);
+armatureDisplay.addEventListener(dragonBones.EventObject.FADE_OUT, animationEventHandler, this);
+armatureDisplay.addEventListener(dragonBones.EventObject.FADE_OUT_COMPLETE, animationEventHandler, this);
+
+// Add animation custom event listener.
+armatureDisplay.addEventListener(dragonBones.EventObject.FRAME_EVENT, animationEventHandler, this);
+
+// Add animation sound event listener.
+factory.soundEventManager.addEventListener(dragonBones.EventObject.SOUND_EVENT, animationEventHandler, this);
+~~~
+
+* 自定义事件可以在 DragonBones Pro 中的事件时间轴添加。[视频教程](http://player.youku.com/embed/XMjY0MjU4ODU4NA==)
+* 自定义事件可以配置自定义参数。
+* 声音事件可以通过 factory 的 soundEventManager 实例统一监听,而不必为每个骨架单独监听。
+
+可以访问示例中心查看参考示例的效果和下载源码:
+* [DragonBones 在线演示](http://www.dragonbones.com/demo/egret/animation_base_test/index.html)
+* [DragonBones 事例源码](https://github.com/DragonBones/DragonBonesJS/blob/master/Egret/Demos/src/demo/AnimationBaseTest.ts)
diff --git a/DB/dbLibs/maskAndMixed/README.md b/DB/dbLibs/maskAndMixed/README.md
new file mode 100644
index 0000000..a429b5e
--- /dev/null
+++ b/DB/dbLibs/maskAndMixed/README.md
@@ -0,0 +1,33 @@
+在制作拥有复杂灵活的动画角色时,可以通过 DragonBones 提供的动画遮罩和动画混合功能,大幅的降低设计师的动画开发工作量,从程序的角度灵活控制动画。例如一个人物上半身可以直立、弯腰、开火。下半身可以直立、下蹲、跑动。并且上下半身的动作可以灵活组合,例如角色可以站立开火、下蹲开火、跑动开火。而所有的这些动作都是由玩家的操控实时控制的。如果要设计师设计所有的这些动画,需要排列组合的制作 3x3 共 9 种动画,其中包含了大量的重复劳动,通过 DragonBones 的动画遮罩和动画融合的功能,设计师只需为上下半身分别设计 3 种动画,也就是一共 6 种动画,剩下的事交给程序实现就可以了。
+
+下面分别介绍动画混合和动画遮罩这两个功能。
+
+* 动画混合
+动画混合是指一个骨架同时可以播放多个动画。例如下面的代码,可以让角色同时播放跑步和开火的动画。
+
+~~~javascript
+armatureDisplay.animation.fadeIn("run", 0.2, 0, 0, "NORMAL_ANIMATION_GROUP");
+armatureDisplay.animation.fadeIn("fire", 0.1, 1, 0, "ATTACK_ANIMATION_GROUP");
+~~~
+
+* 动画遮罩
+动画遮罩就是只将动画的一部分呈现出来,例如下面的代码,将只播放head和body两个骨头的跑步动画,其他骨头将维持原姿势不动。
+
+~~~javascript
+let animationState = armatureDisplay.animation.fadeIn("run");
+animationState.addBoneMask("head");
+animationState.addBoneMask("body_u");
+~~~
+
+这个功能就是通过 AnimationState 的 addBoneMask 这个 API 来实现的。
+
+这里需要解释的一点就是 DragonBones 骨骼动画在运行时有一个组的概念,我们可以让动画在一个组中播放,当另一个动画被设置为在相同组中播放时,之前播放的同组动画就会停止,所以我们可以把希望同时播放的动画放在不同的组里。就像上面的代码中,我们可以把开火放到上半身组,跑步放到下半身组,这样角色就可以同时开火和跑步了。
+
+最后将动画遮罩和动画混合一起使用,代码如下
+
+~~~javascript
+armatureDisplay.animation.fadeIn("run", 0.2, 0, 0, "NORMAL_ANIMATION_GROUP");
+
+let animationState = armatureDisplay.animation.fadeIn("fire", 0.1, 1, 0, "ATTACK_ANIMATION_GROUP");
+animationState.addBoneMask("body_u");
+~~~
diff --git a/DB/dbLibs/morePeopleAnimation/56c314eb7853f.png b/DB/dbLibs/morePeopleAnimation/56c314eb7853f.png
new file mode 100644
index 0000000..2f404e5
Binary files /dev/null and b/DB/dbLibs/morePeopleAnimation/56c314eb7853f.png differ
diff --git a/DB/dbLibs/morePeopleAnimation/56c314eba5994.png b/DB/dbLibs/morePeopleAnimation/56c314eba5994.png
new file mode 100644
index 0000000..7db0c50
Binary files /dev/null and b/DB/dbLibs/morePeopleAnimation/56c314eba5994.png differ
diff --git a/DB/dbLibs/morePeopleAnimation/README.md b/DB/dbLibs/morePeopleAnimation/README.md
new file mode 100644
index 0000000..a555286
--- /dev/null
+++ b/DB/dbLibs/morePeopleAnimation/README.md
@@ -0,0 +1,76 @@
+DragonBones 系统中允许创建多个骨骼动画,用户可以创建多个 Factory 来管理不同的骨骼动画,也可使用同一个 Factory 来管理多个骨骼动画。
+* 当使用一个 Factory 时,需要注意避免龙骨数据或骨架数据重名。
+* 如果没有特殊需求,建议不要使用多个 Factory 实例
+
+使用多个EgretFactory方法可参考**创建骨骼动画**一节。
+范例如下:
+
+~~~javascript
+let dragonbonesData = RES.getRes( "RobotGame_1_json" );
+let textureData = RES.getRes( "texture_json" );
+let texture = RES.getRes( "texture_png" );
+
+//
+let egretFactoryA = new dragonBones.EgretFactory();
+egretFactoryA.parseDragonBonesData(dragonbonesData);
+egretFactoryA.parseTextureAtlasData(textureData, texture);
+
+let armatureDisplayA = egretFactoryA.buildArmatureDisplay("robot");
+this.addChild(armatureDisplayA);
+armatureDisplayA.x = 200;
+armatureDisplayA.y = 300;
+armatureDisplayA.scaleX = 0.5;
+armatureDisplayA.scaleY = 0.5;
+
+//
+let egretFactoryB = new dragonBones.EgretFactory();
+egretFactoryB.parseDragonBonesData(dragonbonesData);
+egretFactoryB.parseTextureAtlasData(textureData, texture);
+
+let armatureDisplayB = egretFactoryB.buildArmatureDisplay("robot");
+this.addChild(armatureDisplayB);
+armatureDisplayB.x = 250;
+armatureDisplayB.y = 350;
+armatureDisplayB.scaleX = 0.5;
+armatureDisplayB.scaleY = 0.5;
+~~~
+
+效果如图:
+
+![](56c314eb7853f.png)
+
+使用同一 Factory 方法如下:
+
+~~~javascript
+let dragonbonesDataA = RES.getRes( "RobotGame_1_json" );
+let textureDataA = RES.getRes( "texture_json" );
+let textureA = RES.getRes( "texture_png" );
+
+let dragonbonesDataB = RES.getRes("Dragon_json");
+let textureDataB = RES.getRes("dragontexture_json");
+let textureB = RES.getRes("dragontexture_png");
+
+let egretFactory = dragonBones.EgretFactory.factory;
+egretFactory.parseDragonBonesData(dragonbonesDataA);
+egretFactory.parseTextureAtlasData(textureDataA, textureA);
+egretFactory.parseDragonBonesData(dragonbonesDataB);
+egretFactory.parseTextureAtlasData(textureDataB, textureB);
+
+let armatureDisplayA = dragonbonesFactory.buildArmatureDisplay("robot");
+this.addChild(armatureDisplayA);
+armatureDisplayA.x = 200;
+armatureDisplayA.y = 300;
+armatureDisplayA.scaleX = 0.5;
+armatureDisplayA.scaleY = 0.5;
+
+let armatureDisplayB = dragonbonesFactory.buildArmatureDisplay("Dragon");
+this.addChild(armatureDisplayB);
+armatureDisplayB.x = 250;
+armatureDisplayB.y = 350;
+armatureDisplayB.scaleX = 0.5;
+armatureDisplayB.scaleY = 0.5;
+~~~
+
+效果如图:
+
+![](56c314eba5994.png)
diff --git a/DB/dbLibs/motionControlskeleton/563ac3634b09d.gif b/DB/dbLibs/motionControlskeleton/563ac3634b09d.gif
new file mode 100644
index 0000000..ebc21de
Binary files /dev/null and b/DB/dbLibs/motionControlskeleton/563ac3634b09d.gif differ
diff --git a/DB/dbLibs/motionControlskeleton/README.md b/DB/dbLibs/motionControlskeleton/README.md
new file mode 100644
index 0000000..a76b4db
--- /dev/null
+++ b/DB/dbLibs/motionControlskeleton/README.md
@@ -0,0 +1,20 @@
+---
+title: 控制骨骼运动
+---
+有的时候,对于一个有趣的游戏,仅仅播放预先设置的骨骼动画是不够的,我们需要角色具有动态可控的动作。令人高兴的是DragonBones提供了访问并控制骨骼框架里每根骨头的方法,让你的角色在游戏中随意运动。
+下面示例通过鼠标在场景中的移动来控制骨骼。我们创建了一个跟随鼠标运动的小鸟,小龙人会与小鸟保持一定距离,同时小龙人的头和胳膊会跟随小鸟运动而做出不同姿势,非常有趣。完整的项目代码可以在示例中心下载此示例。
+
+[程序控制骨骼运动](http://edn.egret.com/cn/index.php/article/index/id/691)
+
+下面看一下实现这个功能的关键代码段。
+
+~~~javascript
+this.head = this.armature.getBone("head");
+this.head.offset.rotation = r;
+~~~
+
+从上面代码我们可以看到,通过方法dragonBones.Armature.getBone(_name:String):Bone来获取某个骨骼。骨骼中的offset是一个DBTransform对象,是专门用于给开发者设置叠加的变换信息的,包括平移,旋转,缩放,等等。我们可以根据游戏逻辑的需要对设置这些参数,从而实现动态控制此骨骼的效果。
+
+>注意offset的值是叠加到骨骼上现有的变换,并不是取代骨骼上现有的变换。
+
+![](563ac3634b09d.gif)
diff --git a/DB/dbLibs/replaceTexture/577f7e442a524.png b/DB/dbLibs/replaceTexture/577f7e442a524.png
new file mode 100644
index 0000000..0ff4386
Binary files /dev/null and b/DB/dbLibs/replaceTexture/577f7e442a524.png differ
diff --git a/DB/dbLibs/replaceTexture/577f7e4445bba.png b/DB/dbLibs/replaceTexture/577f7e4445bba.png
new file mode 100644
index 0000000..bac41a6
Binary files /dev/null and b/DB/dbLibs/replaceTexture/577f7e4445bba.png differ
diff --git a/DB/dbLibs/replaceTexture/577f7e4460b84.png b/DB/dbLibs/replaceTexture/577f7e4460b84.png
new file mode 100644
index 0000000..0eb7a29
Binary files /dev/null and b/DB/dbLibs/replaceTexture/577f7e4460b84.png differ
diff --git a/DB/dbLibs/replaceTexture/README.md b/DB/dbLibs/replaceTexture/README.md
new file mode 100644
index 0000000..f35d08b
--- /dev/null
+++ b/DB/dbLibs/replaceTexture/README.md
@@ -0,0 +1,43 @@
+### 局部换装
+
+原有换装方案,可以替换对应slot中的图片实现,但会存在图片位置错位问题。新版本局部换装功能,可通过DragonBones预设置替换内容实现此功能。
+
+原始动画如下:
+
+![](577f7e442a524.png)
+
+我们可以替换其头发的内容,新建一个DragonBones项目,将新头发加入其资源库,然后放入场景中。
+
+具体替换创建新项目的原因在于获取图片轴点与骨骼原点的相对位置。
+
+在新项目中调整好头发的位置后,导出数据。
+
+![](577f7e4445bba.png)
+
+在上面的代码中继续添加如下代码。
+
+~~~javascript
+this.factory.parseDragonBonesData(RES.getRes("new_json"));
+this.factory.parseTextureAtlasData(RES.getRes("new_texture_json"), RES.getRes("new_texture_png"));
+this.factory.replaceSlotDisplay( "NewProject", "Armature", "ti", "bb", ar.armature.getSlot("Atoufa"));
+~~~
+
+通过`replaceSlotDisplay`方法来替换其中头发的内容,其中第一个参数为DragonBonesName,如果你在解析DragonBones数据时未添加其参数,那么该参数可以填写`null`或者填写项目名称。
+
+后面三个参数均为数据源标记,最后一个参数则是要替换的目标slot。
+
+编译后运行效果如图:
+
+![](577f7e4460b84.png)
+
+你可以在新项目中放置多个即将替换的纹理素材,然后在局部替换时,选择你所需要的贴图纹理。
+
+### 全局换装
+
+全局换装可实现将一个骨骼动画的骨架中全部贴图替换,如果使用全局换装功能,则新骨骼动画纹理集与源骨骼动画纹理集必须尺寸以及内部元素尺寸相同。
+
+你可以使用如下代码来进行全局换装
+
+~~~javascript
+ar.armature.replaceTexture(RES.getRes("new_db_texture_png"));
+~~~
diff --git a/DB/dbLibs/speedMode/56c315065bd6b.png b/DB/dbLibs/speedMode/56c315065bd6b.png
new file mode 100644
index 0000000..cc6e992
Binary files /dev/null and b/DB/dbLibs/speedMode/56c315065bd6b.png differ
diff --git a/DB/dbLibs/speedMode/README.md b/DB/dbLibs/speedMode/README.md
new file mode 100644
index 0000000..a25b566
--- /dev/null
+++ b/DB/dbLibs/speedMode/README.md
@@ -0,0 +1,207 @@
+## 极速模式简介
+
+*DragonBones 4.1 (后面简称DB)引入了一套极速模式,目的在于一定程度上解决DB在H5-canvas上的性能问题。*
+
+abbcc
+
+我们知道目前包括db在内的骨骼动画解决方案,普遍因为角色中需要绘制的图片比较多draw call比较高,在canvas上的性能都不是很理想。而对drawcall的优化技术上比较复杂,难度比较大,所以4.1中的极速模式是从另一个角度减少CPU的计算,来优化性能。
+
+DB的骨骼动画能够支持非常细腻的动画补间和融合,同时这些功能也会在每帧消耗大量的CPU计算,极速模式在一定程度上削减了这些功能,一方面能够保留核心功能供90%的动画需求维持原有效果,另一方面能够减少一些不常用的功能所带来的不必要的性能消耗,同时为进一步优化性能的数据缓存铺平道路。
+
+这是一个普通模式和极速模式的性能和功能对比表格:
+
+|| 普通模式 | 极速模式 | 极速模式+数据缓存 |
+| -- | -- | -- | -- |
+| 性能对比 | 100% | 110% | 180% |
+|动画间过渡| √| √| √|
+|动画补间| √ |√| √|
+|动态动画补间| √| √| ×|
+|颜色变换| √| √| √|
+|帧动画| √| √| √|
+|动画变速| √| √| √|
+|局部换肤| √| √| √|
+|整体换肤| √| ×| ×|
+|动态骨骼增加删除| √| ×| ×|
+|动画部分播放| √| ×| ×|
+|多动画融合| √| ×| ×|
+|程序控制动画幅度| √ |×| ×|
+|时间轴事件| √ |√ |√|
+
+根据上表可以看出,使用极速模式的动画失去了大部分动态控制的功能。
+
+另外因为极速模式的动画缓存在不同的同种骨架间是可以共用的,所以在这里官方建议,极速模式更适合游戏中会大量出现的,动画不是特别复杂的NPC角色。对于玩家控制的角色,如果使用到了任何极速模式不支持的特性,建议还是使用普通模式。
+
+## 快速使用极速模式
+
+DB给开发者提供了一套最简单的使用极速模式的方法,仅需两行代码的修改就能完成模式切换,并开启数据缓存(红色的部分就是需要改动的部分)
+
+先看一下原先使用DragonBones需要写的代码:
+
+```
+this.factory = new dragonBones.EgretFactory();
+this.factory.addSkeletonData(dragonBones.DataParser.parseDragonBonesData(skeletonData), "dragon");
+this.factory.addTextureAtlas(new dragonBones.EgretTextureAtlas(texture, textureData), "dragon");
+var armature:dragonBones.Armature = this.factory.buildArmature("Dragon");
+armature.animation.gotoAndPlay(“Walk”,0,-1,0);
+this.addChild(armature.display);
+```
+
+再看一下使用极速模式的代码:
+
+```
+this.factory = new dragonBones.EgretFactory();
+this.factory.addSkeletonData(dragonBones.DataParser.parseDragonBonesData(skeletonData), "dragon");
+this.factory.addTextureAtlas(new dragonBones.EgretTextureAtlas(texture, textureData), "dragon");
+var armature:dragonBones.FastArmature = this.factory.buildFastArmature("Dragon"); //构建FastArmature
+armature.enableAnimationCache(30); //开启数据缓存,30代表采样帧频,推荐设置为12~30,达到性能和动画流畅度的最佳平衡点。
+armature.animation.gotoAndPlay(“Walk”,0,-1,0);
+this.addChild(armature.display);
+```
+
+## 极速模式详解
+
+喜欢刨根问底的开发者,可能想知道这两行代码的背后隐藏了什么,下面就为您揭秘:
+
+首先看第一句
+
+```
+this.factory.buildFastArmature("Dragon"); //构建FastArmature
+```
+
+可以很直白的告诉大家,这句的背后跟普通模式是一模一样的,就是根据AnimationData来为Armature构建骨骼和插槽,只不过这次返回的是FastArmature而不是Armautre。
+
+FastArmature是跟Armature完全独立并列的两套体系,FastArmature里面使用的是FastBone,FastSlot。动画系统使用的是FastAnimation和FastAnimationState,时间轴使用的是FastBoneTimelineState,FastSlotTimelineState。所有的这些类都在dragonbones/fast这个文件夹里。
+
+之所以这样设计就是希望在完全向下兼容的基础上实现一套功能简化版本的骨骼动画系统。 这套Fast骨骼动画体系在功能上和原始版本的区别就是之前表格列出来的区别。
+
+其中最显著的就是Fast骨骼动画体系不再支持动画融合了,从代码上可以看到:
+
+FastAnimation中包含的是FastAnimationState实例
+
+```
+public animationState:FastAnimationState = new FastAnimationState();
+```
+
+而Animation中包含的是animationStateList,一个数组。
+
+```
+private _animationStateList:Array;
+```
+
+这个区别所带来的动画上的效果的不同有如下两点:
+
+1. 极速模式不支持动画融合
+
+因为FastAnimation中只包含一个FastAnimationState实例,也就是说任何时间,同一时间一个角色只会播放一个动画。一个动画的开始就意味着之前一个动画的结束。
+
+而普通模式的Animation中,一个角色是可以同时播放多个动画的,也就是动画融合功能。例如一个奔跑的角色被子弹打中身体后仰。就可以通过让这个角色同时播放奔跑和后仰两个动作来实现,这样当这个角色站立时中弹和下蹲时中弹,都可以用类似的方式实现,而不需要动画设计师额外设计动画。这个功能在极速模式中已经不再支持了。
+
+2. 动画过渡原理和效果发生变化
+
+普通模式的动画过渡是通过动画融合来实现的,也就是说例如角色要从播放动作A过渡到播放动作B,那Animation要做的就是控制动作A淡出同时动作B淡入,在A淡出B淡入的这段时间里,实际上角色在同时播放动作A和动作B (动画融合),通过对A和B权重(weight)的控制调节(A的权重从1降为0,B的权重从0升为1),实现从A到B的过渡。
+
+极速模式因为不支持动画融合,所以动画过渡是通过当前形态和即将播放动作的第一帧的形态做线性补间实现的,效果上会比普通模式的略显生硬。不过话说回来,很多游戏中的动画都是不需要动画过渡这个功能的,所以这个变动对这些游戏几乎没有影响。
+
+极速模式舍弃动画融合这个功能,最主要的目的其实是为实现数据缓存这个功能铺平道路。之前说过,极速模式是通过减少CPU计算实现性能提升的,那么减少CPU计算的极致就是把计算结果缓存下来。
+
+----
+
+下面看看极速模式是如何生成并使用数据缓存的:
+
+在db源代码中有个叫cache的文件夹里面包含所有的好数据缓存有关的类。其中最重要的就是AnimationCacheManager和AnimationCache这两个类。AnimationCacheManager是使用数据缓存的入口,也是AnimationCache的管理器。AnimationCache负责对某个特定的动画进行缓存。
+
+
+![](56c315065bd6b.png)
+
+下面这段代码是FastArmature的enableAnimationCache 方法,里面对AnimationCacheManager做了全套操作,实现对当前骨架生成缓存。
+
+```
+/**
+ * 开启动画缓存
+ * @param {number} 帧速率,每秒缓存多少次数据,越大越流畅,若值小于零会被设置为动画数据中的默认帧率
+ * @param {Array} 需要缓存的动画列表,如果为null,则全部动画都缓存
+ * @param {boolean} 动画是否是循环动画,仅在3.0以下的数据格式使用,如果动画不是循环动画请设置为false,默认为true。
+ * @return {AnimationCacheManager} 返回缓存管理器,可以绑定到其他armature以减少内存
+ */
+public enableAnimationCache(frameRate:number, animationList:Array = null, loop:boolean = true):AnimationCacheManager{
+ var animationCacheManager:AnimationCacheManager = AnimationCacheManager.initWithArmatureData(this.armatureData,frameRate);
+ if(animationList){
+ var length:number = animationList.length;
+ for(var i:number = 0;i < length;i++){
+ var animationName:string = animationList[i];
+ animationCacheManager.initAnimationCache(animationName);
+ }
+ }
+ else{
+ animationCacheManager.initAllAnimationCache();
+ }
+ animationCacheManager.setCacheGeneratorArmature(this);
+ animationCacheManager.generateAllAnimationCache(loop);
+
+ animationCacheManager.bindCacheUserArmature(this);
+ this.enableCache = true;
+ return animationCacheManager;
+}
+```
+
+这段代码中最重要的几个操作如下:
+
+```
+animationCacheManager.initAnimationCache(animationName);//初始化动画缓存
+animationCacheManager.setCacheGeneratorArmature(this);//设置缓存生成器
+animationCacheManager.generateAllAnimationCache(loop);//生成缓存
+animationCacheManager.bindCacheUserArmature(this);//绑定缓存使用者
+```
+
+从中可以看到AnimationCacheManager的工作原理分为一下4步:
+
+1. 初始化动画缓存
+
+2. 设置缓存生成器
+
+3. 生成缓存
+
+4. 绑定缓存使用者
+
+进行完这四步之后,当一个FastArmature播放的时候,就会自动从动画缓存中拿数据了。
+
+需要注意的是这段代码中用到的几个参数
+
+1. frameRate 帧频。
+
+这里的帧频代表的是动画的缓存采样帧频。帧频越高,动画越平滑,初始化速度越慢,播放速度也越慢。帧频越低,动画越不平滑,初始化速度越快,播放速度也越快。
+
+一般来说这里的帧频设置为12~30是比较合适的,如果超过30,即便游戏达到了这个帧率,人眼也分辨不太出来。低于12的话会有明显的卡顿感。
+
+2. animationList 动画列表
+
+这个参数代表希望缓存的动画列表。你可以根据游戏的需要,将一部分动画缓存,另一部分不缓存(实时计算)
+
+3. loop 是否循环播放
+
+这个参数代表动画在缓存采样时,采用循环播放的方式还是只播放1次。是否循环的区别在于从动画的最后一帧到第一帧是否有补间产生。这里建议根据角色动画的需要,需要循环播放的动画就循环采样,只需要播放一次的动画,就不循环采样。
+
+
+深入使用数据缓存
+
+FastArmature的enableAnimationCache 方法给开发者提供了快速开启缓存的方法,操作简单但不够灵活。如果开发者希望灵活的使用数据缓存,就需要直接操作AnimationCacheManager了。
+
+下面介绍几种需要直接操作AnimationCacheManager的情况:
+
+1. 游戏中大量相同的角色,可以复用同一个AnimationCacheManager
+
+很多游戏中都会有大量的NPC角色,这些角色的特点是数量多,重复,并且动作相对简单。这种类型的角色是最适合用极速模式的。对于这类角色,我们可以使用同一个AnimationCacheManager,设置一个缓存生成器,其他的都作为绑定的缓存使用者,这样能够大幅提高效率。
+
+```
+animationCacheManager.setCacheGeneratorArmature(a1);
+animationCacheManager.generateAllAnimationCache();
+animationCacheManager.bindCacheUserArmatures([a1,a2,a3,a4,a5]);
+```
+
+2. 游戏初始化一下生成所有动画缓存太卡,可以分角色分动画逐个生成。
+
+一般来说,游戏在初始化的时候要初始化大量的角色,如果一上来就生成所有动画的缓存可能会产生比较明显的卡顿效果。这时您可以采用分步加载的策略,为角色一个动作一个动作的的生成缓存数据。
+
+```
+animationCacheManager.generateAnimationCache(animationName);
+```
diff --git a/DB/dbPro/advancedFeatures/IK/56d6a71568f12.png b/DB/dbPro/advancedFeatures/IK/56d6a71568f12.png
new file mode 100644
index 0000000..97299f7
Binary files /dev/null and b/DB/dbPro/advancedFeatures/IK/56d6a71568f12.png differ
diff --git a/DB/dbPro/advancedFeatures/IK/56d6a715729de.png b/DB/dbPro/advancedFeatures/IK/56d6a715729de.png
new file mode 100644
index 0000000..7bdc66c
Binary files /dev/null and b/DB/dbPro/advancedFeatures/IK/56d6a715729de.png differ
diff --git a/DB/dbPro/advancedFeatures/IK/56d6a715801f5.png b/DB/dbPro/advancedFeatures/IK/56d6a715801f5.png
new file mode 100644
index 0000000..db71776
Binary files /dev/null and b/DB/dbPro/advancedFeatures/IK/56d6a715801f5.png differ
diff --git a/DB/dbPro/advancedFeatures/IK/56d6a715900f8.png b/DB/dbPro/advancedFeatures/IK/56d6a715900f8.png
new file mode 100644
index 0000000..28d695d
Binary files /dev/null and b/DB/dbPro/advancedFeatures/IK/56d6a715900f8.png differ
diff --git a/DB/dbPro/advancedFeatures/IK/README.md b/DB/dbPro/advancedFeatures/IK/README.md
new file mode 100644
index 0000000..a531ea6
--- /dev/null
+++ b/DB/dbPro/advancedFeatures/IK/README.md
@@ -0,0 +1,55 @@
+
+#### 简介
+IK是反向动力学Inverse Kinematics的缩写。
+
+DragonBones Pro 从 4.5.0 开始支持IK约束功能
+
+FK为正向动力学的缩写。通常情况下,父骨骼带动子骨骼运动即为正向动力学。例如,大臂带动小臂,大腿带动小腿。
+IK与FK相反,用来实现由下而上的驱动。例如,做俯卧撑时,手撑住地面,支起身体。
+
+下图就是一个典型的IK约束的例子。
+大腿为父骨骼,小腿围子骨骼。两个骨骼被IK约束在红色的约束目标上。
+特别注意的是红色的骨骼并非为小腿的子骨骼。而是和大腿骨骼同级的骨骼。
+
+![](56d6a71568f12.png)
+
+拖动红色的约束目标骨骼,IK约束便会不断调整父子骨骼的旋转值,使得子骨骼的末端固定在约束目标骨骼上。
+
+#### 添加IK约束
+选中骨骼后在属性面板可以看到两个IK约束按钮,点击便可创建IK约束。
+
+![](56d6a715729de.png)
+
+- 末端创建约束目标: 在选中骨骼的骨骼末端自动创建约束目标骨骼并绑定IK约束。
+- 自定义拾取约束目标: 手动指定作为约束目标的骨骼,并绑定IK约束。
+
+#### IK约束特性:
+- 绑定了IK约束的骨骼外框显示为红色
+- 作为IK约束目标的骨骼整体显示为红色
+- 单根骨骼可以绑定IK约束
+- 两根连续父子骨骼可以绑定IK约束
+- 两个以上骨骼无法绑定IK约束
+- 非连续父子骨骼无法绑定IK约束
+- 非父子骨骼无法绑定IK约束
+- 所选骨骼的直接或间接子骨骼不能手动指定为IK约束目标骨骼
+- 关闭“旋转”继承的骨骼无法绑定IK约束
+- 绑定了Ik约束的骨骼不能关闭“旋转”继承
+
+添加了IK约束的骨骼的属性面板如下
+
+![](56d6a715801f5.png)
+
+其中IK约束属性部分包括:
+- 名称:IK约束的名称,默认为自动命名,也可以重命名。
+- 骨骼:IK约束所绑定的骨骼
+- 目标:作为约束目标的骨骼的名称
+- 弯曲:IK的弯曲方向
+- IK权重:IK约束影响骨骼的权重
+
+*当前的版本中还不支持在动画播放中变换弯曲和Ik权重的值。*
+
+约束目标骨骼的属性面板如下:
+
+![](56d6a715900f8.png)
+
+其中IK约束目标属性和IK约束属性相同,只是没有目标项,因为约束目标即为约束目标骨骼本身。
\ No newline at end of file
diff --git a/DB/dbPro/advancedFeatures/curveEditor/README.md b/DB/dbPro/advancedFeatures/curveEditor/README.md
new file mode 100644
index 0000000..f806138
--- /dev/null
+++ b/DB/dbPro/advancedFeatures/curveEditor/README.md
@@ -0,0 +1,66 @@
+DragonBones 4.1 新添加了曲线编辑器面板,在这个面板中,您可以对帧与帧间的补间应用曲线来实现不同的补间效果。
+
+进入动画模式,选中一个关键帧(其后含有补间的关键帧),然后点击时间轴上的曲线按钮。如下图:
+
+![](p1.png)
+
+曲线编辑器面板打开,如下图:
+
+![](p2.png)
+
+拖动上下的两个手柄可以手动调整曲线。
+
+![](p3.png)
+
+面板右下方为预置曲线设置
+
+![](p4.png)
+
+由由左到右依次为,无,线性,淡入,淡出,淡入淡出。每个预设的曲线图如下:
+
+![](p5.png)
+
+应用曲线后的时间轴如下图:
+
+![](p6.png)
+
+曲线特性:
+* Y坐标轴上,向上最大值为200%,向下最小值为-100%。
+* 预置的“无”曲线对应的就是无补间的效果。
+* 曲线适用于:
+ * 骨骼的旋转,移动,缩放。
+ * 插槽的颜色变换,透明度变化。
+* 曲线面板只存在于动画制作模式
+* 应用了曲线的两帧间新插入一帧,则切割产生的两端补间,左侧的继承原有曲线,右侧的为默认的线性。
+* 三个前后相连的关键帧,其中前两帧间有曲线A,后两帧间有曲线B,删掉中间的关键帧,剩下的两帧间会应用曲线A,曲线B被删除。
+* 以下情况曲线编辑器面板置空:
+
+复选关键帧:
+* 关键帧为当前层的最后一帧
+* 选中事件层关键帧时
+* 无关键帧选中时
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DB/dbPro/advancedFeatures/curveEditor/p1.png b/DB/dbPro/advancedFeatures/curveEditor/p1.png
new file mode 100644
index 0000000..ae245eb
Binary files /dev/null and b/DB/dbPro/advancedFeatures/curveEditor/p1.png differ
diff --git a/DB/dbPro/advancedFeatures/curveEditor/p2.png b/DB/dbPro/advancedFeatures/curveEditor/p2.png
new file mode 100644
index 0000000..338c30b
Binary files /dev/null and b/DB/dbPro/advancedFeatures/curveEditor/p2.png differ
diff --git a/DB/dbPro/advancedFeatures/curveEditor/p3.png b/DB/dbPro/advancedFeatures/curveEditor/p3.png
new file mode 100644
index 0000000..cff23a5
Binary files /dev/null and b/DB/dbPro/advancedFeatures/curveEditor/p3.png differ
diff --git a/DB/dbPro/advancedFeatures/curveEditor/p4.png b/DB/dbPro/advancedFeatures/curveEditor/p4.png
new file mode 100644
index 0000000..57b4e72
Binary files /dev/null and b/DB/dbPro/advancedFeatures/curveEditor/p4.png differ
diff --git a/DB/dbPro/advancedFeatures/curveEditor/p5.png b/DB/dbPro/advancedFeatures/curveEditor/p5.png
new file mode 100644
index 0000000..3a40a53
Binary files /dev/null and b/DB/dbPro/advancedFeatures/curveEditor/p5.png differ
diff --git a/DB/dbPro/advancedFeatures/curveEditor/p6.png b/DB/dbPro/advancedFeatures/curveEditor/p6.png
new file mode 100644
index 0000000..0705c52
Binary files /dev/null and b/DB/dbPro/advancedFeatures/curveEditor/p6.png differ
diff --git a/DB/dbPro/advancedFeatures/grid/56d7e66a32338.png b/DB/dbPro/advancedFeatures/grid/56d7e66a32338.png
new file mode 100644
index 0000000..2651137
Binary files /dev/null and b/DB/dbPro/advancedFeatures/grid/56d7e66a32338.png differ
diff --git a/DB/dbPro/advancedFeatures/grid/56d7e66a42ef3.png b/DB/dbPro/advancedFeatures/grid/56d7e66a42ef3.png
new file mode 100644
index 0000000..0cfb19a
Binary files /dev/null and b/DB/dbPro/advancedFeatures/grid/56d7e66a42ef3.png differ
diff --git a/DB/dbPro/advancedFeatures/grid/56d7e66a674ec.png b/DB/dbPro/advancedFeatures/grid/56d7e66a674ec.png
new file mode 100644
index 0000000..06a5212
Binary files /dev/null and b/DB/dbPro/advancedFeatures/grid/56d7e66a674ec.png differ
diff --git a/DB/dbPro/advancedFeatures/grid/56d7e66a7dfa7.png b/DB/dbPro/advancedFeatures/grid/56d7e66a7dfa7.png
new file mode 100644
index 0000000..1bd3000
Binary files /dev/null and b/DB/dbPro/advancedFeatures/grid/56d7e66a7dfa7.png differ
diff --git a/DB/dbPro/advancedFeatures/grid/56d7e66a93a42.png b/DB/dbPro/advancedFeatures/grid/56d7e66a93a42.png
new file mode 100644
index 0000000..30fdc1c
Binary files /dev/null and b/DB/dbPro/advancedFeatures/grid/56d7e66a93a42.png differ
diff --git a/DB/dbPro/advancedFeatures/grid/56d7e66aa892f.png b/DB/dbPro/advancedFeatures/grid/56d7e66aa892f.png
new file mode 100644
index 0000000..b55cab5
Binary files /dev/null and b/DB/dbPro/advancedFeatures/grid/56d7e66aa892f.png differ
diff --git a/DB/dbPro/advancedFeatures/grid/README.md b/DB/dbPro/advancedFeatures/grid/README.md
new file mode 100644
index 0000000..85d36c8
--- /dev/null
+++ b/DB/dbPro/advancedFeatures/grid/README.md
@@ -0,0 +1,44 @@
+#### 简介
+网格可以用来实现图片的任意变形和扭曲。
+DragonBones Pro 从4.5.0开始支持网格的创建和编辑。
+
+#### 创建网格
+选中插槽或插槽内的图片,在属性面板,点击转换成网格按钮。
+
+![](56d7e66a32338.png)
+
+![](56d7e66a42ef3.png)
+
+图片转换为网格后,插槽和图片的属性面板如下
+
+![](56d7e66a93a42.png)
+
+![](56d7e66aa892f.png)
+
+点击“编辑网格”按钮,便可以打开网格编辑器面板,开始编辑网格。
+点击“重置网格”按钮,网格中图片和网格顶点的对应关系会被重置,图片会恢复原有的形状。
+点击“转换为图片”按钮,可以将网格重新转换回图片。
+
+#### 网格编辑器
+![](56d7e66a7dfa7.png)
+
+下方工具栏由左至右依次是:
+- 顶点数:显示网格中顶点的个数
+- 编辑工具:用来移动顶点(快捷键为Q)
+- 添加工具:用来添加顶点(快捷键为W)
+- 删除工具:用来删除顶点(快捷键为E)
+- 边线工具:用来勾画网格边线的工具。注意,使用这个工具时,原有的顶点和边线会被全部清除。
+- 重置工具:顶点会被重置为默认状态和数量。(四个顶点分居正方形的四个角)
+
+使用添加工具可以添加顶点,通过拖拽还可以添加自定义连线。如下图
+![](56d7e66a674ec.png)
+
+A或B点和四个角的顶点间的连线是灰色的,这是自动生成的连线。
+A和B之间的连线是黄色的,这是通过拖拽生成的自定义连线。
+
+#### 网格特性
+- 网格拉伸图片到达的尺寸最大不能超过2048x2048
+- 网格的边线必须是闭合的,如果绘制的边线没有手动绘制闭合,边线会自动闭合。
+- 网格的旋转中心点为原图片的旋转中心点,不会因为网格边线的重新绘制或图片的拉伸而改变
+- 当前版本中还不支持网格顶点基于权重绑定于指定骨骼
+- 动画模式下,网格在时间轴上有独立的图层,对顶点的位移操作可以在时间轴上添加关键帧
\ No newline at end of file
diff --git a/DB/dbPro/advancedFeatures/skinWeights/5732eaaa853d9.png b/DB/dbPro/advancedFeatures/skinWeights/5732eaaa853d9.png
new file mode 100644
index 0000000..e292b9b
Binary files /dev/null and b/DB/dbPro/advancedFeatures/skinWeights/5732eaaa853d9.png differ
diff --git a/DB/dbPro/advancedFeatures/skinWeights/5732eaaa9e514.png b/DB/dbPro/advancedFeatures/skinWeights/5732eaaa9e514.png
new file mode 100644
index 0000000..ef5071b
Binary files /dev/null and b/DB/dbPro/advancedFeatures/skinWeights/5732eaaa9e514.png differ
diff --git a/DB/dbPro/advancedFeatures/skinWeights/5732eaaab3b2a.png b/DB/dbPro/advancedFeatures/skinWeights/5732eaaab3b2a.png
new file mode 100644
index 0000000..f43e887
Binary files /dev/null and b/DB/dbPro/advancedFeatures/skinWeights/5732eaaab3b2a.png differ
diff --git a/DB/dbPro/advancedFeatures/skinWeights/5732eaaac19af.png b/DB/dbPro/advancedFeatures/skinWeights/5732eaaac19af.png
new file mode 100644
index 0000000..7152af8
Binary files /dev/null and b/DB/dbPro/advancedFeatures/skinWeights/5732eaaac19af.png differ
diff --git a/DB/dbPro/advancedFeatures/skinWeights/5732eaaae3d8f.png b/DB/dbPro/advancedFeatures/skinWeights/5732eaaae3d8f.png
new file mode 100644
index 0000000..764df8a
Binary files /dev/null and b/DB/dbPro/advancedFeatures/skinWeights/5732eaaae3d8f.png differ
diff --git a/DB/dbPro/advancedFeatures/skinWeights/5732eaaaed970.png b/DB/dbPro/advancedFeatures/skinWeights/5732eaaaed970.png
new file mode 100644
index 0000000..3398ed7
Binary files /dev/null and b/DB/dbPro/advancedFeatures/skinWeights/5732eaaaed970.png differ
diff --git a/DB/dbPro/advancedFeatures/skinWeights/5732eaab0a297.png b/DB/dbPro/advancedFeatures/skinWeights/5732eaab0a297.png
new file mode 100644
index 0000000..c330738
Binary files /dev/null and b/DB/dbPro/advancedFeatures/skinWeights/5732eaab0a297.png differ
diff --git a/DB/dbPro/advancedFeatures/skinWeights/5732eaab2554a.png b/DB/dbPro/advancedFeatures/skinWeights/5732eaab2554a.png
new file mode 100644
index 0000000..edc3f35
Binary files /dev/null and b/DB/dbPro/advancedFeatures/skinWeights/5732eaab2554a.png differ
diff --git a/DB/dbPro/advancedFeatures/skinWeights/README.md b/DB/dbPro/advancedFeatures/skinWeights/README.md
new file mode 100644
index 0000000..0b728e2
--- /dev/null
+++ b/DB/dbPro/advancedFeatures/skinWeights/README.md
@@ -0,0 +1,41 @@
+### 简介
+蒙皮是指将网格点绑定在指定的骨骼上,基于绑定时分配的权重,网格点随着骨骼的运动而移动。蒙皮使得繁琐复杂的网格点操作只要通过简单的骨骼操作便能实现。
+
+### 绑定方法
+
+1. 首先要将图片转化为网格,并添加网格点。具体方法请参看[网格](../grid/README.md)
+2. 选中网格,并在属性面板勾选“开启编辑”。(或者切换到权重工具![](5732eaaaed970.png),直接选择网格,便自动开启权重编辑)
+
+![](5732eaaac19af.png)
+
+3. 开启编辑后,点击“绑定骨骼”按钮,然后依次点选需要权重绑定的骨骼。选中的骨骼会被自动分配一个颜色以便和其他的绑定骨骼区分开来。
+
+![](5732eaaa853d9.png)
+
+![](5732eaab2554a.png)
+
+4. 骨骼绑定结束后,右键点击空白处,便会基于骨骼和网格点的相对位置自动计算分配权重。(若在初次绑定后再添加新的绑定骨骼到列表中,便不会再自动计算权重,这时可以点击属性面板中的“自动权重”按钮再次自动计算权重)骨骼绑定,权重计算完毕后如下图。此时每根骨骼的权重都是0,因为我们选中的是整个网格。
+
+![](5732eaaa9e514.png)
+
+单独选中一个网格点的话,在属性面板便可以看到这个网格点分配给每根绑定骨骼的权重占比了。每根骨骼的权重比可以通过拖拽滑块儿调整。如下图
+
+![](5732eaaab3b2a.png)
+
+### 权重工具
+在上边介绍的绑定方法中,绑定结束后,选中网格点,在属性面板可以调整绑定骨骼的权重占比。更便捷的方法是使用权重工具来调整。
+在工具栏选中权重工具![](5732eaaaed970.png)后,选中网格,便可直观的看出每个网格点中不同的绑定骨骼所占的权重。权重以饼状图展示,饼状图中的颜色与骨骼的颜色相对应。
+
+![](5732eaab0a297.png)
+
+单独选中一根绑定骨骼,然后选择一个网格点(若不选择,会提示需要选择一个网格点),然后按住鼠标左键,上下拖动,便可以改变选中骨骼在选中网格点中的权重占比。
+
+![](5732eaaae3d8f.png)
+
+依次选择不同的网格点,便可以调整选中骨骼在不同网格点中的权重占比。
+如果需要快速的把一个网格点的所有权重100%的分配给选中骨骼,只要在选中骨骼的情况下,按住ALt键,然后依次点中要完全分配权重的点即可。
+
+绑定及权重分配完毕后,便可以通过调整骨骼来控制网格的变形了。
+
+### 注意事项
+> 由于蒙皮消耗的性能比较大,目前只能在 webgl 渲染模式下可使用。
diff --git a/DB/dbPro/advancedFeatures/yangCongPi/README.md b/DB/dbPro/advancedFeatures/yangCongPi/README.md
new file mode 100644
index 0000000..9b28ca7
--- /dev/null
+++ b/DB/dbPro/advancedFeatures/yangCongPi/README.md
@@ -0,0 +1,26 @@
+洋葱皮是DragonBones Pro 4.1 新增加的功能。开启洋葱皮功能后,会同时显示前后N帧(默认为3帧)的影图,方便动画师更好的定位角色动作,使连续动画更流畅。
+
+进入动画模式,点击时间轴工具栏上的洋葱皮按钮开启洋葱皮功能,如下图:
+
+![](p1.png)
+
+洋葱皮功能开启后,主场景上的动画出现蓝色(前导帧)和红色(后续帧)的影图。如下图:
+
+![](p2.png)
+
+同时,时间轴的绿色播放指针会出现前后默认覆盖3帧的洋葱皮显示区域,左侧的调整手柄为红色,右侧的调整手柄为蓝色。如下图:
+
+![](p3.png)
+
+拖动蓝色或红色手柄可以调整蓝色或红色洋葱皮显示的帧的多少。覆盖的帧数越多,在主场景中显示的影图越多。洋葱皮显示区会随着绿色播放指针的移动而移动。
+
+动画播放过程中,绿色播放指针上的洋葱皮显示区域会隐藏。主场景上,红色和蓝色的影图会随原始动画一起播放,蓝色影图的动画动作超前于原始动画,红色影图的动画动作后滞于原始动画。
+
+洋葱皮的特性:
+* 蓝或红色的洋葱皮显示区域最长不能超过动画剪辑本身的长度。
+* 虽然动画剪辑默认循环播放,但当绿色播放指针在第0帧的时候,主场景中没有红色洋葱皮影图显示。当绿色播放指针在最末一帧时,主场景中没有蓝色洋葱皮影图显示。
+
+
+
+
+
diff --git a/DB/dbPro/advancedFeatures/yangCongPi/p1.png b/DB/dbPro/advancedFeatures/yangCongPi/p1.png
new file mode 100644
index 0000000..c8489f3
Binary files /dev/null and b/DB/dbPro/advancedFeatures/yangCongPi/p1.png differ
diff --git a/DB/dbPro/advancedFeatures/yangCongPi/p2.png b/DB/dbPro/advancedFeatures/yangCongPi/p2.png
new file mode 100644
index 0000000..3d17d1a
Binary files /dev/null and b/DB/dbPro/advancedFeatures/yangCongPi/p2.png differ
diff --git a/DB/dbPro/advancedFeatures/yangCongPi/p3.png b/DB/dbPro/advancedFeatures/yangCongPi/p3.png
new file mode 100644
index 0000000..9320b0d
Binary files /dev/null and b/DB/dbPro/advancedFeatures/yangCongPi/p3.png differ
diff --git a/DB/dbPro/animation/keyframe/README.md b/DB/dbPro/animation/keyframe/README.md
new file mode 100644
index 0000000..e125833
--- /dev/null
+++ b/DB/dbPro/animation/keyframe/README.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/DB/dbPro/animation/mode/README.md b/DB/dbPro/animation/mode/README.md
new file mode 100644
index 0000000..0744d4b
--- /dev/null
+++ b/DB/dbPro/animation/mode/README.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/DB/dbPro/animation/preview/README.md b/DB/dbPro/animation/preview/README.md
new file mode 100644
index 0000000..e044c69
--- /dev/null
+++ b/DB/dbPro/animation/preview/README.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/DB/dbPro/animation/skeletonCreated/README.md b/DB/dbPro/animation/skeletonCreated/README.md
new file mode 100644
index 0000000..1d4b97b
--- /dev/null
+++ b/DB/dbPro/animation/skeletonCreated/README.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/DB/dbPro/animation/skeletonOperation/README.md b/DB/dbPro/animation/skeletonOperation/README.md
new file mode 100644
index 0000000..22f0d14
--- /dev/null
+++ b/DB/dbPro/animation/skeletonOperation/README.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/DB/dbPro/animation/slotOperation/README.md b/DB/dbPro/animation/slotOperation/README.md
new file mode 100644
index 0000000..caeb27d
--- /dev/null
+++ b/DB/dbPro/animation/slotOperation/README.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/DB/dbPro/basicConcept/framework/5576af50e0f98.png b/DB/dbPro/basicConcept/framework/5576af50e0f98.png
new file mode 100644
index 0000000..7866deb
Binary files /dev/null and b/DB/dbPro/basicConcept/framework/5576af50e0f98.png differ
diff --git a/DB/dbPro/basicConcept/framework/566538afd7dc6.png b/DB/dbPro/basicConcept/framework/566538afd7dc6.png
new file mode 100644
index 0000000..590df66
Binary files /dev/null and b/DB/dbPro/basicConcept/framework/566538afd7dc6.png differ
diff --git a/DB/dbPro/basicConcept/framework/566538b0096b1.png b/DB/dbPro/basicConcept/framework/566538b0096b1.png
new file mode 100644
index 0000000..a408532
Binary files /dev/null and b/DB/dbPro/basicConcept/framework/566538b0096b1.png differ
diff --git a/DB/dbPro/basicConcept/framework/566538b0157d4.png b/DB/dbPro/basicConcept/framework/566538b0157d4.png
new file mode 100644
index 0000000..056ee09
Binary files /dev/null and b/DB/dbPro/basicConcept/framework/566538b0157d4.png differ
diff --git a/DB/dbPro/basicConcept/framework/56653d3bd7b5e.png b/DB/dbPro/basicConcept/framework/56653d3bd7b5e.png
new file mode 100644
index 0000000..3ee9861
Binary files /dev/null and b/DB/dbPro/basicConcept/framework/56653d3bd7b5e.png differ
diff --git a/DB/dbPro/basicConcept/framework/README.md b/DB/dbPro/basicConcept/framework/README.md
new file mode 100644
index 0000000..3037292
--- /dev/null
+++ b/DB/dbPro/basicConcept/framework/README.md
@@ -0,0 +1,30 @@
+骨架是骨骼的集合,骨架中至少包含一个骨骼。一个项目中可以包含多付骨架。
+
+下图中的armatureName及其以下的树状结构便是一个典型的骨架。
+
+![](5576af50e0f98.png)
+
+DragonBones Pro 从4.3开始,支持多骨架项目。
+
+DragonBones的制作最早是依赖Flash Pro进行的。Flash Pro中的影片剪辑是可以嵌套的,对应到DragonBones格式中就是骨架的嵌套。
+
+Flash Pro制作的包含多骨架或子骨架的DragonBones动画可以完美的用DragonBones Pro进行导入和再次编辑。
+
+下图中便是一个DB导入的包含多骨架的Flash Pro项目。
+
+![](566538b0157d4.png)
+
+导入的多骨架项目中的多个骨架会显示在资源库面板中,每个骨架中包含一个库目录,指向硬盘中的一个文件夹。
+
+不同的骨架可以使用不同的库目录,也可以共享同一个库目录
+
+鼠标悬浮到子骨架上可以显示骨架的预览图。
+
+![](56653d3bd7b5e.png)
+
+
+另外工具栏了增加了两个工具按钮,上图中红色框选的,分别是创建骨架和修改库路径。
+
+点击添加骨架按钮,会弹出新建骨架对话框。新建骨架的时候要指定骨架对应的库路径。
+
+![](566538afd7dc6.png)
\ No newline at end of file
diff --git a/DB/dbPro/basicConcept/image/README.md b/DB/dbPro/basicConcept/image/README.md
new file mode 100644
index 0000000..eca0de9
--- /dev/null
+++ b/DB/dbPro/basicConcept/image/README.md
@@ -0,0 +1,18 @@
+图片是最基本的设计素材,项目所需的图片都放在资源面板里。图片需要以插槽为中介来和骨骼绑定。如下图,“头”骨骼下有“嘴”,“头”和“眼睛“三个插槽,三个插槽下又分别有一个同名的图片。绑定后,图片依附于骨骼,随着骨骼的变动而变动(旋转,缩放,平移)。
+
+![](p1.png)
+
+DragonBones Professional支持纹理集和图片文件两种图片整理方式。
+* 纹理集,一个文件里包括所有的图片,每个图片可以单独引用。
+* 图片文件, 每一个图片都是单一的文件。
+
+左侧为图片文件在资源库中的呈现方式。右侧为纹理集在资源库中的呈现方式。
+
+![](p2.png)
+
+图片特性:
+* 图片不能重命名。
+* 同一张图片可以多次被添加到场景中。
+* 如果图片在资源库的子目录中,场景树中图片的全名会包括子目录名。如下图
+
+![](p3.png)
diff --git a/DB/dbPro/basicConcept/image/p1.png b/DB/dbPro/basicConcept/image/p1.png
new file mode 100644
index 0000000..39a414b
Binary files /dev/null and b/DB/dbPro/basicConcept/image/p1.png differ
diff --git a/DB/dbPro/basicConcept/image/p2.png b/DB/dbPro/basicConcept/image/p2.png
new file mode 100644
index 0000000..da220ce
Binary files /dev/null and b/DB/dbPro/basicConcept/image/p2.png differ
diff --git a/DB/dbPro/basicConcept/image/p3.png b/DB/dbPro/basicConcept/image/p3.png
new file mode 100644
index 0000000..7fc7df1
Binary files /dev/null and b/DB/dbPro/basicConcept/image/p3.png differ
diff --git a/DB/dbPro/basicConcept/inherit/README.md b/DB/dbPro/basicConcept/inherit/README.md
new file mode 100644
index 0000000..8981d2e
--- /dev/null
+++ b/DB/dbPro/basicConcept/inherit/README.md
@@ -0,0 +1,4 @@
+DragonBones Professional中父子组件间存在继承关系。父子可以是骨骼和骨骼,也可以是骨骼和插槽。子组件会继承父组件的移动,缩放和旋转。
+* 移动的继承是指子组件随父组件移动相同的距离和方向。
+* 缩放的继承是指子组件随父组件缩放相同的大小比例。
+* 旋转的继承是指子组件会随父组件以相同的圆心,旋转相同的角度和方向。
diff --git a/DB/dbPro/basicConcept/skeleton/README.md b/DB/dbPro/basicConcept/skeleton/README.md
new file mode 100644
index 0000000..ba78c56
--- /dev/null
+++ b/DB/dbPro/basicConcept/skeleton/README.md
@@ -0,0 +1,43 @@
+
+骨骼是骨骼动画的基本组成部分。骨骼可以旋转,缩放,平移。
+
+![](p1.png)
+
+骨骼创建的方法有两种:
+
+1. 选择骨骼创建工具,在主场景内按住鼠标左键并拖拽。
+2. 点击场景树面板上的创建骨骼按钮,会创建一个骨骼点。
+
+DragonBones Pro 4.3 开始支持骨骼创建自动绑定图片。
+
+自动绑定功能可以在首选项窗口开启和关闭。
+
+当这个功能开启时,在用户通过创建骨骼工具拖拽创建骨骼时,系统就会智能的选择最匹配的图片,在松开鼠标时,骨骼创建完成,同时被选中的图片就会绑定到该骨骼上,并且骨骼会以绑定的图片命名。
+
+骨骼的起点和终点都要在图片内,才能完成自动绑定。
+
+如果用户对系统匹配的结果不满意,可以按下Ctrl键临时关闭自动匹配功能,在这种情况下松开鼠标,就不会有任何图片被绑定。同时,保持Ctrl按下,便处于手动绑定模式,用户就可以用鼠标选择指定图片(可以指定多张)绑定到刚刚创建的骨骼中。松开Ctrl键,绑定就会生效。然后可以继续创建骨骼自动绑定。
+
+DragonBones Pro 4.5.0 开始,可以设置骨骼对父骨骼旋转和缩放的继承开关。
+
+默认缩放和旋转都是勾选的,表示继承父骨骼的缩放和旋转。
+* 不勾选“缩放”,表示不继承父骨骼的缩放。此时父骨骼的缩放不会影响所选的子骨骼。
+* 不勾选“旋转”,表示不继承父骨骼的旋转。此时无论父骨骼怎么旋转,子骨骼始终指向同一个方向。(添加了IK约束的骨骼无法关闭旋转继承,关闭了旋转继承的骨骼无法添加IK约束)
+
+DragonBones Pro 4.5.0 开始,选中骨骼后,鼠标悬停在骨骼末端,会出现绿色圆圈,拖动圆圈可以改变骨骼长度。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DB/dbPro/basicConcept/skeleton/p1.png b/DB/dbPro/basicConcept/skeleton/p1.png
new file mode 100644
index 0000000..087a6f5
Binary files /dev/null and b/DB/dbPro/basicConcept/skeleton/p1.png differ
diff --git a/DB/dbPro/basicConcept/slot/README.md b/DB/dbPro/basicConcept/slot/README.md
new file mode 100644
index 0000000..c3e3673
--- /dev/null
+++ b/DB/dbPro/basicConcept/slot/README.md
@@ -0,0 +1,48 @@
+插槽是图片的容器,是骨骼和图片的桥梁。主场景中,图片的层次关系由插槽在层级面板的层次关系体现。如下图,“左小臂”在“左上臂”的上面,主场景中呈现的效果是“左小臂”盖住“左上臂”。
+
+![](p1.png)
+
+创建插槽的方法有三种:
+
+1. 直接从资源面板拖拽图片到主场景中。
+2. 从资源面板拖拽图片到场景树面板中的任一骨骼上。
+3. 选定某骨骼,点击场景树面板上的添加插槽按钮。
+
+插槽特性:
+* 插槽可以为空,不包含任何图片。
+* 一个骨骼下可以有多个插槽。
+* 同一个骨骼下的插槽在主场景中呈现时可以有不同的层次关系。层级关系仅由层级面板内的排序决定。
+* 一个插槽下可以有多张图片,但同一时间只能有一张图片处于显示状态,其他的图片会处于隐藏状态。插槽内的图片也可以全部处于隐藏状态。
+* 插槽可以删除,可以重命名。
+* 插槽删除后,其包含的图片将一同被删除。
+* 插槽的名字在同一个项目中是唯一的,不能重名。
+* 插槽内不能包含其他插槽。
+* 插槽内不能包含骨骼。
+* 插槽的位置,缩放,旋转参数其实就是其中包含的处于显示状态的图片的位置,缩放,旋转参数,如果插槽内所有图片都处于隐藏状态,则插槽的位置,缩放,旋转为空。
+* 插槽可以被复选。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DB/dbPro/basicConcept/slot/p1.png b/DB/dbPro/basicConcept/slot/p1.png
new file mode 100644
index 0000000..90aff0c
Binary files /dev/null and b/DB/dbPro/basicConcept/slot/p1.png differ
diff --git a/DB/dbPro/export/exportAnimation/README.md b/DB/dbPro/export/exportAnimation/README.md
new file mode 100644
index 0000000..822ea3c
--- /dev/null
+++ b/DB/dbPro/export/exportAnimation/README.md
@@ -0,0 +1,92 @@
+DragonBones Professional 支持导出DragonBones,MovieClip和序列帧格式。
+
+##### 导出DragonBones, 表示导出DragonBones骨骼动画格式:
+* 导出位置默认为“我的文档”+项目名,用户可以手动指定。如果导出zip包,则包文件会出现在指定的输出路径下。如果导出项目文件夹,则会在指定的输出路径下建立和项目名相同的子目录,其下包含数据文件和图片。
+* 配套纹理支持纹理集和图片文件。如果选择纹理集,右侧会显示纹理集预览,如果选择图片文件,右侧为空。
+* 数据格式支持json和xml。
+* 输出比例默认为1。用户可以输入数值来控制导出项目的缩放。(4096x4096为单张纹理集的最大尺寸,超过此尺寸输出的比例将缩小)
+* 填充背景颜色,默认为不勾选,勾选后用户可以点击右边的颜色方块儿打开颜色选择窗口,选择需要作为背景色的颜色。
+* 打包zip,默认为不勾选,也就是导出项目文件夹。勾选则导出zip包形式的项目文件。
+
+##### 导出MovieClip, 表示导出MovieClip动画格式:
+* 导出位置的设置和规则与导出DragonBones相同。
+* MovieClip只支持导出为纹理集。
+* 输出比例设置与导出DragonBones相同。
+* 背景色设置与导出DragonBones相同。
+
+##### 导出序列帧,表示导出序列帧:
+* 纹理集:序列帧图片会集合到一张或几张纹理集上导出(取决于纹理集最大宽度和高度的设置,参看下边的纹理集设置)
+* 图片文件:每一帧动画会导出成单张的图片文件。
+* 导出内容:可以选择导出“全部动画”或“当前动画”。
+* 输出比例设置与导出DragonBones相同。
+* 背景色设置与导出DragonBones相同。(只有选择纹理集时可以设置背景色,图片文件不支持设置背景色)
+
+##### 纹理集设置
+选中纹理集,点击右侧“设置…"按钮可以打开纹理集设置窗口,如下图:
+* 透明区域裁剪:生成纹理集的时候裁剪掉图片周围的透明区域,使得纹理集尺寸最小,再次导入时会恢复被裁剪掉的透明区域范围。忠实还原原有项目。
+* 2的幂:确保输出图片的尺寸大小为 2 的幂。
+* 正方形: 导出的纹理集长宽相等,为正方形。
+* 背景色:与外层的导出数据窗口上的选项相同,而且彼此同步。
+* 水平间距:纹理集中,图片间的左右间距。
+* 垂直间距:纹理集中,图片间的上下间隔。
+* 自动尺寸:勾选后DB会按照一张纹理集自动设置纹理集尺寸。
+ * 如果“自动尺寸”没有勾选,便可以设置“最大宽度”和“最大高度”。
+ * 通过“最大宽度”和“最大高度”的设置可以实现多纹理集的导出。这是考虑到有些移动设备最大支持1024x1024尺寸的纹理集,通过导出多纹理集,便能解决这个问题。当要导出的纹理超过最大宽度和高度后,纹理集便会分页,生成多纹理集。导出多纹理集的同时,也会生成对应的多配置文件。
+* 输出比例:与外层的导出数据窗口上的选项相同,而且彼此同步。
+* 输出尺寸:显示输出的纹理集的尺寸。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DB/dbPro/hotkey/hotkey/README.md b/DB/dbPro/hotkey/hotkey/README.md
new file mode 100644
index 0000000..8d2a363
--- /dev/null
+++ b/DB/dbPro/hotkey/hotkey/README.md
@@ -0,0 +1,24 @@
+
+| 功能 | 主快捷键 | 副快捷键 |
+|:------------- |:---------------:| -------------:|
+| 撤销 | Ctrl + Z| |
+| 重做 | Ctrl + Y| Ctrl + Shift + Z |
+| 删除骨骼/插槽/图片/关键帧 | Delete | Backspace |
+| 选择工具 | V | |
+| Pose工具 | P | |
+| 移动工具 |H | |
+| 创建骨骼工具 | N | |
+| 插槽上移一层 | [ | |
+| 插槽下移一层 | ] | |
+| 新建项目 | Ctrl + N | |
+| 打开项目 | Ctrl + O | |
+| 保存项目 | Ctrl + S | |
+| 导入 | | Ctrl + I |
+| 导出 | | Ctrl + E |
+| 播放动画 | Enter | |
+|预览| | Ctrl + Enter |
+| 添加/更新关键帧 | K | |
+| 复制关键帧 | Ctrl + C | |
+| 粘贴关键帧 | Ctrl + V | |
+| 左移时间轴播放指针 | , | |
+| 右移时间轴播放指针 | . | |
diff --git a/DB/dbPro/import/importCommandLine/README.md b/DB/dbPro/import/importCommandLine/README.md
new file mode 100644
index 0000000..e33b919
--- /dev/null
+++ b/DB/dbPro/import/importCommandLine/README.md
@@ -0,0 +1,30 @@
+DragonBones pro 从 4.3 开始支持命令行导入,实现批处理
+``` typescript
+Import ( dbdata="",texturefolder="", textureatlas="xxx.png", texturedata="" dbdatapack="",plugin="auto",projectname="",projectpath="")
+```
+
+命令名:import
+参数列表:
+
+|参数|说明|
+| ------------ | ------------ |
+|dbdata|散图或纹理集项目中,导入项目的数据问题路径。|
+|texturefolder|散图项目中,图片资源路径。|
+|textureatlas|纹理集项目中,纹理集图片资源路径。|
+|texturedata|纹理集项目中,纹理集数据文件资源路径。|
+|dbdatapack|zip项目中,zip文件的资源路径。|
+|plugin|【可选参数】仅当导入的项目是散图项目或纹理集项目时可用,用于指定导入所使用的插件名称。默认是auto,即会根据实际数据自动选择插件解析,如为任意不存在插件名称,会使用DragonBonesPro自带引擎解析。|
+|projectname|【可选参数】导入后新项目的名称,默认为原数据的名称。|
+|projectpath|【可选参数】导入后新项目的地址,默认为用户文档目录下DBProjects文件夹下。|
+
+上表所示参数中,根据不同的导入类型,需要填写的必选参数是不同的
+- 导入散图项目:dbdata, texturefolder 是必选参数
+示例: `DragonBonesPro import dbdata="C:\Demon.ExportJson" texturefolder="C:\texture" plugin="auto" projectname="new" projectpath="C:\ceshi"`
+
+- 导入纹理集项目:dbdata,textureatlas,texturedata 是必选参数
+示例: `DragonBonesPro import dbdata="C:\Demon.ExportJson" textureatlas="C:\Demon0.png" texturedata="C:\Demon0.plist" plugin="auto" projectname="new" projectpath="C:\ceshi"`
+
+- 导入数据包项目:dbdatapack是必选参数
+示例: `DragonBonesPro import dbdatapack="C:\DragonOpening.zip" projectname="new" projectpath="C:\ceshi"`
+
+注意:以上三种导入类型是互斥的,导入时只可根据一种导入类型填写参数。
diff --git a/DB/dbPro/import/importCosos/README.md b/DB/dbPro/import/importCosos/README.md
new file mode 100644
index 0000000..73daf87
--- /dev/null
+++ b/DB/dbPro/import/importCosos/README.md
@@ -0,0 +1,14 @@
+基于内置的Cocos和Spine导入插件,DragonBones支持导入Cocos和Spine的导出项目。
+
+如果用户选择导入Cocos或Spine的导出项目,以Spine为例导入窗口扩展如下
+
+导入Spine的项目时,支持导入图片文件或纹理集项目。导入图片文件时,用户需要手动指定图片目录的路径。导入纹理集项目时,会自动加载纹理集和配置文件所在的位置,如果加载失败,用户需要手动指定。
+
+当前版本只能导入到新建项目,导入到当前项目不可用。
+项目名称默认为导入的项目文件的文件名。
+
+项目位置默认为“我的文档”+项目名称。DragonBones Professional会记住上一次用户选择的路径,勾选了“使用默认位置”的话,DragonBones Professional 会默认使用上一次用户选择的路径。 不勾选“使用默认位置“的话,用户可以手动指定项目保存的位置。
+
+如果图片目录上找不到皮肤,完成按钮也是亮起的,可以点击。以保证用户可以导入不包含图片的项目文件。
+
+
diff --git a/DB/dbPro/import/importFolder/5576ba3ab6ac9.png b/DB/dbPro/import/importFolder/5576ba3ab6ac9.png
new file mode 100644
index 0000000..26fd433
Binary files /dev/null and b/DB/dbPro/import/importFolder/5576ba3ab6ac9.png differ
diff --git a/DB/dbPro/import/importFolder/README.md b/DB/dbPro/import/importFolder/README.md
new file mode 100644
index 0000000..9650fda
--- /dev/null
+++ b/DB/dbPro/import/importFolder/README.md
@@ -0,0 +1,53 @@
+如果项目文件为文件夹形式,则选择相应的项目数据文件,json, xml或 amf。
+
+DragonBones Professional 会自动判断项目使用的是图片文件还是纹理集,然后切换对应的导入选项,用户也可以手动切换。
+
+a ). 纹理集
+
+如果是纹理集,导入窗口扩展如下
+
+纹理集路径和配置文件路径默认与项目数据文件在同级目录下。用户可以手动指定。
+
+DragonBones pro 从4.3开始支持多纹理集的导入。
+
+可以添加复数的纹理集文件和配置文件。(注:每个纹理集都要有一个对应的配置文件,也就是纹理集和配置文件是成对出现的。)
+
+* 导入到新建项目:新建一个项目,将导入项目放在其中。
+* 导入到当前项目:导入的项目会添加到当前项目中。DragonBones pro从4.3开始支持多骨架,新导入到当前项目中的骨架会显示在资源库中。
+
+项目名称默认为导入的项目文件的文件名。
+
+项目位置默认为“我的文档”+项目名称。DragonBones Professional会记住上一次用户选择的路径,勾选了“使用默认位置”的话,DragonBones Professional 会默认使用上一次用户选择的路径。 不勾选“使用默认位置“的话,用户可以手动指定项目保存的位置。
+
+b ). 图片文件
+
+如果是图片文件,导入窗口扩展如下
+
+![](5576ba3ab6ac9.png)
+
+皮肤路径默认为项目数据文件所在目录+texture,用户也可以手动指定。
+
+* 导入到新建项目:新建一个项目,将导入项目放在其中。
+* 导入到当前项目:导入的项目会添加到当前项目中。DragonBones pro从4.3开始支持多骨架,新导入到当前项目中的骨架会显示在资源库中。
+
+项目名称默认为导入的项目文件的文件名。
+
+项目位置默认为“我的文档”+项目名称。DragonBones Professional会记住上一次用户选择的路径,勾选了“使用默认位置”的话,DragonBones Professional 会默认使用上一次用户选择的路径。 不勾选“使用默认位置“的话,用户可以手动指定项目保存的位置。
+
+如果图片目录上找不到皮肤,完成按钮也是亮起的,可以点击。以保证用户可以导入不包含图片的项目文件。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DB/dbPro/import/importPNG/5576ba6ac0a4f.png b/DB/dbPro/import/importPNG/5576ba6ac0a4f.png
new file mode 100644
index 0000000..3561458
Binary files /dev/null and b/DB/dbPro/import/importPNG/5576ba6ac0a4f.png differ
diff --git a/DB/dbPro/import/importPNG/README.md b/DB/dbPro/import/importPNG/README.md
new file mode 100644
index 0000000..c1c5425
--- /dev/null
+++ b/DB/dbPro/import/importPNG/README.md
@@ -0,0 +1,11 @@
+如果用户选择集成数据的PNG,导入窗口扩展如下
+
+![](5576ba6ac0a4f.png)
+
+当前版本只能导入到新建项目,导入到当前项目不可用。
+
+项目名称默认为导入的项目文件的文件名。
+
+项目位置默认为“我的文档”+项目名称。DragonBones Professional会记住上一次用户选择的路径,勾选了“使用默认位置”的话,DragonBones Professional 会默认使用上一次用户选择的路径。 不勾选“使用默认位置“的话,用户可以手动指定项目保存的位置。
+
+
diff --git a/DB/dbPro/import/importPSD/5576bace6bf73.png b/DB/dbPro/import/importPSD/5576bace6bf73.png
new file mode 100644
index 0000000..3aabeaf
Binary files /dev/null and b/DB/dbPro/import/importPSD/5576bace6bf73.png differ
diff --git a/DB/dbPro/import/importPSD/README.md b/DB/dbPro/import/importPSD/README.md
new file mode 100644
index 0000000..a3f8901
--- /dev/null
+++ b/DB/dbPro/import/importPSD/README.md
@@ -0,0 +1,29 @@
+DragonBones Professional提供脚本文件,可以很方便将Photoshop中的设计图导出成DragonBones Professional支持的,可以导入的项目文件。
+
+* 在windows系统上,脚本文件的位置是:
+ * **{Dragon Bones Professional的安装目录}\PSExportDB.jsx**
+
+* 在Mac系统上,在应用程序中找到DragonBones Pro.app,然后右键单击选择显示包内容,然后在以下位置可以找到脚本文件:
+ * **/Contents/Resources/PSExportDB.jsx**
+
+在Photoshop中,打开设计图,然后依次在菜单中选择文件->脚本->浏览, 然后在打开的系统定位窗口中找到PSExportDB.jsx文件,选择打开。弹出如下对话框:
+
+![](5576bace6bf73.png)
+
+* Export PNGs 导出图片
+* Export JSON 导出json文件
+* Ignore Hidden Layers 忽略隐藏图层
+* Image Scale 整体缩放比例
+
+依照需求设置好,点击OK。Photoshop便开始导出。导出完成后,在设计图所在的目录下会生成一个 DragonBones/{PSD的文件名}/ 的目录,如果你导出时同时勾选了PNGs和JSON,其下会有和.psd文件同名的一个json文件和一个texture目录。Texture目录下是所有的PNG图片文件。
+
+导入时,在DragonBones Professional的导入窗口选择导出的json文件,纹理类型选择“图片文件”,便可以把设计图导入到DragonBones Professional中了。
+
+导入后,图片的相对位置,大小和相互间的层级关系都和PS中完全相同。
+
+
+
+
+
+
+
diff --git a/DB/dbPro/import/importZip/5576b9b8f0ad9.png b/DB/dbPro/import/importZip/5576b9b8f0ad9.png
new file mode 100644
index 0000000..dd99da4
Binary files /dev/null and b/DB/dbPro/import/importZip/5576b9b8f0ad9.png differ
diff --git a/DB/dbPro/import/importZip/README.md b/DB/dbPro/import/importZip/README.md
new file mode 100644
index 0000000..1377ffa
--- /dev/null
+++ b/DB/dbPro/import/importZip/README.md
@@ -0,0 +1,13 @@
+
+如果选择zip包的项目文件,导入窗口扩展成如下
+
+![](5576b9b8f0ad9.png)
+
+当前版本只能导入到新建项目,导入到当前项目不可用。
+
+项目名称默认为导入的项目文件的文件名。
+
+项目位置默认为“我的文档”+项目名称。DragonBones Professional会记住上一次用户选择的路径,勾选了“使用默认位置”的话,DragonBones Professional 会默认使用上一次用户选择的路径。 不勾选“使用默认位置“的话,用户可以手动指定项目保存的位置。
+
+
+
diff --git a/DB/dbPro/interface/animationPanel/README.md b/DB/dbPro/interface/animationPanel/README.md
new file mode 100644
index 0000000..100e534
--- /dev/null
+++ b/DB/dbPro/interface/animationPanel/README.md
@@ -0,0 +1,13 @@
+
+![动画面板](p1.png)
+
+动画面板用于显示和编辑动画剪辑。右上角按钮依次为:新建动画剪辑按钮,克隆动画剪辑按钮,重命名和删除动画剪辑按钮。此面板只能在动画制作下显示。
+
+动画面板下边的三个参数分别是:
+* 动画时间:不可编辑。单位为秒。动画剪辑的实际持续时间依照帧率和动画剪辑的总帧数计算得出。
+* 过度时间:默认值为0, 可编辑。单位为秒。用来设定游戏中不同动画间的过度时间。
+* 播放次数:默认值为0, 可编辑。用来设定游戏中动画的重复次数,当设为0时表示无限次重复。
+
+
+
+
diff --git a/DB/dbPro/interface/animationPanel/p1.png b/DB/dbPro/interface/animationPanel/p1.png
new file mode 100644
index 0000000..a969976
Binary files /dev/null and b/DB/dbPro/interface/animationPanel/p1.png differ
diff --git a/DB/dbPro/interface/firstChoice/56664a7fcc767.png b/DB/dbPro/interface/firstChoice/56664a7fcc767.png
new file mode 100644
index 0000000..7307d86
Binary files /dev/null and b/DB/dbPro/interface/firstChoice/56664a7fcc767.png differ
diff --git a/DB/dbPro/interface/firstChoice/README.md b/DB/dbPro/interface/firstChoice/README.md
new file mode 100644
index 0000000..8a98877
--- /dev/null
+++ b/DB/dbPro/interface/firstChoice/README.md
@@ -0,0 +1,15 @@
+在菜单栏,选择 文件->首选项,可以开启首选项窗口。
+![](56664a7fcc767.png)
+- 常规
+ - 删除前确认:默认勾选,删除骨骼,插槽或图片时会弹出删除确认窗口。如果不勾选则不会弹出确认窗口。
+ - 图片平滑显示:默认勾选,此时DragonBones Pro中的图片会使用平滑显示。不勾选的话,图片不会做平滑处理,图片看起来会更锐利和清晰,但可能会出现锯齿。
+ - 骨骼自动绑定图片:默认勾选,创建骨骼时,会自动绑定和骨骼重合的图片。不勾选的话,便不会自动绑定。
+- 颜色尺寸
+ - 背景颜色:设置主工作场景的背景色。(不会影响导出,只改变工作场景的背景色)
+ - 骨骼颜色:设置骨骼的颜色。
+ - 背景尺寸:设置背景方格的尺寸。
+ - 骨骼尺寸:设置骨骼的显示尺寸。
+- 账户
+登陆Egret社区账号。
+- 恢复默认值
+恢复所有首选项的默认设置。
\ No newline at end of file
diff --git a/DB/dbPro/interface/inheritToolbar/5576b6120294c.png b/DB/dbPro/interface/inheritToolbar/5576b6120294c.png
new file mode 100644
index 0000000..1b68ded
Binary files /dev/null and b/DB/dbPro/interface/inheritToolbar/5576b6120294c.png differ
diff --git a/DB/dbPro/interface/inheritToolbar/README.md b/DB/dbPro/interface/inheritToolbar/README.md
new file mode 100644
index 0000000..bab64f4
--- /dev/null
+++ b/DB/dbPro/interface/inheritToolbar/README.md
@@ -0,0 +1,21 @@
+
+
+![](5576b6120294c.png)
+
+* 显示/可选/继承工具用于打开和关闭骨骼和插槽的显示,可选,继承关系。
+
+* 显示: 打开时,骨骼或插槽在主场景中可见。关闭时,骨骼或插槽在主场景中不可见。
+
+* 可选:打开时,骨骼或插槽在主场景中可以被选中。关闭时,骨骼或插槽在主场景中不可以被选中。
+
+* 继承:打开时,骨骼或插槽会继承父骨骼的动作。关闭时,骨骼或插槽不会继承父骨骼的动作。
+
+
+
+特性:
+
+* 骨骼和插槽的显示在骨架装配和动画制作下均可用。
+
+* 骨骼和插槽的可选在动画制作下,骨骼默认为可选且可修改,插槽默认为不可选且不可修改。
+
+* 骨骼和插槽的继承在动画制作下默认为继承且不可修改。
\ No newline at end of file
diff --git a/DB/dbPro/interface/levelPanel/README.md b/DB/dbPro/interface/levelPanel/README.md
new file mode 100644
index 0000000..5534b46
--- /dev/null
+++ b/DB/dbPro/interface/levelPanel/README.md
@@ -0,0 +1,3 @@
+![层级面板](p1.png)
+
+层级面板用于显示和编辑主场景中插槽的上下层级关系。可以通过拖拽改变插槽间的层级关系。选中插槽后,也可以点击右上角的向上一层和向下一层按钮或快捷键[]来改变层级关系。此面板只出现在骨架装配模式下。
diff --git a/DB/dbPro/interface/levelPanel/p1.png b/DB/dbPro/interface/levelPanel/p1.png
new file mode 100644
index 0000000..90aff0c
Binary files /dev/null and b/DB/dbPro/interface/levelPanel/p1.png differ
diff --git a/DB/dbPro/interface/mainInterface/README.md b/DB/dbPro/interface/mainInterface/README.md
new file mode 100644
index 0000000..35f4840
--- /dev/null
+++ b/DB/dbPro/interface/mainInterface/README.md
@@ -0,0 +1,9 @@
+![](p1.png)
+
+1. 主场景。 装配骨架和制作动画的主要操作区域。
+2. 系统工具栏。 项目操作的工具栏。
+3. 主场景工具栏。 鼠标模式切换的工具栏。
+4. 编辑模式切换。 切换骨架装配和动画制作。
+5. 显示/可选/继承 开关面板。 骨架和插槽的显示/可选/继承的开关面板。
+6. 其他面板。 包括场景树、层级、变换、动画、属性和资源面板。
+7. 时间轴面板。
diff --git a/DB/dbPro/interface/mainInterface/p1.png b/DB/dbPro/interface/mainInterface/p1.png
new file mode 100644
index 0000000..3a8a78b
Binary files /dev/null and b/DB/dbPro/interface/mainInterface/p1.png differ
diff --git a/DB/dbPro/interface/modeToolbar/README.md b/DB/dbPro/interface/modeToolbar/README.md
new file mode 100644
index 0000000..1838c27
--- /dev/null
+++ b/DB/dbPro/interface/modeToolbar/README.md
@@ -0,0 +1,3 @@
+![](p1.png)
+
+编辑模式切换控件用于切换骨架装配和动画制作。
diff --git a/DB/dbPro/interface/modeToolbar/p1.png b/DB/dbPro/interface/modeToolbar/p1.png
new file mode 100644
index 0000000..9bd2290
Binary files /dev/null and b/DB/dbPro/interface/modeToolbar/p1.png differ
diff --git a/DB/dbPro/interface/propertiesPanel/README.md b/DB/dbPro/interface/propertiesPanel/README.md
new file mode 100644
index 0000000..f548291
--- /dev/null
+++ b/DB/dbPro/interface/propertiesPanel/README.md
@@ -0,0 +1,29 @@
+
+![插槽属性面板](p1.png) ![骨骼属性面板](p2.png) ![骨骼帧的属性](p3.png)
+
+属性面板用于显示和编辑骨骼或插槽的各种属性值。a为插槽的属性面板,b为骨骼的属性面板, c为骨骼帧的属性面板。此面板在骨架装配和动画制作下均可显示。(骨骼帧属性面板只出现在动画制作)
+
+a ). 插槽的属性:
+
+不含图片的空插槽的属性只有名字,名字可以编辑,效果和重命名相同。
+
+包含有图片的插槽的属性包括:名字,显示图片,颜色和透明度。
+* 其中名字可以编辑,效果和重命名相同。
+* 显示图片为当前插槽内可见并显示的图片,插槽内的所有图片都会在这个下拉列表中。显示图片显示为“空”时,插槽内的所有图片均隐藏,没有图片被显示。
+* 颜色为叠加在图片上的颜色,点击会打开颜色选择窗口。默认为白色,表示无颜色叠加。
+* 透明度默认为100%,表示不透明。最小为0%,表示完全透明。
+
+b ). 骨骼的属性包括:
+
+名字和长度。其中名字可以编辑,效果和重命名相同。长度可以编辑,控制骨骼的长度。(动画制作模式下,长度和名字都不可编辑)
+
+c ). 骨骼帧的属性包括:
+
+名称和动作。名称不可编辑。动作包括三个属性:事件,跳转,声音。可以根据游戏开发的要求填写相应的值。
+
+
+
+
+
+
+
diff --git a/DB/dbPro/interface/propertiesPanel/p1.png b/DB/dbPro/interface/propertiesPanel/p1.png
new file mode 100644
index 0000000..543b8ce
Binary files /dev/null and b/DB/dbPro/interface/propertiesPanel/p1.png differ
diff --git a/DB/dbPro/interface/propertiesPanel/p2.png b/DB/dbPro/interface/propertiesPanel/p2.png
new file mode 100644
index 0000000..cba72c9
Binary files /dev/null and b/DB/dbPro/interface/propertiesPanel/p2.png differ
diff --git a/DB/dbPro/interface/propertiesPanel/p3.png b/DB/dbPro/interface/propertiesPanel/p3.png
new file mode 100644
index 0000000..68896cf
Binary files /dev/null and b/DB/dbPro/interface/propertiesPanel/p3.png differ
diff --git a/DB/dbPro/interface/resourcesPanel/README.md b/DB/dbPro/interface/resourcesPanel/README.md
new file mode 100644
index 0000000..a0ed9a8
--- /dev/null
+++ b/DB/dbPro/interface/resourcesPanel/README.md
@@ -0,0 +1,11 @@
+
+![资源面板](p1.png)
+
+右上角按钮依次为:导入资源按钮,打开库文件夹按钮和刷新按钮。此面板只可以在骨架装配模式下显示。
+
+项目所使用的所有图片都保存在资源面板中。DragonBones Professional每个项目的资源库都对应一个系统中实际存在的文件夹,文件夹中DragonBones Professional所支持的PNG图片都会被显示在资源面板中。
+
+可以通过由系统其他文件夹向DragonBones Professional 的资源面板中拖拽PNG文件的方法,向资源库里添加图片,相应的PNG文件也会被拷贝到对应的资源库文件夹中。也可以点击“导入资源”按钮,在弹出的系统窗口中指定要添加的资源PNG文件。
+
+
+
diff --git a/DB/dbPro/interface/resourcesPanel/p1.png b/DB/dbPro/interface/resourcesPanel/p1.png
new file mode 100644
index 0000000..d2406fe
Binary files /dev/null and b/DB/dbPro/interface/resourcesPanel/p1.png differ
diff --git a/DB/dbPro/interface/sceneTreePanel/README.md b/DB/dbPro/interface/sceneTreePanel/README.md
new file mode 100644
index 0000000..00e2acc
--- /dev/null
+++ b/DB/dbPro/interface/sceneTreePanel/README.md
@@ -0,0 +1,16 @@
+![](p1.png)
+
+场景树面板用于显示和编辑主场景中骨骼和插槽的父子树形关系。
+
+右上角按钮依次为:点骨骼创建按钮,插槽创建按钮,重命名按钮和删除按钮。
+
+骨架装配模式下,双击场景树中的骨骼或插槽会弹出重命名窗口。
+
+此面板在骨架装配和动画制作下均可显示。但在动画制作下,不可编辑。
+
+骨骼和插槽可以在场景树中复选。
+
+骨骼继承关系在场景树中的编辑:
+* 骨骼间的继承关系可以通过在场景树面板内拖拽改变。
+* 子骨骼可以被拖拽到同级或父及其以上的骨骼下。
+* 父骨骼不能被拖拽到它的子骨骼及其以下骨骼下。
diff --git a/DB/dbPro/interface/sceneTreePanel/p1.png b/DB/dbPro/interface/sceneTreePanel/p1.png
new file mode 100644
index 0000000..cd9d714
Binary files /dev/null and b/DB/dbPro/interface/sceneTreePanel/p1.png differ
diff --git a/DB/dbPro/interface/sharePanel/README.md b/DB/dbPro/interface/sharePanel/README.md
new file mode 100644
index 0000000..480aff1
--- /dev/null
+++ b/DB/dbPro/interface/sharePanel/README.md
@@ -0,0 +1,16 @@
+
+提供了一个展示您优秀作品的平台,通过作品分享功能,您可以将自己满意作品分享给大家。
+通过点击系统工具栏上的作品分享按钮或文件菜单中的作品分享选项进入作品分享页面。
+
+![](p1.png)
+
+首先需要用Egret ID登陆(Egret ID,就是Egret开发者社区的账号),如果没有注册,请先访问开发者社区注册一个Egret ID。
+
+![](p2.png)
+
+登陆后,作品分享页面弹出
+
+![](p3.png)
+
+当前选中项目会作为准备分享的作品,您可以填写作品的名称和描述。然后附上一张作品的截图。填写好您的详细联系方式。勾选“同意EDN开发者内容协议”,然后点击“上传”按钮,就可以将您的作品分享出去。
+
diff --git a/DB/dbPro/interface/sharePanel/p1.png b/DB/dbPro/interface/sharePanel/p1.png
new file mode 100644
index 0000000..c5b01bc
Binary files /dev/null and b/DB/dbPro/interface/sharePanel/p1.png differ
diff --git a/DB/dbPro/interface/sharePanel/p2.png b/DB/dbPro/interface/sharePanel/p2.png
new file mode 100644
index 0000000..89700d7
Binary files /dev/null and b/DB/dbPro/interface/sharePanel/p2.png differ
diff --git a/DB/dbPro/interface/sharePanel/p3.png b/DB/dbPro/interface/sharePanel/p3.png
new file mode 100644
index 0000000..73594ab
Binary files /dev/null and b/DB/dbPro/interface/sharePanel/p3.png differ
diff --git a/DB/dbPro/interface/systemToolbar/README.md b/DB/dbPro/interface/systemToolbar/README.md
new file mode 100644
index 0000000..849579d
--- /dev/null
+++ b/DB/dbPro/interface/systemToolbar/README.md
@@ -0,0 +1,14 @@
+![](p1.png)
+
+从左到右的按钮依次是:新建项目,打开项目,保存项目,撤销,重做,导入,导出,预览,作品分享。
+
+* 新建项目,用于新建一个项目,点击将打开新建项目对话框。
+* 打开项目,用于打开一个已有项目,点击将打开系统指定文件对话框。
+* 保存项目,如果当前的项目有更改,保存项目按钮将亮起,点击将保存当前项目,项目保存后,保存按钮暗掉。
+* 撤销,用于撤销上一次的编辑操作。
+* 重做,用于重做上一次撤销掉的编辑操作。
+* 导入,用于导入一个支持的项目文件格式,点击将打开导入对话框。
+* 导出,用于导出项目,点击将打开导出对话框。
+* 预览, 在浏览器中预览动画的运行效果。如果项目包含多个动画剪辑,可以在浏览器中鼠标左键单击来切换。
+* 作品分享,打开作品分享上传页面。
+
diff --git a/DB/dbPro/interface/systemToolbar/p1.png b/DB/dbPro/interface/systemToolbar/p1.png
new file mode 100644
index 0000000..7d4de29
Binary files /dev/null and b/DB/dbPro/interface/systemToolbar/p1.png differ
diff --git a/DB/dbPro/interface/timelinePanel/README.md b/DB/dbPro/interface/timelinePanel/README.md
new file mode 100644
index 0000000..58be491
--- /dev/null
+++ b/DB/dbPro/interface/timelinePanel/README.md
@@ -0,0 +1,116 @@
+
+![](p1.png)
+
+时间轴面板用于动画剪辑的编辑。此面板只能在动画制作下显示。
+
+a ). 播放控制工具
+
+![](p2.png)
+
+时间轴面板上的播放控制工具,用于控制动画剪辑的播放。由左向右依次为:回到首帧按钮,前一帧按钮,倒放按钮,播放按钮,下一帧按钮,最后一帧按钮,播放速度控制滑块,当前帧,当前时间,帧率。
+* 播放速度控制滑块的控制范围是0.1x ~ 10x。
+* 当前帧:可编辑,输入具体的帧数,绿色播放指针便会跳转到相应的帧数。拖动绿色指针或播放动画,当前帧的数值也会跟着相应的变化。
+* 当前时间:不可编辑,基于当前帧和帧率计算得出。
+* 帧率:可编辑,默认为24fps。设定每一秒钟的动画有多少帧。
+
+
+b ). 帧编辑工具栏
+
+![](p3.png)
+
+帧编辑工具栏,由左向右依次为:洋葱皮按钮,复制帧按钮,剪切帧按钮,粘贴帧按钮,删除帧按钮。
+
+* 洋葱皮按钮:开关洋葱皮功能。
+* 复制帧按钮:选中关键帧后点击,帧的参数便被复制到剪切板中。
+* 剪切帧按钮:选中关键帧后点击,帧的参数便被剪切到剪切板中。
+* 粘贴帧按钮: 剪切板中的帧参数可以被粘贴到时间轴的任意帧数,任意层(骨骼层和插槽层的帧不能互相粘贴,关键帧中记录的参数是与上一个关键帧的相对变动值,0帧的相对变动值均为0),也可以覆盖已存在关键帧。
+* 删除帧按钮: 删除当前选中帧。
+
+c ). 时间轴工具栏
+
+![](p4.png)
+
+时间轴工具栏,由左向右依次为:折叠列表,展开列表,向右移动帧,向左移动帧,自动关键帧按钮,添加关键帧按钮,曲线图面板按钮。
+* 折叠列表:折叠时间轴上所有的层。
+* 展开列表:展开时间轴上所有的层。
+* 向右移动一帧,向左移动一帧: 点击按钮将整体移动选中关键帧以右的所有关键帧。若左侧的上一帧已有关键帧,则不能再向左移动,向左移动关键帧按钮将灰掉。
+* 自动关键帧:具有开关两种状态的按钮,白色为关,红色为开。开启后,对骨骼或插槽的改动将会在绿色播放指针所在帧和相应的骨骼或插槽层上自动添加关键帧。
+* 添加关键帧按钮: 三种状态按钮,白色表示无改动,无关键帧。黄色表示有改动未添加或更新关键帧。红色表示无改动已添加或更新关键帧。白色或黄色状态下,点击按钮,将在绿色播放指针所在帧和相应骨骼层或插槽层上添加或更新关键帧。红色状态下点击无效果。红色或白色状态下,改动骨骼或插槽,按钮将变为黄色,表示骨骼或插槽发生改动。无骨骼或插槽选中时,按钮不可用。
+* 曲线图面板按钮:开关曲线图面板。
+
+d ). 时间轴缩放工具
+
+![](p5.png)
+
+时间轴缩放工具用于控制时间轴的比例缩放。左侧为适合屏幕按钮,-和+按钮控制缩小和放大。拖动滑块也可以控制缩放。
+
+e ). 时间轴
+
+![](p6.png)
+
+* 骨骼层内关键帧为白色,插槽层内关键帧为黄色,事件层内关键帧为红色,含有事件,跳转,声音的骨骼关键帧为粉色。
+* 时间轴的第一层为动画剪辑层,不能直接编辑,在其他任意层添加关键帧后,动画剪辑层便会出现菱形方块,表示当前帧下某层或多层存在关键帧。白色表示为骨骼层关键帧,黄色表示插槽层关键帧,红色为事件层关键帧,粉色为存在多种层混合的关键帧。选中菱形方块便选中这一帧数下的所有关键帧。可以进行整体左右平移,拖拽,复制,剪切,粘贴,删除。
+* 只要相应帧数下存在关键帧,时间轴标尺上便会出现红线,时间轴标尺不会随时间轴的上下滚动条滚动,始终可见。
+* 时间轴的第一级为骨骼层或事件层,第二级为插槽层,插槽层相对骨骼层向右缩进一层。时间轴内不体现父子骨骼的层级关系。事件层只有一层。
+* 选中的层会高亮,对应层的骨骼或插槽也会被选中,反之,选中骨骼或插槽,对应的层也会被选中。
+* 关键帧可以在时间轴同层内任意拖拽。
+
+帧的框选
+
+DragonBones Pro 4.2 开始支持时间轴内的帧的框选操作。在时间轴内可以框选所要操作的帧,选中后,可以对帧进行,复制,剪切,删除等操作。
+
+框选后,鼠标移动到选框内部,鼠标光标变为十字四向箭头时,点击拖拽,可以左右平移选中帧。
+
+平移后效果如下图。
+
+框选后,鼠标移动到选框边缘,鼠标光标变为左右箭头时,点击拖拽,可以缩放选中帧的间距,进而改变动画的速度。
+
+缩放后,效果如下图。
+
+按住Ctrl键可以连续框选帧。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DB/dbPro/interface/timelinePanel/p1.png b/DB/dbPro/interface/timelinePanel/p1.png
new file mode 100644
index 0000000..fc2723c
Binary files /dev/null and b/DB/dbPro/interface/timelinePanel/p1.png differ
diff --git a/DB/dbPro/interface/timelinePanel/p2.png b/DB/dbPro/interface/timelinePanel/p2.png
new file mode 100644
index 0000000..4c98e4b
Binary files /dev/null and b/DB/dbPro/interface/timelinePanel/p2.png differ
diff --git a/DB/dbPro/interface/timelinePanel/p3.png b/DB/dbPro/interface/timelinePanel/p3.png
new file mode 100644
index 0000000..c178ba8
Binary files /dev/null and b/DB/dbPro/interface/timelinePanel/p3.png differ
diff --git a/DB/dbPro/interface/timelinePanel/p4.png b/DB/dbPro/interface/timelinePanel/p4.png
new file mode 100644
index 0000000..98a990d
Binary files /dev/null and b/DB/dbPro/interface/timelinePanel/p4.png differ
diff --git a/DB/dbPro/interface/timelinePanel/p5.png b/DB/dbPro/interface/timelinePanel/p5.png
new file mode 100644
index 0000000..e55ac6b
Binary files /dev/null and b/DB/dbPro/interface/timelinePanel/p5.png differ
diff --git a/DB/dbPro/interface/timelinePanel/p6.png b/DB/dbPro/interface/timelinePanel/p6.png
new file mode 100644
index 0000000..bb6552a
Binary files /dev/null and b/DB/dbPro/interface/timelinePanel/p6.png differ
diff --git a/DB/dbPro/interface/transformPanel/README.md b/DB/dbPro/interface/transformPanel/README.md
new file mode 100644
index 0000000..937a1c3
--- /dev/null
+++ b/DB/dbPro/interface/transformPanel/README.md
@@ -0,0 +1,10 @@
+变换面板用来显示和修改骨骼或插槽的x,y坐标(相对于父的),缩放比例和旋转角度,还有图片的尺寸(仅限插槽或图片时显示)。
+
+左侧为骨骼的变换面板,右侧为插槽的变换面板。
+
+此面板在骨架装配和动画制作下均可显示。
+
+可以通过↑↓方向按钮微调数值框中的数值。
+
+*注:当骨骼或插槽复选时,变换面板内数值为空。
+
diff --git a/DB/dbPro/introduction/introduction/561766be2385d.png b/DB/dbPro/introduction/introduction/561766be2385d.png
new file mode 100644
index 0000000..a6cd94c
Binary files /dev/null and b/DB/dbPro/introduction/introduction/561766be2385d.png differ
diff --git a/DB/dbPro/introduction/introduction/README.md b/DB/dbPro/introduction/introduction/README.md
new file mode 100644
index 0000000..ec117a5
--- /dev/null
+++ b/DB/dbPro/introduction/introduction/README.md
@@ -0,0 +1,6 @@
+![image](561766be2385d.png)
+
+DragonBones Pro 是一套由Egret团队制作的独立的骨骼动画编辑器。
+
+本用户手册将具体的介绍DragonBones Pro的每一项功能的使用方法与规则。
+
diff --git a/DB/dbPro/plugin/pluginManager/5603c12d92c3c.png b/DB/dbPro/plugin/pluginManager/5603c12d92c3c.png
new file mode 100644
index 0000000..904a89b
Binary files /dev/null and b/DB/dbPro/plugin/pluginManager/5603c12d92c3c.png differ
diff --git a/DB/dbPro/plugin/pluginManager/5603c18967fbb.png b/DB/dbPro/plugin/pluginManager/5603c18967fbb.png
new file mode 100644
index 0000000..aa315cd
Binary files /dev/null and b/DB/dbPro/plugin/pluginManager/5603c18967fbb.png differ
diff --git a/DB/dbPro/plugin/pluginManager/5603c1a853a5d.png b/DB/dbPro/plugin/pluginManager/5603c1a853a5d.png
new file mode 100644
index 0000000..66e575d
Binary files /dev/null and b/DB/dbPro/plugin/pluginManager/5603c1a853a5d.png differ
diff --git a/DB/dbPro/plugin/pluginManager/5603c1cd3c8f7.png b/DB/dbPro/plugin/pluginManager/5603c1cd3c8f7.png
new file mode 100644
index 0000000..34ba23c
Binary files /dev/null and b/DB/dbPro/plugin/pluginManager/5603c1cd3c8f7.png differ
diff --git a/DB/dbPro/plugin/pluginManager/56176f5e50be3.png b/DB/dbPro/plugin/pluginManager/56176f5e50be3.png
new file mode 100644
index 0000000..cdee10f
Binary files /dev/null and b/DB/dbPro/plugin/pluginManager/56176f5e50be3.png differ
diff --git a/DB/dbPro/plugin/pluginManager/README.md b/DB/dbPro/plugin/pluginManager/README.md
new file mode 100644
index 0000000..3adb3d7
--- /dev/null
+++ b/DB/dbPro/plugin/pluginManager/README.md
@@ -0,0 +1,20 @@
+DragonBones Pro 4.2 新增插件系统,通过插件系统使得DragonBones Pro具有更好可扩展性。插件可由第三方基于DragonBones Pro的插件规范来开发。
+
+在帮助菜单中选择“插件管理”打开插件管理窗口。
+![](5603c12d92c3c.png)
+插件管理窗口如下
+![](56176f5e50be3.png)
+右上角的按钮依次为:打开插件目录,安装插件,卸载选中插件。
+- 打开插件目录:点击按钮会打开DragonBones Pro安装插件的目录。直接拷贝插件文件夹(不是.expl文件)到插件目录,启动DragonBones Pro便可以自动安装插件。
+- 安装插件: 点击按钮后,系统窗口弹出,指定插件安装包(DragonBones Pro的插件包扩展名为.expl),便可完成插件的安装。
+- 卸载选中插件: 在插件列表中选中需要移除的插件,然后点击卸载按钮便可卸载相应插件。
+
+安装后的插件,可以在列表中的设置列设为“开启”或“禁用”。
+
+DragonBones Pro 4.2 默认安装了 Cocos 1.x 和 Spine 2.x 的导入插件。这两个插件安装并开启后,在导入界面便可以看到支持导入Cocos和spine项目的提示了
+![](5603c18967fbb.png)
+以Spine项目为例,选中Spine项目的json文件,便会自动使用Spine的导入插件。也可以点击“选择插件”按钮来手动指定使用的导入插件。
+![](5603c1a853a5d.png)
+插件选择窗口如下
+![](5603c1cd3c8f7.png)
+其中"DragonBones Pro"为默认内置导入插件,不会显示在插件管理窗口。(如果使用错误的导入出插件导入项目,会提示更换使用正确插件)
\ No newline at end of file
diff --git a/DB/dbPro/plugin/specification/README.md b/DB/dbPro/plugin/specification/README.md
new file mode 100644
index 0000000..8dc6f9e
--- /dev/null
+++ b/DB/dbPro/plugin/specification/README.md
@@ -0,0 +1,113 @@
+# 概述
+DragonBonesPro4.2 开放了插件规范,并实现了导入插件的管理,目的是让用户可以方便的将任意格式动画数据通过插件导入到DragbonesPro中来进行二次编辑,并生成DragonBones格式动画,从而在包括Egret在内的任意的支持DragonBones的引擎中运行动画。本文会介绍编写插件的基本规范,以及目前版本中如何编写一个DragonBones的导入插件。
+
+# 插件命名规范
+插件统一扩展名为expl,本质是个zip包,内部至少需要包含*.excfg,*.png,*.js,3个文件。其中:
+- *.excfg为json格式的插件配置文件。
+- *.png为插件的图标,标准尺寸为32x32。
+- *.js文件为插件的主脚本文件。不同类型的插件,js脚本的内容标准可能不同。例如DBPro的导入插件,需要继承egretPluginSdk.js中的DBImportTemplate类,重写所有的方法。(注:egretPluginSdk 是用于编写egret工具链中可扩展插件的框架,目前只包含DBPro的导入插件需要的基础类和方法。egretPluginSdk.js在DragonBonesPro安装目录下的plugins目录下)
+
+#### 插件编写规范
+*.excfg 文件格式具体如下,例如Spine插件
+~~~ typescript
+{
+ "name":"Spine 2.x Importer", //插件的名称
+ "path":["spine.js"],//插件的主脚本以及包含脚本
+ "description":"Spine 2.x Importer can import Spine 2.x animation data to DragonBonesPro",//插件的描述
+ "author":"Egret Engine",//插件的开发者
+ "version":"1.0.0",//插件的版本号
+ "icon":"icon.png"//插件的图标(32*32)
+}
+~~~
+
+*.js文件格式具体如下,例如Spine导入插件,继承的是egretPluginSdk.js中DBImportTemplate类。DBImportTemplate 类格式如下:
+~~~ typescript
+var DBImportTemplate = (function () {
+ function DBImportTemplate() {
+ this._type = "DBImportTemplate";
+ }
+ /**支持导入的数据文件的扩展名**/
+ DBImportTemplate.prototype.dataFileExtension = function () {
+ return ["*"];
+ };
+ /**支持导入的数据文件的描述**/
+ DBImportTemplate.prototype.dataFileDescription = function () {
+ return "";
+ };
+ /**纹理集数据文件扩展名**/
+ DBImportTemplate.prototype.textureAtlasDataFileExtension = function () {
+ return ["*"];
+ };
+ /**查验导入数据是否支持纹理集**/
+ DBImportTemplate.prototype.isSupportTextureAtlas = function () {
+ return false;
+ };
+ /**查验导入数据是否支持本解析器**/
+ DBImportTemplate.prototype.checkDataValid = function (data) {
+ return true;
+ };
+ /**导入数据的解析**/
+ DBImportTemplate.prototype.convertToDBData = function (data) {
+ return data;
+ };
+ /**纹理集的解析**/
+ DBImportTemplate.prototype.convertToDBTextureAtlasData = function (data) {
+ return data;
+ };
+ DBImportTemplate.prototype.type = function () {
+ return this._type;
+ };
+ return DBImportTemplate;
+})();
+~~~
+
+需要注意的是,*.js的入口类必须命名为main,例如Spine数据导入插件大致内容如下:
+~~~ typescript
+var __extends = (this && this.__extends) || function (d, b) {
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+ function __() { this.constructor = d; }
+ __.prototype = b.prototype;
+ d.prototype = new __();
+};
+var main = (function (_super) {
+ __extends(main, _super);
+ function main() {
+ _super.apply(this, arguments);
+ }
+ main.prototype.dataFileExtension = function () {
+ return ["Json"];
+ };
+ main.prototype.dataFileDescription = function () {
+ return "Spine data";
+ };
+ main.prototype.textureAtlasDataFileExtension = function () {
+ return ["atlas", "texture"];
+ };
+ main.prototype.isSupportTextureAtlas = function () {
+ return true;
+ };
+ main.prototype.convertToDBTextureAtlasData = function (data) {
+ var dbTexture = {};
+ return JSON.stringify(dbTexture);
+ };
+ main.prototype.checkDataValid = function (spineJson) {
+ return false;
+ };
+ main.prototype.convertToDBData = function (spineJson) {
+ var DBJson = {};
+ try {
+ ...
+ }
+ catch (e) {
+ }
+ return JSON.stringify(DBJson);
+ };
+ return main;
+})(DBImportTemplate);
+~~~
+注意:为了保证插件的安全性,开发者必须要在代码中加上try catch。
+
+最后,DragonBonesPro中自带的两个插件就在安装目录的plugins文件夹中,“Cocos 1.x Importer.expl” 和“Spine 2.x Importer.expl”可以做为完整的例子用于参考。
+
+# 插件的安装使用:
+目前DragonBonesPro插件的安装方式是在帮助菜单下打开插件管理面板,点击右上角安装插件,选择expl格式的文件,即可完成安装。接下来的版本会支持双击安装。
diff --git a/DB/update/update400/README.md b/DB/update/update400/README.md
new file mode 100644
index 0000000..109fa3a
--- /dev/null
+++ b/DB/update/update400/README.md
@@ -0,0 +1,27 @@
+版本:4.0.0
+发布日期:2015-06-16
+更新内容:
+
+【新特性】独立编辑器DragonBones Pro
+
+【新特性】通过DragonBones Pro直接编辑骨架,皮肤,动画
+
+【新特性】多项目管理
+
+【新特性】可视化的时间轴
+
+【新特性】资源库支持图片和纹理集
+
+【新特性】一键导出数据和纹理集或者图片
+
+【新特性】支持Spine数据格式
+
+【新特性】支持PhotoShop导出数据
+
+【新特性】支持dragonBones4.0的数据
+
+【新特性】支持dragonBones3.0的数据
+
+【新特性】分离骨骼时间轴和插槽时间轴,控制更灵活
+
+【优化】数据体积较小约50%
\ No newline at end of file
diff --git a/DB/update/update411/README.md b/DB/update/update411/README.md
new file mode 100644
index 0000000..e69c8f6
--- /dev/null
+++ b/DB/update/update411/README.md
@@ -0,0 +1,18 @@
+版本:4.1.1
+发布日期:2015-08-5
+
+更新内容:
+
+【新增】新增曲线编辑器,用于制作动画缓动效果。
+
+【新增】新增洋葱皮工具,方便动画前后帧对位。
+
+【新增】新增IK Pose工具,给角色摆姿势更方便。
+
+【新增】新增Egret H5 预览功能,真正的所见即所得。
+
+【新增】增强纹理导出功能。
+
+【新增】场景支持元件多选,时间轴支持帧多选。
+
+【修复】修复了DB Pro中骨架无法改名的bug
\ No newline at end of file
diff --git a/DB/update/update421/README.md b/DB/update/update421/README.md
new file mode 100644
index 0000000..94892b3
--- /dev/null
+++ b/DB/update/update421/README.md
@@ -0,0 +1,18 @@
+版本:4.2.1
+发布日期:2015-10-9
+
+更新内容:
+
+【新增】增加“基本动画项目”类型,适合制作不需要骨架关系的补间动画。
+
+【新增】支持导出Egret MovieClip 数据格式。
+
+【新增】开放导入插件标准,允许用户自己编写安装导入插件。
+
+【新增】新增Cocos导入插件,支持导入Cocos 1.x骨骼动画。
+
+【增强】增强Spine导入功能,支持导入Spine格式的纹理集。
+
+【增强】增强时间轴操作,支持拖拽移动、框选、框选后平移缩放,跨动画粘贴关键帧。
+
+【修复】修复若干AS和TS库的Bug。
\ No newline at end of file
diff --git a/DB/update/update432/README.md b/DB/update/update432/README.md
new file mode 100644
index 0000000..17a9eee
--- /dev/null
+++ b/DB/update/update432/README.md
@@ -0,0 +1,24 @@
+版本:4.3.2
+发布日期:2015-12-9
+
+更新内容:
+
+【新增】支持多骨架和骨架嵌套,可以在项目中新建骨架,可以将骨骼动画导入到当前项目。
+
+【新增】支持dbswf格式矢量纹理集。导出不同比例数据时,矢量图可以实现无损缩放。
+
+【新增】支持导入导出多纹理集。
+
+【新增】支持命令行导入,实现批处理。
+
+【新增】支持导出序列帧。
+
+【新增】增加首选项面板,设置用户偏好。
+
+【增强】增强骨骼创建功能,创建骨骼时可以自动绑定图片。
+
+【增强】增强场景树和时间轴,可控制单个显示显示对象的可见可选。
+
+【增强】增强变换面板,可通过快捷键微调。
+
+【修复】修复基本动画项目无法正确另存为的bug。
\ No newline at end of file
diff --git a/DB/update/update451/README.md b/DB/update/update451/README.md
new file mode 100644
index 0000000..12d454c
--- /dev/null
+++ b/DB/update/update451/README.md
@@ -0,0 +1,29 @@
+版本:4.5.1
+
+发布日期:2016-03-15
+
+更新内容:
+
+【新增】支持网格(Mesh)和自由变形动画(柔体动画)。
+
+【新增】支持反向动力学约束(IK Constraint)
+
+【新增】增加主舞台。
+
+【新增】增加右键菜单。
+
+【新增】增加一键生成序列帧动画功能。
+
+【新增】增加骨骼的继承缩放和继承旋转功能。
+
+【增强】增强元件嵌套功能,增加子元件的播放动画设置。
+
+【增强】改进骨骼缩放的叠加效果,支持骨架整体的非等比缩放和反转。
+
+【增强】IK Pose功能改为通过拖拽骨骼顶端的控制器设置。
+
+【增强】选中图片时,父骨骼会处于半高亮状态,方便用户找到骨骼和图片的对应关系。
+
+【增强】可以通过鼠标滚轮调节输入框的数据。
+
+【修复】修复欢迎界面连续关闭两次后功能失效的问题。
\ No newline at end of file
diff --git a/DB/update/update461/README.md b/DB/update/update461/README.md
new file mode 100644
index 0000000..d446b59
--- /dev/null
+++ b/DB/update/update461/README.md
@@ -0,0 +1,37 @@
+版本:4.6.1
+
+发布日期:2016-05-13
+
+更新内容:
+
+【新增】支持骨骼绑定权重,制作蒙皮动画。
+
+【新增】场景树增加搜索功能。
+
+【新增】场景树增加智能过滤功能。
+
+【新增】支持按Ctrl+#将选中项目编组。
+
+【新增】在工具栏最右侧增加按钮可以打开意见收集面板。
+
+【新增】在帮助菜单中加入问卷调查系统。
+
+【新增】在窗口菜单中加入重置面板布局的功能。
+
+【新增】AS库支持Starling2.0。
+
+【增强】鼠标右键可以拖动舞台平移。
+
+【增强】多选对象可以批量编辑属性。
+
+【增强】鼠标悬浮在骨骼和图片上时显示提示。
+
+【增强】在选择父亲和IK时弹出提示。
+
+【增强】提升序列帧动画的性能300%。
+
+【增强】改为在编辑Mesh边界的过程中不允许保存,以防止产生非法数据。
+
+【修复】修复IK约束在有些情况下计算结果不正确的问题。
+
+【修复】修复面板布局无法保存的问题。
\ No newline at end of file
diff --git a/DB/update/update470/README.md b/DB/update/update470/README.md
new file mode 100644
index 0000000..a7a5f7e
--- /dev/null
+++ b/DB/update/update470/README.md
@@ -0,0 +1,27 @@
+版本:4.7.0
+
+发布日期:2016-07-05
+
+更新内容:
+
+【动态漫画】新增动态漫画项目类型,用于制作包含动画的条漫。
+
+【动态漫画】支持导入漫画的PS原画,编辑舞台最大限度还原漫画原始布局。
+
+【动态漫画】动画编辑简单易学,无需时间轴,即可快速制作动态漫画。
+
+【动态漫画】一键发布基于H5的条漫作品,无需编码支持手指滑动滚屏。
+
+【龙骨动画】安装时自动安装FlashPro导出插件。
+
+【龙骨动画】扩展Spine导入插件,支持Spine 1.x, 2.x, 3.x 数据格式
+
+【龙骨动画】改进了创建骨骼项目的流程,加入了模版的选择。
+
+【龙骨动画】右键菜单加入显示全部的功能
+
+【运行库】运行库加入对cocos2dx 3.7及以上版本的支持,支持DB4.5格式的全部功能,包括网格蒙皮IK。
+
+【运行库】运行库重构,合并普通模式与极速模式,增加若干API。
+
+【运行库】运行库增强换装功能,增强了局部换装功能,解决轴点错位问题,支持一键整体换装,支持纹理延迟加载。
\ No newline at end of file
diff --git a/DB/update/update471/README.md b/DB/update/update471/README.md
new file mode 100644
index 0000000..a9771fe
--- /dev/null
+++ b/DB/update/update471/README.md
@@ -0,0 +1,27 @@
+DragonBones 4.7.1
+
+更新日志
+
+【动态漫画】新增动态漫画项目类型,用于制作包含动画的条漫。
+
+【动态漫画】支持导入漫画的PS原画,编辑舞台最大限度还原漫画原始布局。
+
+【动态漫画】动画编辑简单易学,无需时间轴,即可快速制作动态漫画。
+
+【动态漫画】一键发布基于H5的条漫作品,无需编码支持手指滑动滚屏。
+
+【龙骨动画】在帮助菜单中增加安装FlashPro导出插件的功能。
+
+【龙骨动画】扩展Spine导入插件,支持Spine 1.x, 2.x, 3.x 数据格式。
+
+【龙骨动画】改进了创建骨骼项目的流程,加入了模版的选择。
+
+【龙骨动画】点击项目标签的路径提示能够打开项目所在目录。
+
+【龙骨动画】右键菜单加入显示全部的功能。
+
+【运行库】运行库加入对cocos2dx 3.x的支持,支持DB4.5格式的全部功能,包括网格蒙皮IK。
+
+【运行库】运行库重构,合并普通模式与极速模式,增加若干API。
+
+【运行库】运行库增强换装功能,增强了局部换装功能,解决轴点错位问题,支持一键整体换装,支持纹理延迟加载。
\ No newline at end of file
diff --git a/DB/update/update472/README.md b/DB/update/update472/README.md
new file mode 100644
index 0000000..3dd7148
--- /dev/null
+++ b/DB/update/update472/README.md
@@ -0,0 +1,27 @@
+版本:4.7.2
+发布日期:2016-08-17
+更新内容:
+
+【动态漫画】新增抖动,摆动,心跳 三种动作。
+
+【动态漫画】新增消失类型的动作,移出和渐隐。
+
+【动态漫画】旋转动作增加循环属性。
+
+【动态漫画】图片层级调整功能,快捷键“-”,“+”,“Ctrl +‘+’”, “Ctrl +‘-’”。
+
+【龙骨动画】时间轴支持shift键多选。
+
+【龙骨动画】导入到当前项目的骨架,可以撤销。
+
+【体验优化】预览增加二维码,扫码后,在移动端预览。
+
+【体验优化】预览支持缩放和移动位置。(pc端Ctrl+鼠标拖拽为缩放,鼠标拖拽为移动,移动端支持单指移动,手势缩放)。
+
+【Bug修复】修复当前正在编辑的骨架不能被删除的bug。
+
+【Bug修复】修复隐藏图片,洋葱皮没有隐藏的bug。
+
+【Bug修复】修复个别情况下导出序列帧图片画面不完整的bug。
+
+【Bug修复】修复PS导出插件因PS单位不为像素而导致的导出图片不完整的bug。
\ No newline at end of file
diff --git a/DB/update/update473/README.md b/DB/update/update473/README.md
new file mode 100644
index 0000000..63565fb
--- /dev/null
+++ b/DB/update/update473/README.md
@@ -0,0 +1,13 @@
+版本:4.7.3
+
+发布日期:2016-08-31
+
+更新内容:
+
+【动态漫画】新增闪烁,翻转,掉落出现,三种动作。
+
【动态漫画】新增变换面板,可以精确调节图片的位置,缩放,角度和透明度的值。
+
【动态漫画】循环动作优化,循环动作可以一直循环下去。
+
【体验优化】舞台场景和动态漫画场景缩放时,缩放中心在鼠标指针的位置。
+
【体验优化】预览自适应,预览时根据场景的大小自动缩放使动画显示完整。
+
【Bug修复】修复删除骨骼再撤销,插槽的层级可能错乱的bug。
+
【Bug修复】修复使用pose工具后撤销,pose点位置可能错乱的bug。
\ No newline at end of file
diff --git a/DB/update/update474/README.md b/DB/update/update474/README.md
new file mode 100644
index 0000000..944fe91
--- /dev/null
+++ b/DB/update/update474/README.md
@@ -0,0 +1,12 @@
+版本:4.7.4
+
+发布日期:2016-09-21
+
+更新内容:
+
+【新增】素材替换功能,可在场景,场景树右键或者属性面板中点击按钮弹出素材替换窗口。
+
【增强】ps导出插件增强,支持一键导入到DragonBonesPro中。
+
【增强】Spine导入插件增强,支持Spine到最新版本3.3.07。
+
【增强】支持键盘方向键微调mesh点坐标。
+
【增强】鼠标拖拽快速开关时间轴上的隐藏锁定。
+
【Bug修复】修复Mac上在通过DBPro中安装flash插件,可能导致崩溃的问题。
\ No newline at end of file
diff --git a/DB/update/update481/README.md b/DB/update/update481/README.md
new file mode 100644
index 0000000..193073a
--- /dev/null
+++ b/DB/update/update481/README.md
@@ -0,0 +1,12 @@
+版本:4.8.1
+
+发布日期:2016-10-12
+
+更新内容:
+
+【新增】支持导出白鹭极速格式的数据。能提升2到3倍运行效率,节省70%内存,配置文件体积减少50%
+
【新增】支持混合模式(正常,叠加,擦除)
+
【新增】资源库支持删除、重命名
+
【增强】调整层级时可实时显示结果
+
【增强】支持把插槽拖拽到另一个插槽里,合并两个插槽中的内容
+
【增强】拖拽对象到场景树上时,鼠标停留在折叠的项目上,折叠的项目会自动展开
\ No newline at end of file
diff --git a/DB/update/update561/README.md b/DB/update/update561/README.md
new file mode 100644
index 0000000..0e9c083
--- /dev/null
+++ b/DB/update/update561/README.md
@@ -0,0 +1,15 @@
+版本:5.6.1
+
+发布日期:2018-8-22
+
+更新内容:
+
+【新增】曲线预设功能。
+
+【新增】放大或缩小舞台快捷键。
+
+【修复】从骨架项目动画模式切换到影片剪辑模式崩溃问题。
+
+【修复】新创建项目未保存切换资源库路径报错。
+
+【修复】补间动画无法复制粘贴关键帧的bug。
diff --git a/Developer/updateDetail/developers/README.md b/Developer/updateDetail/developers/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/Engine2D/bitmapTexture/bitmapTexture/56614ea87fa1a.jpg b/Engine2D/bitmapTexture/bitmapTexture/56614ea87fa1a.jpg
new file mode 100644
index 0000000..2c37312
Binary files /dev/null and b/Engine2D/bitmapTexture/bitmapTexture/56614ea87fa1a.jpg differ
diff --git a/Engine2D/bitmapTexture/bitmapTexture/README.md b/Engine2D/bitmapTexture/bitmapTexture/README.md
new file mode 100644
index 0000000..71c7353
--- /dev/null
+++ b/Engine2D/bitmapTexture/bitmapTexture/README.md
@@ -0,0 +1,103 @@
+
+位图的使用需要纹理的支持,在Egret中,默认隐藏了纹理的操作,所有操作均针对于显示对象进行。但位图的显示依然基于纹理。在显示一张图片时, 需要使用 `Bitmap` 类,这是egret中的图片类,而纹理则来自于所加载的资源图片。通常情况下,用单张图片作为纹理,游戏中也会大量使用纹理集来进行渲染。
+
+## 1.创建
+使用 `Bitmap` 类创建图片对象,代码如下:
+
+```javascript
+private img:egret.Bitmap = new egret.Bitmap();
+```
+
+此时得到一个位图对象,将它添加到显示列表中,还不会看到任何内容。因为该位图对象仅仅是一个“空对象”,还没有为它指定任何的纹理。
+
+给该位图对象指定一个纹理,在画面中显示出渲染的文件。
+
+指定纹理的方式是设置 `Bitmap` 中的 `texture` 属性。
+
+```
+img.texture = RES.getRes("图片ID");
+```
+
+## 2.资源配置
+上面一行代码为位图添加纹理,它有一个输入参数:"图片ID"。
+
+所有加载的资源都会有一个唯一ID,这个ID绝大部分取自图片文件名称,也有一些资源会定义一些其他的ID。这些图片的组织方式都是由一个json文件描述的。
+
+下面是一个标准的资源配置文件:
+
+```json
+{
+ "resources":
+ [
+ {"name":"bgImage","type":"image","url":"assets/bg.jpg"},
+ {"name":"egretIcon","type":"image","url":"assets/egret_icon.png"},
+ {"name":"description","type":"json","url":"config/description.json"}
+ ],
+ "groups":
+ [
+ {"name":"preload","keys":"bgImage,egretIcon"}
+ ]
+}
+```
+
+在一个json资源配置文件中,应该包含两大部分,一个是组,另一个是资源。
+
+### 2.1.资源
+
+资源包含在“resources”中,游戏中所有使用到的资源都应包含在此。每一个资源拥有三个属性。
+
+1. name:对应资源的唯一ID编号
+
+2. type:资源类型
+
+3. url:当前资源的路径
+
+### 2.2.组
+
+组包含在“groups”中,组的概念是将不同的资源分类,当逻辑启动加载后,可以选择以组为单位进行加载。
+
+## 3.示例
+
+示例代码如下:
+
+```javascript
+class BitmapTest extends egret.DisplayObjectContainer{
+
+ public constructor() {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+
+ private async onAddToStage(event:egret.Event) {
+ RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onGroupComplete, this);
+ await RES.loadConfig("resource/default.res.json", "resource/");
+ await RES.loadGroup("preload");
+ }
+
+ private onGroupComplete() {
+ var img:egret.Bitmap = new egret.Bitmap();
+ img.texture = RES.getRes("bgImage");
+ this.addChild(img);
+ }
+}
+```
+
+编译运行后,效果如下图:
+
+![](56614ea87fa1a.jpg)
+
+
+## 3.其他方式创建位图
+### 3.1 您还可以通过其他方式创建位图,例如 base64
+```javascript
+ let str64 = "iVBORw0KGgoAAAANSUhEUgAAAHM..."
+ egret.BitmapData.create("base64",str64,(bitmapData)=>{
+ let texture = new egret.Texture();
+ texture.bitmapData = bitmapData;
+ let bmp = new egret.Bitmap(texture);
+ this.addChild(bmp)
+})
+```
+[示例demo](http://tool.egret-labs.org/DocZip/engine/core/display/base64Demo.zip)
+
+
diff --git a/Engine2D/bitmapTexture/fillMode/56614f986ab98.png b/Engine2D/bitmapTexture/fillMode/56614f986ab98.png
new file mode 100644
index 0000000..a237944
Binary files /dev/null and b/Engine2D/bitmapTexture/fillMode/56614f986ab98.png differ
diff --git a/Engine2D/bitmapTexture/fillMode/56614f988d39e.png b/Engine2D/bitmapTexture/fillMode/56614f988d39e.png
new file mode 100644
index 0000000..0fc2885
Binary files /dev/null and b/Engine2D/bitmapTexture/fillMode/56614f988d39e.png differ
diff --git a/Engine2D/bitmapTexture/fillMode/README.md b/Engine2D/bitmapTexture/fillMode/README.md
new file mode 100644
index 0000000..aa35a05
--- /dev/null
+++ b/Engine2D/bitmapTexture/fillMode/README.md
@@ -0,0 +1,79 @@
+
+位图的填充方式有两种,
+
+* 拉伸图像以填充区域
+
+* 重复图像以填充区域
+
+### 1.拉伸图像填充
+创建 `Bitmap` 对象时会默认选择第一种填充方式。
+
+下面是的示例中,使用默认填充方式。使用的纹理图片为一张100*100的图片。图像宽度设置为2倍,高度设置为3倍。
+
+```javascript
+class BitmapTest extends egret.DisplayObjectContainer{
+ public constructor()
+ {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+ private onAddToStage(event:egret.Event) {
+ RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onGroupComp, this);
+ RES.loadConfig("resource/resource.json", "resource/");
+ RES.loadGroup("preload");
+ }
+ private onGroupComp()
+ {
+ var img:egret.Bitmap = new egret.Bitmap();
+ img.texture = RES.getRes("box");
+ img.width *= 2;
+ img.height *= 3;
+ this.addChild(img);
+ }
+}
+```
+
+
+编译后运行,效果如图:
+
+![](56614f986ab98.png)
+
+
+### 2.重复图像填充
+
+设置填充方法需要改变 `Bitmap` 中的 `fillMode` 属性。
+
+```javascript
+img.fillMode = egret.BitmapFillMode.REPEAT
+```
+
+具体示例代码如下:
+
+```javascript
+class BitmapTest extends egret.DisplayObjectContainer{
+ public constructor()
+ {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+ private onAddToStage(event:egret.Event) {
+ RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onGroupComp, this);
+ RES.loadConfig("resource/resource.json", "resource/");
+ RES.loadGroup("preload");
+ }
+ private onGroupComp()
+ {
+ var img:egret.Bitmap = new egret.Bitmap();
+ img.texture = RES.getRes("box");
+ img.fillMode = egret.BitmapFillMode.REPEAT;
+ img.width *= 2;
+ img.height *= 3;
+ this.addChild(img);
+ }
+}
+```
+
+编译后运行,效果如图:
+
+![](56614f988d39e.png)
+
diff --git a/Engine2D/bitmapTexture/ktx/README.md b/Engine2D/bitmapTexture/ktx/README.md
new file mode 100644
index 0000000..4aa5c57
--- /dev/null
+++ b/Engine2D/bitmapTexture/ktx/README.md
@@ -0,0 +1,81 @@
+## KTX 纹理压缩使用说明
+
+### 一.关于 KTX
+KTX (Khronos Texture) 是一种纹理存储格式,大部分移动设备的 GPU 均支持这种格式。可以有效降低设备的显存占用,提高运行效率和稳定性。
+
+* 关于 KTX 的具体信息,可以参考下述2个文档:
+ * [KTX 描述说明](https://www.khronos.org/opengles/sdk/tools/KTX/)
+ * [KTX 文件格式说明](https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/)
+
+![](p1.png)
+
+如上图所示,第一步我们先把普通的 png\jpg 图片,转换成 `ios` 系统支持的 PVRTC 和安卓系统支持的 `ETC1` 格式的纹理。第二步再把纹理打包为 KTX 格式。
+
+**注:ktx 有很多种格式,如 astc, dxt, pvrtc, etc1,etc2。白鹭引擎在 iOS 平台只支持 pvrtc, 安卓平台只支持 etc1**
+
+我们制作了一个 ktx 转换工具:[下载地址和说明文档](../ktxtool/README.md)
+
+也可以使用其他的转换工具:
+
+- [PowerVRSDK](https://www.imgtec.com/developers/powervr-sdk-tools/)
+- [Mali_Texture_Compression_Tool](https://developer.arm.com/tools-and-software/graphics-and-gaming/graphics-development-tools/mali-texture-compression-tool)
+- [texture-compressor](https://www.npmjs.com/package/texture-compressor)
+
+
+### 二.如何使用 KTX
+**[KTX 使用示例下载](http://tool.egret-labs.org/DocZip/engine/KTXHello_v2.zip)**
+
+上面是一个 `HelloWorld` 的示例项目,其中只把 `egret_icon.png` 这个图片转换为 `KTX` 格式使用。
+
+#### 1.资源说明
+在 `resource/assets` 目录下,`egret_icon` 有如下几种格式,引擎会根据不同平台来读取不同的格式:
+
+```
+egret_icon.png
+egret_icon.pvr.ktx
+egret_icon_alpha.ktx
+egret_icon.ktx
+```
+* `egret_icon.png`:PC 平台使用。
+* `egret_icon.pvr.ktx`:pvr 格式的 ktx,iOS 平台使用
+* `egret_icon.ktx`(etc1 格式的颜色纹理) 和 `egret_icon_alpha.ktx`(alpha遮罩纹理):安卓平台使用。**注:也可以把 2 个 ktx 文件合成一个文件,具体方法请参考 [高级示例 v1.3](http://tool.egret-labs.org/DocZip/engine/CompressedTextureDemo_1.3.zip),该示例我们后续还会更新完善**
+
+#### 2.代码说明
+
+![](p2.png)
+
+在 `Main.ts` 中的 `loadResource` 方法里,我们加了几行代码。
+
+* `ignoreResource` 方法表示只有 `egret_icon.png` 这个图片才会进入 `ktx` 的使用流程,其他资源全部忽略
+* `CompressTextureProcessor` 是加载资源的处理器,我们把它注册到了 `AssetsManager` 资源管理器中。具体的处理逻辑,请看示例中的代码。
+
+#### 3.显示效果
+![](p3.png)
+
+为了更容易看出效果,我们把 `egret_icon.png` 换成了另外一张白鹭小鸟,而 `ktx` 格式还是标准 `HelloWorld ` 里的白鹭图标。
+
+从上图中很容易看出,左侧是 `PC` 浏览器中的显示效果,因为不支持 `ktx` 格式,显示的是 `png` 图片。而右侧的 `iOS` 手机浏览器,因为支持 `ktx` 格式,显示的是 `pvr` 纹理格式的图片。
+
+#### 4.远程加载 KTX 资源
+您可以使用 `AssetsManager` 自动远程加载资源。也可以使用 `URLLoader` 自己控制资源加载。
+
+* 注意:
+ * 因为 ktx 不是普通的图片格式,不能使用 ImageLoader 加载。
+ * URLLoader.dataFormat 要设置成 BINARY 二进制格式
+
+使用 `URLLoader` 加载和显示 ktx 纹理 ,[可以参考此示例](http://tool.egret-labs.org/DocZip/engine/KTXURLLoader_v1.0.zip)
+
+
+#### 5.KTX 性能测试
+[纹理提交速度对比测试 v1.3](http://tool.egret-labs.org/DocZip/engine/ktx/CompressedTexturePerformance_v1.3.zip) 点击屏幕,可以对比测试提交 png 与 ktx 纹理的耗时和GPU占用等项目,详细说明请看 demo 里的 readme 说明文档。
+
+机型|平台|3000张ktx内存占用|3000张png内存占用
+-----------|--------|----|----|----|----
+华为P8|WebView|380M|1G
+
+#### 6.各小游戏平台对 `KTX` 纹理支持的状况:
+
+系统/平台 | 微信小游戏 | 百度小游戏 | 小米快游戏 | OPPO 小游戏| vivo 小游戏
+------------- | ------------- | -------------| -------------| -------------| -------------
+Android ETC1 | ✅ | ✅| ✅| ✅| ✅
+iOS PVRTC | ✅ | ❌ | ❌ | ❌ | ❌
diff --git a/Engine2D/bitmapTexture/ktx/p1.png b/Engine2D/bitmapTexture/ktx/p1.png
new file mode 100644
index 0000000..e7afbd3
Binary files /dev/null and b/Engine2D/bitmapTexture/ktx/p1.png differ
diff --git a/Engine2D/bitmapTexture/ktx/p2.png b/Engine2D/bitmapTexture/ktx/p2.png
new file mode 100644
index 0000000..ab970b0
Binary files /dev/null and b/Engine2D/bitmapTexture/ktx/p2.png differ
diff --git a/Engine2D/bitmapTexture/ktx/p3.png b/Engine2D/bitmapTexture/ktx/p3.png
new file mode 100644
index 0000000..6574580
Binary files /dev/null and b/Engine2D/bitmapTexture/ktx/p3.png differ
diff --git a/Engine2D/bitmapTexture/ktxfaq/README.md b/Engine2D/bitmapTexture/ktxfaq/README.md
new file mode 100644
index 0000000..6157202
--- /dev/null
+++ b/Engine2D/bitmapTexture/ktxfaq/README.md
@@ -0,0 +1,37 @@
+## KTX 纹理压缩常见问题
+
+#### 我使用的图片转换成 KTX 后在 iOS 手机上显示变形了
+答:因为 iOS 使用的 ktx 是 PVRTC 格式的。PVRTC 必须是正方形(边长为2的N次方,如128、256、512),`否则会强制转换成正方形,显示出来就变形了`。建议把资源打包成正方型的 SpriteSheet 纹理集后,再转换成 ktx 格式使用。
+
+正方形纹理使用示例,[可以参考此Demo](http://tool.egret-labs.org/DocZip/engine/KTXSquare.zip)
+![](p1.png)
+
+#### 为什么图片转换成 KTX 后体积变大了?会占用更多的内存影响游戏性能吗?
+##### 答:
+* PVRTC 格式的 ktx,因为会转换成正方形,所以体积会变大。例如原图尺寸为 228x380 的图片,转换成 PVRTC 的 ktx 后,尺寸为 512x512
+* ETC1 格式的 ktx,因为会转换成纹理 ktx 和 alpha 通道 ktx,所以体积会变大。
+* 文件体积变大并不会占用更多的内存。ktx 是一种 GPU 能直接读取并显示的格式,使得图像无需解压即可进行渲染,节约大量的内存。
+
+
+
+#### 原始资源加上转换后的 ktx 资源,包体变的很大怎么处理?
+##### 答:
+* 我们建议初始包体里只放普通的 png、jpg 图片,然后根据设备信息远程加载适合 该平台使用的 ktx 资源。
+* 不过 ktx 文件体积大,远程加载资源的时候会慢一些,这个就需要开发者权衡资源加载时间和游戏性能之间的利弊了。
+* 服务器可以开启 gzip ,ktx 压缩后的体积会很小。[或者直接把 ktx 打包成 zip 使用](http://tool.egret-labs.org/DocZip/engine/ktx/ktx_zip.zip)
+
+
+#### etc1 的 ktx 和 png ,哪种格式的帧频更快?
+答:png 在 shader 中调用一次 texture2D ,而 etc1 格式的 ktx 会多调用一次用于获取 alpha 遮罩,所以在 benchMark 极限测试下会有性能损失。[etc1 ktx 和 png 的帧频对比 benchmark](http://tool.egret-labs.org/DocZip/engine/ktx/KTX_VS_PNG.zip)
+
+
+#### KTX 文件在 web 服务器上用什么 MIME 映射
+答:KTX 是一种二进制格式,MIME 设置成 `application/octet-stream
+`
+
+#### Egret 发布的原生游戏,是否支持 KTX
+答:iOS 和 Android 的 Egret Naive 原生项目,都已经支持 KTX
+
+#### 游戏的资源很多,显存不够用了,KTX 是否是唯一的解决方式:
+答:请确保您已经在游戏中完善的进行了资源管理,例如使用 `RES.destroyRes()` 方法销毁不用的资源。如果显存还是过大,可以尝试使用 ktx。
+
diff --git a/Engine2D/bitmapTexture/ktxfaq/p1.png b/Engine2D/bitmapTexture/ktxfaq/p1.png
new file mode 100644
index 0000000..2f7552f
Binary files /dev/null and b/Engine2D/bitmapTexture/ktxfaq/p1.png differ
diff --git a/Engine2D/bitmapTexture/ktxtool/README.md b/Engine2D/bitmapTexture/ktxtool/README.md
new file mode 100644
index 0000000..8d67481
--- /dev/null
+++ b/Engine2D/bitmapTexture/ktxtool/README.md
@@ -0,0 +1,88 @@
+KTX 转换工具使用说明
+
+#### [点此下载](http://tool.egret-labs.org/DocZip/tools/egret-texture-generator-0.1.0.tgz)
+该工具还处于测试阶段,完成后我们会上传到 npm,作为标准库使用。现在暂时还需要开发者自己下载安装。
+
+#### 安装
+```
+npm install 路径/egret-texture-generator-0.1.0.tgz
+```
+#### 命令行使用方法
+在`egret-texture-generator-0.1.0.tgz`安装目录执行命令
+```
+npx egret-texture-generator --t 资源路径
+```
+
+后面还可以加更多的可选参数:
+```
+--t [path] --q [low|high] --pf [normal|canvas|canvasalpha] --pbpp [2|4] [--ie]
+```
+
+**注:用默认参数转换出来的 PVRTC 格式的 KTX,质量很差。建议使用下面这几个参数:`--pf canvasalpha --pbpp 4`**
+
+选项
+
+* --t
+必需,资源项目绝对路径,工具会把该目录下的图片转换成 ktx 格式
+* --q
+可选,ktx转换质量。
+ * `low`:低质量,默认值。
+ * `high`:最高质量。
+**注意**:设置为 `high` 时,转换速度会很慢
+
+* --pf
+可选,PVRTC格式填充类型,当资源格式不匹配时,转换成PVRTC后图片尺寸会增加,该参数用于处理如何填充增加的部分。
+ * `normal`:默认值,缩放图片,会导致图片变形。
+ * `canvas`:原始图片尺寸不变,其他区域根据图片类型填充不同的颜色。**png**图片透明填充,非**png**图片黑色填充。
+ * `canvasalpha`:原始图片尺寸不变,其他区域透明填充。
+
+ **注意**:PVRTC格式有如下限制
+ * 高度和宽度必须是2的幂
+ * 必须为正方形,即高度和宽度相等
+
+
+* --pbpp
+可选,PVRTC格式每像素色彩位数。
+ * `2`:2 bits,默认值。
+ * `4`:4 bits。
+
+ 设置4 bits时转换后的图片质量会优于2 bits但同时文件大小会增加。
+
+* --ie
+可选,是否跳过已转换过的资源。
+ * `false`:始终进行转换,默认值。
+ * `true`:如果资源对应的.ktx文件已存在则跳过。
+
+#### 注意事项
+当转换格式选择PVRTC时,转换完成后可能会出现如下的警告信息
+
+```
+ .............
+[malitc-7]Perceptually weighted RMSE: 0.0363376
+[malitc-8]Perceptual PSNR: 81.6949
+ ..............
+
+
+由于PVRTC限制,以下资源在转换成PVRTC格式后会发生变形
+1. 高度和宽度必须是2的幂
+2. 必须为正方形,即高度和宽度相等
+参考:https://en.wikipedia.org/wiki/PVRTC
+
+
+D:\tools\CompressedTextureTool\resource\assets\activity_bg.png
+D:\tools\CompressedTextureTool\resource\assets\bg.jpg
+D:\tools\CompressedTextureTool\resource\assets\bg_jpeg.jpeg
+D:\tools\CompressedTextureTool\resource\assets\bird.png
+D:\tools\CompressedTextureTool\resource\assets\egret_icon.png
+D:\tools\CompressedTextureTool\resource\assets\good.png
+D:\tools\CompressedTextureTool\resource\assets\hero.png
+D:\tools\CompressedTextureTool\resource\assets\mc1\chunli1.png
+D:\tools\CompressedTextureTool\resource\assets\weapon.png
+
+```
+
+如果出现以上警告信息,说明资源格式与PVRTC要求的格式不匹配。请确保列出的资源格式满足以下要求:
+1. 高度和宽度必须是2的幂
+2. 必须为正方形,即高度和宽度相等
+
+或者不将列出的资源压缩为PVRTC格式。
\ No newline at end of file
diff --git a/Engine2D/bitmapTexture/scale9Grid/556564e1ddd8d.png b/Engine2D/bitmapTexture/scale9Grid/556564e1ddd8d.png
new file mode 100644
index 0000000..6ac2dfb
Binary files /dev/null and b/Engine2D/bitmapTexture/scale9Grid/556564e1ddd8d.png differ
diff --git a/Engine2D/bitmapTexture/scale9Grid/556564e1e524c.png b/Engine2D/bitmapTexture/scale9Grid/556564e1e524c.png
new file mode 100644
index 0000000..51088a4
Binary files /dev/null and b/Engine2D/bitmapTexture/scale9Grid/556564e1e524c.png differ
diff --git a/Engine2D/bitmapTexture/scale9Grid/556564e1e5d41.png b/Engine2D/bitmapTexture/scale9Grid/556564e1e5d41.png
new file mode 100644
index 0000000..e7e36d0
Binary files /dev/null and b/Engine2D/bitmapTexture/scale9Grid/556564e1e5d41.png differ
diff --git a/Engine2D/bitmapTexture/scale9Grid/556564e1e68d5.png b/Engine2D/bitmapTexture/scale9Grid/556564e1e68d5.png
new file mode 100644
index 0000000..8bd604f
Binary files /dev/null and b/Engine2D/bitmapTexture/scale9Grid/556564e1e68d5.png differ
diff --git a/Engine2D/bitmapTexture/scale9Grid/README.md b/Engine2D/bitmapTexture/scale9Grid/README.md
new file mode 100644
index 0000000..11df490
--- /dev/null
+++ b/Engine2D/bitmapTexture/scale9Grid/README.md
@@ -0,0 +1,82 @@
+
+## 使用
+通常情况下为了游戏画面中的美观程度,会使用一些圆角矩形或者边缘不规则的矩形。 在游戏中,经常会对这些图形进行拉伸,那么拉伸后的图形会发生变形。为了让边缘不会因为拉伸而变形,可以使用“九宫格”。
+
+下图是一个圆角矩形
+
+![](556564e1ddd8d.png)
+
+将这个圆角矩形横向拉伸,边缘的拉伸变化如下图:
+
+![](556564e1e524c.png)
+
+上面的效果不符合要求,会影响美观。希望无论图片如何拉伸,圆角始终不会变形,如下图。
+
+![](556564e1e5d41.png)
+
+九宫格系统可以实现上述效果。
+
+![](556564e1e68d5.png)
+
+上图中,用四条虚线将圆角矩形分割为9个区域,其中四个区域(图中区域编号1,3,7,9)包含了圆角矩形的四个圆角。拉伸图像时,1,3,7,9区域不拉伸,2,8区域仅横向拉伸,4,6区域仅纵向拉伸,5区域横向纵向都拉伸。
+
+设置九宫格的属性是 `Bitmap` 类中的 `scale9Grid` 属性。
+
+下面是一个完整的示例代码,这个示例中,放置两个 `Bitmap` 对象,两个 `Bitmap` 对象都将 width 设置为原来的2倍。其中一个添加九宫格数据,另外一个不添加九宫格数据。
+
+```javascript
+class BitmapTest extends egret.DisplayObjectContainer{
+ public constructor() {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+
+ private onAddToStage(event:egret.Event) {
+ RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onGroupComp, this);
+ RES.loadConfig("resource/resource.json", "resource/");
+ RES.loadGroup("preload");
+ }
+ private onGroupComp() {
+ var img:egret.Bitmap = new egret.Bitmap();
+ img.texture = RES.getRes("box");
+ img.width *= 2;
+ this.addChild(img);
+ var img2:egret.Bitmap = new egret.Bitmap();
+ img2.texture = RES.getRes("box");
+ var rect:egret.Rectangle = new egret.Rectangle(30,31,40,41);
+ img2.scale9Grid =rect;
+ img2.width *= 2;
+ img2.y = 150;
+ this.addChild(img2);
+ }
+}
+```
+
+上面的代码中,创建了一个类型为 `Rectangle` 的对象。该对象用来存放九宫格数据。初始化时填入了四个参数。
+
+* 30:区域1 的宽度值。
+
+* 31:区域1 的高度值
+
+* 40:区域2 的宽度值
+
+* 41:区域4 的高度值
+
+> 注意:设置九宫宽高的时候尽量使用整数,否则有些浏览器可能会出现“黑线”。
+
+## 错误处理
+
+在正常情况下,九宫格区域的宽度和高度要小于图片的宽度和高度,位置在图片内部。如果设置的九宫格位置或者宽度和高度异常的情况下会报如下错误:
+
+```javascript
+Warning #1018: 9宫格设置错误
+```
+
+具体来讲正确的九宫格设置为:
+```javascript
+x + w < 图片宽度;
+y + h < 图片高度;
+```
+其中`x`和`y`是设置九宫格的位置,w和h为设置九宫格的宽和高。其中 x,y,w,h 应大于等于 0。
+
+> 在 Egret 3.0.3 之前的版本中 x,y,w,h 是不能设置为 0 的。
diff --git a/Engine2D/bitmapTexture/screenshots/55cd9c0ddeeb5.png b/Engine2D/bitmapTexture/screenshots/55cd9c0ddeeb5.png
new file mode 100644
index 0000000..308a9e7
Binary files /dev/null and b/Engine2D/bitmapTexture/screenshots/55cd9c0ddeeb5.png differ
diff --git a/Engine2D/bitmapTexture/screenshots/55cd9c0e37c9a.png b/Engine2D/bitmapTexture/screenshots/55cd9c0e37c9a.png
new file mode 100644
index 0000000..0944611
Binary files /dev/null and b/Engine2D/bitmapTexture/screenshots/55cd9c0e37c9a.png differ
diff --git a/Engine2D/bitmapTexture/screenshots/README.md b/Engine2D/bitmapTexture/screenshots/README.md
new file mode 100644
index 0000000..4e2bf81
--- /dev/null
+++ b/Engine2D/bitmapTexture/screenshots/README.md
@@ -0,0 +1,90 @@
+## 1.动态纹理类`egret.RenderTexture`
+
+egret 中位图的显示基于纹理,通常静态纹理的获取方式有下面四种:
+
+* 从已经创建出来的Bitmap中直接取 texture 属性。
+
+* 通过 `RES.getRes("run_down_png");`(如果有使用Res模块)直接获取
+
+* 通过URLLoader加载后获取
+
+* 通过 ImageLoader 加载的,将获取的 data 赋值给 Texture 对象的 bitmapData.
+
+除此之外,egret 提供了动态纹理类`egret.RenderTexture`,用来将显示对象及其子对象绘制成为一个纹理,以实现截图功能。
+
+```javascript
+var renderTexture:egret.RenderTexture = new egret.RenderTexture();
+renderTexture.drawToTexture(displayObject);
+```
+
+
+## 2.方法
+
+### 2.1.toDataURL()
+`egret.RenderTexture`中的`toDataURL()`方法,将纹理转换成以 "data:image/png;base64," 开头的base64数据。
+
+用法为: `texture.toDataURL("image/png", new egret.Rectangle(20, 20, 100, 100));`
+
+* 第一个参数是所需要转成的格式,目前只支持 “image/png” 和 “image/jpeg”。
+
+* 第二个参数是截取的区域,默认为`texture`整个大小。
+
+> 注意:
+因为是对`texture`本身进行的截取转换,所以即便`Bitmap`有缩放等变形操作,也不会影响`texture`截取区域的大小。
+
+### 2.2.saveToFile()
+`egret.RenderTexture`中的`saveToFile()`方法,裁剪指定区域并保存成图片。
+
+用法为:`texture.saveToFile("image/png", "a/down.png", new egret.Rectangle(20, 20, 100, 100));`
+
+* 第一个参数是图片格式
+
+* 第二个参数是保存的文件名称(路径).
+
+* 第三个参数是截取的区域
+
+> 注意:
+浏览器只支持保存名称,所以像 "a/down.png" 这种写法,浏览器会自动将其改成"a-down.png"。图片会保存在浏览器下载的位置。
+
+> Native下是可以保存路径的。图片会保存在游戏的私有空间,路径中不能有 "../"。
+这里为了兼容所有的平台,建议大家不要使用路径。
+
+#### 示例
+保存截屏测试,代码如下:
+
+```javascript
+var texture:egret.Texture = RES.getRes("run_png");
+texture.saveToFile("image/png", "a/down.png", new egret.Rectangle(20, 20, 100, 100));
+```
+
+下面给出使用`saveToFile()`后生成的视图。
+
+原图
+
+![](55cd9c0ddeeb5.png)
+
+截取后图
+
+![](55cd9c0e37c9a.png)
+
+### 2.3.drawToTexture()
+
+`egret.RenderTexture`中的`saveToFile()`方法,将指定显示对象绘制为一个纹理
+
+需要注意的是,这个方法会把当前的纹理清除,如果想要保留之前的纹理,需要使用 2 个 `RenderTexture` 交替绘制。
+
+交替使用 `RenderTexture` 示例代码:
+
+```javascript
+if (this.bmp.texture == this.renderTexture) {
+ this.renderTexture2.drawToTexture(this, new egret.Rectangle(0, 0, 1024, 768));
+ this.bmp.texture = this.renderTexture2;
+} else {
+ this.renderTexture.drawToTexture(this, new egret.Rectangle(0, 0, 1024, 768));
+ this.bmp.texture = this.renderTexture;
+}
+```
+
+其中 `this.bmp` 是保存画板的位图对象,`this.renderTexture` 和 `this.renderTexture2` 是用来保存纹理的 `RenderTexture` 对象。
+
+更新画板的纹理时使用与当前不同的 `RenderTexture` 对象保证上一次的纹理不被清空。
diff --git a/Engine2D/bitmapTexture/useTexture/566150114f41c.png b/Engine2D/bitmapTexture/useTexture/566150114f41c.png
new file mode 100644
index 0000000..b21d427
Binary files /dev/null and b/Engine2D/bitmapTexture/useTexture/566150114f41c.png differ
diff --git a/Engine2D/bitmapTexture/useTexture/5661501178058.png b/Engine2D/bitmapTexture/useTexture/5661501178058.png
new file mode 100644
index 0000000..6d4e802
Binary files /dev/null and b/Engine2D/bitmapTexture/useTexture/5661501178058.png differ
diff --git a/Engine2D/bitmapTexture/useTexture/README.md b/Engine2D/bitmapTexture/useTexture/README.md
new file mode 100644
index 0000000..d49af5d
--- /dev/null
+++ b/Engine2D/bitmapTexture/useTexture/README.md
@@ -0,0 +1,170 @@
+纹理集是将一些零碎的小图放到一张大图当中。游戏中经常使用到纹理集。
+
+
+Egret内置了纹理集的支持,在编写代码之前,需要先制作一张纹理集,具体使用的工具可以选择业内比较流行的 Texture Merger。 具体使用方法请参考[Texture Merger](../../../tools/TextureMerger/manual/README.md)。
+
+## 使用步骤
+
+* 首先制作一张纹理集,拼合后的效果如下:
+
+ ![](566150114f41c.png)
+
+
+同时生成的对应的json文件如下:
+
+```json
+{
+ "file": "dogs.png",
+ "frames": {
+ "dog1": {
+ "x": 322,
+ "y": 2,
+ "w": 184,
+ "h": 222,
+ "offX":0,
+ "offY":0,
+ "sourceW":184,
+ "sourceH":222
+ },
+ "dog2": {
+ "x": 307,
+ "y": 226,
+ "w": 147,
+ "h": 154,
+ "offX":0,
+ "offY":0,
+ "sourceW":147,
+ "sourceH":154
+ },
+ "dog3": {
+ "x": 2,
+ "y": 2,
+ "w": 318,
+ "h": 217,
+ "offX":0,
+ "offY":0,
+ "sourceW":318,
+ "sourceH":217
+ },
+ "dog4": {
+ "x": 2,
+ "y": 393,
+ "w": 298,
+ "h": 201,
+ "offX":0,
+ "offY":0,
+ "sourceW":298,
+ "sourceH":201
+ },
+ "dog5": {
+ "x": 2,
+ "y": 221,
+ "w": 303,
+ "h": 170,
+ "offX":0,
+ "offY":0,
+ "sourceW":303,
+ "sourceH":170
+ },
+ "dog6": {
+ "x": 2,
+ "y": 596,
+ "w": 245,
+ "h": 125,
+ "offX":0,
+ "offY":0,
+ "sourceW":245,
+ "sourceH":125
+ }
+ }
+}
+```
+
+
+* 将资源文件拷贝到项目文件夹中的 `resource/assets/` 目录下,同时修改资源配置文件 `default.res.json` 。
+
+资源配置文件内容如下:
+
+```json
+{
+"resources":
+ [
+ {"name":"dogs","type":"sheet","url":"assets/dogs.json"}
+ ],
+"groups":
+ [
+ {"name":"preload","keys":"dogs"}
+ ]
+}
+```
+
+* 编写代码:
+
+```javascript
+class BitmapTest extends egret.DisplayObjectContainer{
+ public constructor()
+ {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+ private onAddToStage(event:egret.Event) {
+ RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onGroupComplete, this);
+ RES.loadConfig("resource/default.res.json", "resource/");
+ RES.loadGroup("preload");
+ }
+ private onGroupComplete()
+ {
+ var txtr:egret.Texture = RES.getRes( "dogs#dog1" );
+ var img:egret.Bitmap = new egret.Bitmap( txtr );
+ this.addChild(img);
+ }
+}
+```
+
+注意其中一行:
+
+```javascript
+var txtr:egret.Texture = RES.getRes( "dogs#dog1" );
+```
+
+其中dogs为纹理集,id为该纹理集中的一个资源id。
+
+编译后运行,效果如图:
+
+
+![](5661501178058.png)
+
+
+## 那么在 HTML5 游戏中使用纹理集的好处是什么呢?
+
+* 第一个 在游戏中使用纹理集能够帮助你的游戏提高加载速度,从而减少你的带宽成本,更快速的 HTTP 加载时间。
+
+下面我为大家展示第一个例子:我们下载一张来自服务器的 4096 x 4096 一张 3.2M 的纹理,需要的时间为 50 毫秒。再加上一个纹理集的配置文件仅仅增加了 10 毫秒,如果我们不使用纹理集,采用加载单张小图,即加载 59 张小图。整体的加载时间将会发生巨大的变化,即将从 50 毫秒提升至 877 毫秒,即增加了 14 倍。
+> 注意这里只为演示效果直观,所以采用了 4096 x 4096,在游戏开发中强烈建议不用超过 2048.
+
+使用纹理集
+
+![](x01.png);
+
+未使用纹理集
+
+![](x02.png);
+
+我们知道浏览器本身对 HTTP 请求的数量也是有限制的,而当到达了这一限制时,浏览器便会阻塞之后的请求。
+如果你拥有 4千个待请求的 HTTP,但是这时候却只能同时进行 6 个连接,所以后面的请求便只能被暂时搁置着。所以除了能够减少加载时间,同样也能够减少 HTTP 的请求数量。
+
+
+* 第二个 在 webgl 模式下,能够进行硬件加速。这也就意味着 GPU 将处理图像和转化。这时使用了纹理集可以降低 GPU 渲染批次(Draw)来提升渲染性能,每个纹理都必须在绘制出几何体图像前与 GPU 连接在一起,并且特定的 GPU 都必须拥有一个特定数量的纹理槽,所以在抽样单位间进行纹理转化将需要花费大量的时间。而纹理集则能够通过让 GPU 将一个单一纹理绑定在图像驱动器上而减少转化所需要的额外开销,也就是减少少 Draw 的次数,而提升游戏的性能。
+
+使用纹理集
+
+![](x03.png);
+
+未使用纹理集
+
+![](x04.png);
+
+在图中可以很明确的看出如果不使用纹理集时 Draw 的次数应该为 8,在使用了纹理集时 Draw 的数量仅为 1,这个简单的例子足以说明纹理集对 Draw 数量的影响程度。有很多开发者遇到 Draw 的数量太高,其实合理的使用纹理图集会很好的减少 Draw 数量。
+
+关于纹理集先介绍到这里,后期将会更深入的介绍如何根据实际项目来使用纹理集。
+
diff --git a/Engine2D/bitmapTexture/useTexture/x01.png b/Engine2D/bitmapTexture/useTexture/x01.png
new file mode 100644
index 0000000..bf36d7e
Binary files /dev/null and b/Engine2D/bitmapTexture/useTexture/x01.png differ
diff --git a/Engine2D/bitmapTexture/useTexture/x02.png b/Engine2D/bitmapTexture/useTexture/x02.png
new file mode 100644
index 0000000..0193c17
Binary files /dev/null and b/Engine2D/bitmapTexture/useTexture/x02.png differ
diff --git a/Engine2D/bitmapTexture/useTexture/x03.png b/Engine2D/bitmapTexture/useTexture/x03.png
new file mode 100644
index 0000000..65af959
Binary files /dev/null and b/Engine2D/bitmapTexture/useTexture/x03.png differ
diff --git a/Engine2D/bitmapTexture/useTexture/x04.png b/Engine2D/bitmapTexture/useTexture/x04.png
new file mode 100644
index 0000000..b85e901
Binary files /dev/null and b/Engine2D/bitmapTexture/useTexture/x04.png differ
diff --git a/Engine2D/bricksgame/question/.DS_Store b/Engine2D/bricksgame/question/.DS_Store
new file mode 100644
index 0000000..a015c45
Binary files /dev/null and b/Engine2D/bricksgame/question/.DS_Store differ
diff --git a/Engine2D/bricksgame/question/README.md b/Engine2D/bricksgame/question/README.md
new file mode 100644
index 0000000..5fef250
--- /dev/null
+++ b/Engine2D/bricksgame/question/README.md
@@ -0,0 +1,100 @@
+# 新手教程
+
+针对目前玩一玩平台的部分相关问题,在此做出回应。日后会持续更新。
+
+首先,强调一些玩一玩平台的技术限制:
+ - 玩一玩平台不支持基于DOM Document对象的HTML元素处理
+ - 玩一玩平台不支持皮肤的远程加载,所有皮肤必须声明到egret项目的 `default.thm.json` 文件当中。
+ - 不允许动态执行代码能力。
+
+ 接下来向诸位开发者汇总一下进来的玩一玩平台开发普遍问题以及解决方案:
+
+## 问题
+### 我的玩一玩项目为什么在Xcode上运行没有问题,可在手机QQ上加载不出图片,也没有报错?
+
+答:这种问题基本可以确定是文件根目录缺少前缀导致的。玩一玩平台的路径要求前缀为 `"GameRes://"` ,egret中针对其做了资源配置的处理。可以查看js/main.js文件,查看以下两段代码。
+
+![资源加载配置路径](./ziyuan03.png)
+
+![皮肤加载配置路径](./pifu02.png)
+
+这两段代码如果与图示相同,之后的资源加载就无需加入前缀了。
+
+## 打包好玩一玩项目,运行到手机上完全黑屏,资源加载也没有问题。
+
+答:如果是直接通过 [厘米游戏](http://hudong.qq.com/) 的游戏管理上传的包,有一下两种情况。
+
+- 安卓端与ios端都显示为黑屏。
+
+ 可能是混淆导致类名变动的问题,使得找不到egret项目的主入口类。需要在js/main.js文件中加入以下代码。
+
+ ![类名混淆](./calss04.png)
+
+ 这样,代码即使经过提交混淆也可以找到主类了。
+
+ - 只有安卓端显示黑屏,ios显示正常。
+
+ ios平台与安卓平台的差异导致promise在两个平台上的不同。需要替换提交包中 `js/promise.js` 文件。目前在安卓端可以稳定运行的promise.js文件地址为:https://github.com/egret-labs/egret-target-bricks/tree/master/template/PublicBrickEngineGame/Res/js 。下载并更新 `js/promise.js` 文件后,还需要手动修改 `manifest.js` 文件。
+
+ ![promise引用](./promise01.png)
+
+ 保证在manifest.js文件中第一个被引用即可。
+
+ ## socket在玩一玩平台是不支持吗?为什么socket一直连接不上?
+ socket在玩一玩平台是支持的。socket连接不上可能是 `manifest.js` 中引用导致的问题。
+ 首先,确认您的原egret项目引用了我们提供的socket通讯库。
+ 之后,检查发布后的 `manifest.js` 文件。
+
+ ![socket引用](./socket04.png)
+
+ 确保socket.js库在`egret.js`与`egret.bricks.js`之间引用。
+ 这样就可以保证socket库加载成功了。调用egret.WebSocket API即可调用socket。
+
+## 游戏在Xcode环境下正常运行,但上传提交至平台后进行真机测试时安卓端黑屏,iOS端卡在加载至99%的地方。
+
+答:如果您遇到的情况如下:
+
+ - 您的游戏在Xcode中正常运行无报错信息。
+
+ - 对于安卓端:在手Q中直接替换游戏包,游戏正常运行无报错信息;
+
+ - 对于iOS端,在测试手Q中替换游戏包,游戏正常运行无报错信息。
+
+ - 经过上传提交至平台后进行真机测试时安卓端黑屏,iOS端卡在加载至99%的地方。
+
+那么,您的代码极有可能因受到玩一玩平台代码混淆机制的影响而无法正常运作。
+
+通过 [厘米游戏](http://hudong.qq.com/) 的游戏管理上传的包会被进行代码混淆,因此当您的代码在不经过上传环节时,可以正常运行,并且不会暴露出任何问题。如果您将Bricks引擎申明的变量或接口申明为局部变量,该变量的作用域将覆盖掉原本Bricks引擎申明的变量,并且在上传之后,该局部变量会被混淆。
+
+例如,如果您为方便使用而申明了一个局部变量GameStatusInfo,如下图所示。
+
+ ![类名混淆](./local01.jpg)
+
+则正常代码如下:
+
+![类名混淆](./local03.jpg)
+
+经过代码混淆后,代码如下:
+
+![类名混淆](./local02.jpg)
+
+此时原本的GameStatusInfo被混淆为As。此时Bricks引擎申明的GameStatusInfo.QQVer无法被访问到,而As.QQVer为undefined,因此导致游戏无法正常运行。
+
+我们强烈建议您用declare的方式来访问Bricks引擎已申明的变量、接口。
+
+在*.d.ts文件中进行如下声明:
+
+``` javascript
+declare var GameStatusInfo: {
+ roomId: number,
+}
+```
+
+即可在项目中使用Bricks引擎提供的相关变量和接口,避免混淆机制的困扰。
+
+
+```
+console.log("开始游戏roomID:“ + GameStatusInfo.roomId);
+```
+
+有更多的相关问题请您到egret论坛bbs.egret.com参与讨论。我们也会持续更新问题以及解决方案。
\ No newline at end of file
diff --git a/Engine2D/bricksgame/question/calss04.png b/Engine2D/bricksgame/question/calss04.png
new file mode 100644
index 0000000..080311a
Binary files /dev/null and b/Engine2D/bricksgame/question/calss04.png differ
diff --git a/Engine2D/bricksgame/question/local01.jpg b/Engine2D/bricksgame/question/local01.jpg
new file mode 100644
index 0000000..9200c0e
Binary files /dev/null and b/Engine2D/bricksgame/question/local01.jpg differ
diff --git a/Engine2D/bricksgame/question/local02.jpg b/Engine2D/bricksgame/question/local02.jpg
new file mode 100644
index 0000000..ea5ee12
Binary files /dev/null and b/Engine2D/bricksgame/question/local02.jpg differ
diff --git a/Engine2D/bricksgame/question/local03.jpg b/Engine2D/bricksgame/question/local03.jpg
new file mode 100644
index 0000000..7c490b6
Binary files /dev/null and b/Engine2D/bricksgame/question/local03.jpg differ
diff --git a/Engine2D/bricksgame/question/pifu02.png b/Engine2D/bricksgame/question/pifu02.png
new file mode 100644
index 0000000..3ea6161
Binary files /dev/null and b/Engine2D/bricksgame/question/pifu02.png differ
diff --git a/Engine2D/bricksgame/question/promise01.png b/Engine2D/bricksgame/question/promise01.png
new file mode 100644
index 0000000..30e2259
Binary files /dev/null and b/Engine2D/bricksgame/question/promise01.png differ
diff --git a/Engine2D/bricksgame/question/socket04.png b/Engine2D/bricksgame/question/socket04.png
new file mode 100644
index 0000000..6495121
Binary files /dev/null and b/Engine2D/bricksgame/question/socket04.png differ
diff --git a/Engine2D/bricksgame/question/ziyuan03.png b/Engine2D/bricksgame/question/ziyuan03.png
new file mode 100644
index 0000000..775aadc
Binary files /dev/null and b/Engine2D/bricksgame/question/ziyuan03.png differ
diff --git a/Engine2D/bricksgame/start/README.md b/Engine2D/bricksgame/start/README.md
new file mode 100644
index 0000000..d7f7062
--- /dev/null
+++ b/Engine2D/bricksgame/start/README.md
@@ -0,0 +1,169 @@
+# 新手教程
+
+[新手教程](#新手教程)
+
+
+- [什么是玩一玩平台](#什么是玩一玩平台)
+
+- [如何将白鹭游戏引擎制作的游戏发布到玩一玩平台](#如何将白鹭游戏引擎制作的游戏发布到玩一玩平台)
+
+- [其他版本引擎发布](#其他版本引擎发布)
+
+- [更新内容](#更新内容)
+
+- [已知问题](#已知问题)
+
+
+
+
+## 什么是玩一玩平台
+在手机 QQ 最新版本更新中,提供了一系列为游戏服务的底层接口,包含渲染、音频、本地存储、社交接口等,通过这些接口,开发者可以制作小游戏并运行在手机 QQ 中。
+
+玩一玩的底层采用了 QQ 团队自主研发的 bricks 引擎,与 HTML5 环境不同的是,bricks 引擎提供了更高层次的 API 封装,并提供了物理模块,多人音视频模块,AI模块,网络,存储,云,手势等功能,并在上层同样提供基于 JavaScript 的接口,其基础架构如下
+
+![bricksEngine](./bricksEngine.png)
+
+
+目前白鹭引擎已经添加了对于玩一玩开发的支持,您只要使用白鹭引擎开发,就可以将游戏发布至 QQ 玩一玩平台上。其技术原理如下:
+
+![egret_to_wanyiwan](./egret_to_wanyiwan.png)
+
+通过这种方式,开发者只需要使用白鹭引擎的最新版本,通过使用白鹭引擎完整工具流,就可以快速创建、开发与发布玩一玩小游戏,而无需过多的关注底层技术细节。
+
+
+## 如何将白鹭游戏引擎制作的游戏发布到玩一玩平台
+
+这次更新中,我们添加了图形化界面支持。现在 Egret Launcher 支持一键式将 Egret 游戏项目发布为玩一玩平台游戏项目。
+
+首先通过 Egret Launcher 创建项目。建议您以 `5.1.5` 及以上的版本进行玩一玩平台的游戏开发。如果您使用的引擎版本为 `5.1.x` 系列版本但低于 `5.1.4` ,您可以查看[其他版本引擎发布](#其他版本引擎发布)来发布到玩一玩平台。
+
+我们以 `5.1.5` 版本引擎为例。
+
+![egret_project01](./egret_project01.png)
+
+在项目列表中找到创建好的项目,通过 发布设置 按钮选择发布的类型。
+
+![egret_project02](./egret_project02.png)
+
+在 QQ玩一玩 标签中填写要发布的包名。
+
+![egret_project02](./egret_project03.png)
+
+发布成功后会在项目的同级目录下生成发布后的文件。
+
+![egret_project02](./egret_project04.png)
+
+最后用Xcode打开 `HelloWorld_bricks/PublicBrickGameEngine.xcodeproject` ,您就可以进行玩一玩平台的游戏开发调试了。更多文档可以参见玩一玩的[开发者文档](http://hudong.qq.com/)。
+
+当然,您也可以在原始项目中执行 `egret run --target bricks` ,也能通过Xcode打开发布完的项目。
+
+* 注:目前玩一玩只支持 MacOS 开发,我们正在和玩一玩团队共同努力,争取尽快提供 Windows 下的开发调试环境。
+* 目前执行 egret run --target bricks 命令会提示编译项目失败,但只是显示问题,并不影响开发。该问题会在下个版本中修复。
+
+
+## 其他版本引擎发布
+
+如果您的引擎为 `5.1.x` 但低于 `5.1.5` ,我们可以通过修改配置文件的方法进行发布。
+
+以下介绍的方法仅在 `5.1.2` , ` 5.1.3 ` 版本中适用。
+
+以 5.1.2 版本为例,我们需要在 `./scripts`文件夹中添加一个 `bricks/bricks.ts`的文件。
+
+```javascript
+import * as fs from 'fs';
+import * as path from 'path';
+type ManifestConfig = {
+ initial: string[],
+ game: string[]
+}
+export class BricksPlugin implements plugins.Command {
+ constructor() {
+ }
+ async onFile(file: plugins.File) {
+ const filename = file.origin;
+ if (filename == 'manifest.json') {
+ const contents = file.contents.toString();
+ const jsonData: ManifestConfig = JSON.parse(contents);
+ let content = '';
+ for (let item of jsonData.initial) {
+ if (item != 'js/promise.js' && item != 'js/promise.min.js') {
+ content += `BK.Script.loadlib("GameRes://${item}");\n`
+ }
+ if (item == "js/egret.js" || item == 'js/egret.min.js') {
+ content += `BK.Script.loadlib("GameRes://egret.bricks.js");\n`
+ }
+ }
+ for (let item of jsonData.game) {
+ content += `BK.Script.loadlib("GameRes://${item}");\n`
+ }
+ file.path = file.dirname + '/manifest.js'
+ file.contents = new Buffer(content);
+ }
+ return file;
+ }
+ async onFinish(pluginContext) {
+ }
+}
+```
+
+同时,在`./scripts/config.ts`,在其中添加如下代码:
+
+```javascript
+import { BricksPlugin } from './bricks/bricks';
+```
+```javascript
+ if (target == 'bricks') {
+ const outputDir = `../${projectName}_bricks/PublicBrickEngineGame/Res`;
+ return {
+ outputDir,
+ commands: [
+ new CompilePlugin({ libraryType: "debug" }),
+ new ExmlPlugin('commonjs'), // 非 EUI 项目关闭此设置
+ new ManifestPlugin({ output: 'manifest.json' }),
+ new BricksPlugin()
+ ]
+ }
+ }
+```
+之后,您就可以按照上面介绍的[如何将白鹭游戏引擎制作的游戏发布到玩一玩平台](#如何将白鹭游戏引擎制作的游戏发布到玩一玩平台)的方法发布游戏了。
+
+
+# 更新内容
+
+本周白鹭引擎对玩一玩平台的支持进行了较大的改善,重点修复了以下问题:
+
+* 添加了对 EUI 的支持
+* 添加了对 DragonBones 的支持
+* 添加了对 Graphics 的支持
+* 添加了对 Mesh 的支持
+* 添加了显示对象的 blendMode与scrollRect属性的支持
+* 添加了对 LocalStorage 的支持
+* 添加了对 WebSocket 的支持
+* 修复了二进制数据无法加载的 BUG
+* 修复了九宫格渲染错误的 BUG
+* 修复了多个文本渲染及文本布局的 BUG
+* 修复了 HTTP 请求无法发送 post 请求的 BUG
+
+# 已知问题
+白鹭引擎目前尚有以下功能尚未支持玩一玩平台
+
+* 渲染相关
+ * 不规则遮罩
+ * 动态截屏
+ * 位图缓存
+* 触摸相关
+ * 像素级碰撞检测
+ * 点击穿透
+* 调试相关
+ * 脏矩形调试显示
+ * fps监视器
+ * 屏幕调试日志
+
+以上功能预计在以后的更新中逐个支持。
+
+同时,由于玩一玩平台的 bricks 引擎目前处于内测状态,仍然存在一些问题,目前我们暂时不建议开发者在玩一玩平台使用以下功能:
+
+* 贝塞尔曲线绘制
+* 视频播放
+
+以上问题我们会和玩一玩平台的工程师保持紧密沟通,争取尽快解决。
\ No newline at end of file
diff --git a/Engine2D/bricksgame/start/bricksEngine.png b/Engine2D/bricksgame/start/bricksEngine.png
new file mode 100644
index 0000000..93f67ee
Binary files /dev/null and b/Engine2D/bricksgame/start/bricksEngine.png differ
diff --git a/Engine2D/bricksgame/start/egret_project01.png b/Engine2D/bricksgame/start/egret_project01.png
new file mode 100644
index 0000000..850b3b2
Binary files /dev/null and b/Engine2D/bricksgame/start/egret_project01.png differ
diff --git a/Engine2D/bricksgame/start/egret_project02.png b/Engine2D/bricksgame/start/egret_project02.png
new file mode 100644
index 0000000..35cbb74
Binary files /dev/null and b/Engine2D/bricksgame/start/egret_project02.png differ
diff --git a/Engine2D/bricksgame/start/egret_project03.png b/Engine2D/bricksgame/start/egret_project03.png
new file mode 100644
index 0000000..cf67713
Binary files /dev/null and b/Engine2D/bricksgame/start/egret_project03.png differ
diff --git a/Engine2D/bricksgame/start/egret_project04.png b/Engine2D/bricksgame/start/egret_project04.png
new file mode 100644
index 0000000..70d225c
Binary files /dev/null and b/Engine2D/bricksgame/start/egret_project04.png differ
diff --git a/Engine2D/bricksgame/start/egret_to_wanyiwan.png b/Engine2D/bricksgame/start/egret_to_wanyiwan.png
new file mode 100644
index 0000000..62fb295
Binary files /dev/null and b/Engine2D/bricksgame/start/egret_to_wanyiwan.png differ
diff --git a/Engine2D/bricksgame/start/xcode.png b/Engine2D/bricksgame/start/xcode.png
new file mode 100644
index 0000000..9d9aa3b
Binary files /dev/null and b/Engine2D/bricksgame/start/xcode.png differ
diff --git a/Engine2D/callJS/tsCallJs/README.md b/Engine2D/callJS/tsCallJs/README.md
new file mode 100644
index 0000000..ee8c5cd
--- /dev/null
+++ b/Engine2D/callJS/tsCallJs/README.md
@@ -0,0 +1,111 @@
+
+## 1.说明
+
+* ts 是 js 的超集,因此只要是 js 与 js 可以互相调用的,ts 均可以调用,只不过需要增加声明来解决编译时报错。
+
+* ts 最终生成的文件为 js,因此 js 调用 ts 其实就是 js 调用 js(ts 生成的 js 文件)。
+
+## 2.ts 调用 js
+
+### 步骤
+
+* 找到 js 调用 js 的方法。
+
+* 增加方法调用的声明。 请参考 [如何生成 .d.ts](http://developer.egret.com/cn/github/egret-docs/extension/threes/dts/index.html) 。
+
+### 示例
+
+* js 内的方法
+
+~~~javascript
+function callJsFunc(msg) {
+ console.log("msg from egret : " + msg);
+}
+~~~
+
+* ts 内声明
+
+~~~javascript
+declare function callJsFunc(msg:string);//可以放在 ts 文件内(建议在顶部或者底部,中间的没试过)或者单独放到一个 .d.ts 文件中,请不要放在其他类型的文件内。msg 类型根据函数体判断。
+~~~
+
+* ts 内调用
+
+~~~javascript
+callJsFunc("hello js");
+~~~
+
+* 输出
+
+~~~javascript
+msg from egret : hello js
+~~~
+
+
+> 总结:在 js 调用 js 的基础上增加声明。其他的比如变量等,也是按上面步骤来实现。
+
+
+## 3.js 调用 ts
+
+js 调用 ts 其实就是 ts 调用 ts,由于 ts 调用 ts 可能会有同模块下的省略写法,因此只要使用不同模块下的调用来写即可。
+
+### 步骤
+
+* 找到非同一模块下 ts 的调用(比如 ```example.A.CallEgretFunc("hello")```)。
+
+* 完全按上面调用的方式来写 (比如上面的 ```example.A.CallEgretFunc("hello")```)。
+
+### 示例
+
+* ts 内的方法
+
+~~~javascript
+module exampleA {
+ export class A {
+ public callEgretMethod(msg:string):void {
+ console.log("method msg from js : " + msg);
+ }
+
+ public static CallEgretFunc(msg:string):void {
+ console.log("static msg from js : " + msg);
+ }
+ }
+}
+~~~
+
+
+* 非同一模块下 ts 调用
+
+~~~javascript
+module exampleB {
+ export function b() {
+ //调用方法
+ var a:exampleA.A = new exampleA.A();
+ a.callEgretMethod("method");
+
+ //调用静态函数
+ exampleA.A.CallEgretFunc("function");
+ }
+}
+~~~
+
+
+
+* js 内调用
+
+
+~~~javascript
+var a = new exampleA.A();//去掉 a 的类型
+a.callEgretMethod("method");
+
+exampleA.A.CallEgretFunc("function");
+~~~
+
+* 输出
+
+~~~javascript
+method msg from js : method
+static msg from js : function
+~~~
+
+> 总结:相当于非同一个模块下的 ts 调用 ts。其他的比如变量等,也是按上面步骤来实现。
diff --git a/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftt0qjetboj31kw11fqg6.png b/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftt0qjetboj31kw11fqg6.png
new file mode 100644
index 0000000..3bfd5fe
Binary files /dev/null and b/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftt0qjetboj31kw11fqg6.png differ
diff --git a/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftt0qlp9r9j31kw11fdsu.png b/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftt0qlp9r9j31kw11fdsu.png
new file mode 100644
index 0000000..b62977f
Binary files /dev/null and b/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftt0qlp9r9j31kw11fdsu.png differ
diff --git a/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftwmn9vae5j30ea0og409.png b/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftwmn9vae5j30ea0og409.png
new file mode 100644
index 0000000..27a3130
Binary files /dev/null and b/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftwmn9vae5j30ea0og409.png differ
diff --git a/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftzzaieuuxj31kw104wqe.png b/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftzzaieuuxj31kw104wqe.png
new file mode 100644
index 0000000..4f0df58
Binary files /dev/null and b/Engine2D/cmdExtensionPlugin/api/006tKfTcly1ftzzaieuuxj31kw104wqe.png differ
diff --git a/Engine2D/cmdExtensionPlugin/api/006tNc79ly1ftvgmpt1gyj31kw11sna8.png b/Engine2D/cmdExtensionPlugin/api/006tNc79ly1ftvgmpt1gyj31kw11sna8.png
new file mode 100644
index 0000000..643725d
Binary files /dev/null and b/Engine2D/cmdExtensionPlugin/api/006tNc79ly1ftvgmpt1gyj31kw11sna8.png differ
diff --git a/Engine2D/cmdExtensionPlugin/api/README.md b/Engine2D/cmdExtensionPlugin/api/README.md
new file mode 100644
index 0000000..8ca9222
--- /dev/null
+++ b/Engine2D/cmdExtensionPlugin/api/README.md
@@ -0,0 +1,747 @@
+# 命令行扩展插件 API 文档
+
+## 脚本插件目录结构
+
+```
+scripts
+ |-- api.d.ts // 文档
+ |-- config.ts // 构建脚本入口
+ |-- myplugin.ts // 开发者自定义插件的示例
+ |-- node.d.ts // node的.d.ts 文件
+```
+
+## 插件运行机制简介
+
+开发者执行 ` build` 和 ` publish` 的时候,可以执行不同的插件。
+
+在项目构建的时候会自动执行 ` config.ts` 文件中的 ` buildConfig` 函数。
+
+> 这个函数的功能是返回一个对象,对象中的内容会根据执行不同的命令返回相对应的输出路径和需要执行的插件,插件在返回对象的 commands 数组中实例化后就会执行。
+
+
+
+` config.ts` 有多个版本对应着不同的平台:
+
+![image-20180803171144641](./006tKfTcly1ftwmn9vae5j30ea0og409.png)
+
+发布到不同平台时,执行的` config.ts`是不同的,比如执行 :
+
+```shell
+egret publish --target wxgame
+```
+
+发布到微信小游戏,执行的是 ` config.wxgame.ts`。
+
+## 运行调用
+
+> config.ts
+
+```typescript
+
+else if (command == 'publish') {
+ const outputDir = `bin-release/web/${version}`;
+ return {
+ outputDir,
+
+ // ----------调用开始-----------
+ // commands数组中实例化之后,就会执行该插件
+ commands: [
+ new CustomPlugin(),
+ new CompilePlugin({ libraryType: "release", defines: { DEBUG: false, RELEASE: true } }),
+ new ExmlPlugin('commonjs'), // 非 EUI 项目关闭此设置
+ new UglifyPlugin([{
+ sources: ["main.js"],
+ target: "main.min.js"
+ }]),
+ new RenamePlugin({
+ verbose: true, hash: 'crc32', matchers: [
+ { from: "**/*.js", to: "[path][name]_[hash].[ext]" }
+ ]
+ }),
+ new ManifestPlugin({ output: "manifest.json" }),
+ ]
+ // ----------调用结束------------
+
+
+ }
+ }
+```
+
+插件按照**数组顺序**调用。
+
+为了方便开发者使用,Egret内置了一些常用插件。
+
+----
+
+
+
+
+
+## 插件---ExmlPlugin
+
+### 定义
+
+EXML 插件,用于使用不同的策略来发布 EXML 文件。
+
+### 语法
+
+```typescript
+new ExmlPlugin(publishPolicy: EXML_Publish_Policy)
+```
+
+### 参数值
+
+| 参数 | 类型 | 描述 |
+| ---- | ---- | --- |
+| default | string | 使用 egretProperties.json 中的 exmlPublishPolicy 中的策略 |
+| debug| string | 默认策略,用于开发环境 |
+| contents | string | 将 EXML 的内容写入到主题文件中 |
+| gjs| string | 将生成的JS文件写入到主题文件中 |
+| commonjs | string | 将EXML合并为一个 CommonJS 风格的文件 |
+| commonjs2 | string | 将EXML合并为一个含有解析方法和皮肤定义的文件,且皮肤抽离为一份配置 |
+
+### 细节
+
+如果当前项目非EUI项目,请关掉这个设置。
+
+
+
+## 插件---UglifyPlugin
+
+### 定义
+
+混淆插件,用来压缩混淆代码。
+
+### 语法
+
+```typescript
+new UglifyPlugin([{
+ sources: ["main.js"],
+ target: "main.min.js"
+}])
+```
+
+### 参数值
+
+UglifyPlugin 的参数是一个数组,数组中的值是一个 ` UglifyPluginOption`对象,对象属性如下:
+
+| 参数 | 类型 | 描述 |
+| ------- | -------- | ---------------- |
+| sources | string[] | 需要被压缩的文件 |
+| target | string | 压缩后的文件名 |
+
+
+
+## 插件---RenamePlugin
+
+### 定义
+
+修改文件名插件,用哈希算法给文件名生成一个独一无二的后缀。
+
+### 语法
+
+```typescript
+new RenamePlugin({
+ verbose: true, hash: 'crc32', matchers: [
+ { from: "**/*.js", to: "[path][name]_[hash].[ext]" }
+ ]
+})
+```
+
+### 参数值
+
+RenamePlugin 的参数是一个对象,对象属性如下:
+
+| 参数 | 类型 | 描述 |
+| -------- | --------- | ------------------------------------------------------------ |
+| verbose | boolean | 是否输出日志 (可选参数) |
+| hash | string | 采用何种 hash 算法,目前暂时只支持 crc32 (可选参数) |
+| matchers | Matcher[] | 设置匹配规则,将指定文件进行改名
该参数是个数组,允许设置多个匹配规则,数组内是Matcher对象 |
+
+Matcher对象:
+
+匹配机制,将满足 ` from` 的文件输出为 ` to` 格式的文件。
+
+` from` 采用 glob 表达式 ,` to` 包含 ` path` 、` name`、 ` hash`、 ` ext` 四个变量。
+
+示例:
+
+```typescript
+// 将所有的文件(*表示通配符,匹配所有情况)输出为to的格式
+{ from:"resource/**.*" , to:"[path][name]_[hash].[ext]" }
+```
+
+
+
+## 插件---ManifestPlugin
+
+### 定义
+
+生成 manifest 文件,这个文件会被用于记录 JavaScript 文件的版本号。
+
+### 语法
+
+```typescript
+new ManifestPlugin({ output: "manifest.json" })
+```
+
+### 参数值
+
+ManifestPlugin的参数是一个对象,属性如下:
+
+| 参数 | 类型 | 描述 |
+| ------- | ------- | ----------------------------------------- |
+| output | string | 输出的文件名,支持 json 与 js 两种格式 |
+| hash | string | 使用的算法,暂只支持 “crc32” (可选参数) |
+| verbose | boolean | 是否输出转换过程 (可选参数) |
+
+
+
+## 插件---CompilePlugin
+
+### 定义
+
+编译插件,根据参数选择不同的编译方式。
+
+### 语法
+
+```typescript
+new CompilePlugin({ libraryType: "release", defines: { DEBUG: false, RELEASE: true } })
+```
+
+### 参数值
+
+CompilePlugin 的参数是一个对象,属性如下:
+
+| 参数 | 类型 | 描述 |
+| ----------- | ------ | ----------------------------- |
+| libraryType | string | 可选取值 "debug" \| “release" |
+| defines | any | 定义 (可选参数) |
+
+### 细节
+
+libraryType参数设置编译的模式。
+
+设置为 debug 时,发布后的js文件不会被混淆压缩,保留可读性,方便debug。
+
+![image-20180731140029051](./006tKfTcly1ftt0qlp9r9j31kw11fdsu.png)
+
+
+
+设置为 release 时,发布后的js文件会被混淆压缩。
+
+![image-20180731140130770](./006tKfTcly1ftt0qjetboj31kw11fqg6.png)
+
+
+
+## 插件---IncrementCompilePlugin
+
+### 定义
+
+增量编译, 重新编译程序代码中更改的那部分代码 (常用在开发模式,发布时请使用 `CompilePlugin`)。
+
+### 语法
+
+```typescript
+new IncrementCompilePlugin()
+```
+
+### 细节
+
+这个插件生成的 JavaScript 代码不会被添加到构建管线中,后续其他插件无法获取生成的 js 文件。
+
+这个功能将会在未来被 watch 模式代替掉。
+
+
+
+
+
+## 插件---EmitResConfigFilePlugin
+
+### 定义
+
+用来生成 res.json 文件或者 res.js 文件。
+
+### 语法
+
+```typescript
+new EmitResConfigFilePlugin({
+ output: "resource/default.res.json",
+
+ // typeSelector方法,写在下面
+ typeSelector: config.typeSelector,
+
+ // 根据传进来的路径p,生成文件name
+ nameSelector: p => {
+ // 获取文件名,然后把 '.' 替换成 '_'
+ return path.basename(p).replace(/\./gi, "_")
+ },
+
+ // 根据传进来的路径p,生成group
+ groupSelector: p => {
+ // 这里数据写死,可以根据自己的需求自定
+ return "preload"
+ }
+})
+
+ //…………其他代码…………
+
+// 根据传进来的path,判断文件的类型
+typeSelector: (path) => {
+ const ext = path.substr(path.lastIndexOf(".") + 1);
+ const typeMap = {
+ "jpg": "image",
+ "png": "image",
+ "webp": "image",
+ "json": "json",
+ "fnt": "font",
+ "pvr": "pvr",
+ "mp3": "sound",
+ "zip": "zip",
+ "sheet": "sheet",
+ "exml": "text"
+ }
+ let type = typeMap[ext];
+ if (type == "json") {
+ if (path.indexOf("sheet") >= 0) {
+ type = "sheet";
+ } else if (path.indexOf("movieclip") >= 0) {
+ type = "movieclip";
+ };
+ }
+ return type;
+}
+
+```
+
+### 参数值
+
+EmitResConfigFilePlugin的参数是一个对象,参数如下:
+
+| 参数 | 类型 | 描述 |
+| ------------- | -------- | ---------------------------------------------------------- |
+| output | string | 生成路径,可以指定生成为 *.res.js 文件或者 *.res.json 文件 |
+| typeSelector | function | 一个方法,根据返回值决定文件的类型 |
+| nameSelector | function | 一个方法,根据返回值决定文件的name |
+| groupSelector | function | 一个方法,根据返回值决定文件的组 |
+
+` typeSelector` , `nameSelector `, `groupSelector` 三个方法都有一个默认参数 p,即每个文件的完整路径。
+
+
+
+### typeSelector
+
+``` typescript
+ typeSelector: (path) => {
+ const ext = path.substr(path.lastIndexOf(".") + 1);
+ const typeMap = {
+ "jpg": "image",
+ "png": "image",
+ "webp": "image",
+ "json": "json",
+ "fnt": "font",
+ "pvr": "pvr",
+ "mp3": "sound",
+ "zip": "zip",
+ "sheet": "sheet",
+ "exml": "text"
+ }
+ let type = typeMap[ext];
+ if (type == "json") {
+ if (path.indexOf("sheet") >= 0) {
+ type = "sheet";
+ } else if (path.indexOf("movieclip") >= 0) {
+ type = "movieclip";
+ };
+ }
+ return type;
+ }
+```
+
+先通过完整路径获取到文件的后缀名,然后在typeMap中找到对应的文件类型,接着判断”sheet"和"movieclip”类型,最后返回type。
+
+根据开发者不同的需求可以自定义返回的文件类型,比如可以将json文件作为text文件返回。
+
+### nameSelector
+
+```typescript
+nameSelector: p => {
+ return path.basename(p).replace(/\./gi, "_")
+}
+```
+
+获取到文件名,然后将文件名中的 “.” 替换为 “_” ,然后返回。
+
+res.json中资源的“name”属性的值的命名方式,就是由这个方法定义的。
+
+###groupSelector
+
+```typescript
+groupSelector: p => {
+ return "preload"
+}
+```
+
+方法中直接返回了 preload ,说明所有的文件都直接放在了 “preload” 组中。
+
+开发者可以自定义分组方式,比如根据文件所在的文件夹来分组。
+
+```typescript
+groupSelector: p => {
+ // 把p分割成数组
+ let arr = p.split('/')
+ // 数组中倒数第二个就是文件夹名
+ return arr[arr.length - 2]
+}
+```
+
+根据不同的父级文件夹分组。
+
+
+
+## 插件---CleanPlugin
+
+### 定义
+
+清理,用来重置清空文件夹。
+
+### 语法
+
+```typescript
+new CleanPlugin({ matchers: ["js", "resource"] })
+```
+
+### 参数值
+
+CleanPlugin的参数是一个对象,属性如下:
+
+| 参数 | 类型 | 描述 |
+| -------- | ----- | ---------------------------------- |
+| matchers | array | 数组,数组内是需要清理的文件夹名称 |
+
+### 细节
+
+matchers 的值是需要清理的文件夹的名称,这个文件夹名是相对于publish的outputDir,也就是发布后生成的文件夹,语法中实例表示清理 js和resource两个文件夹。一般作为第一个插件运行,清空上一次生成的资源。
+
+
+
+## 插件---ResSplitPlugin
+
+### 定义
+
+分离资源目录,将指定的文件拷贝到其他的文件夹内。
+
+### 语法
+
+```typescript
+new ResSplitPlugin({
+ verbose: true,
+ matchers: [
+ { from:"resource/**" , to:"dir" }
+ ]
+})
+```
+
+### 参数值
+
+ResSplitPlugin的参数是一个对象,对象属性如下:
+
+| 参数 | 类型 | 描述 |
+| -------- | ------- | --------------------------------- |
+| verbose | boolean | 是否输出日志 |
+| matchers | array | 一个数组,数组内的项是Matcher对象 |
+
+`Matcher` 有两个属性,`from` 、`to`
+
+> 将满足 from 的文件输出到 to
+
+### 细节
+
+ResSplitPlugin插件在`publish`时使用,可以将资源目录分离到别的文件夹。
+
+在开发微信小游戏的时候,可以使用这个插件将资源放到初始包外,减小游戏包体积。
+
+案例:[如何使用缓存资源](http://developer.egret.com/cn/github/egret-docs/Engine2D/minigame/usingcache/index.html)
+
+
+
+## 插件---ZipPlugin
+
+压缩插件,把代码压缩成某种格式。
+
+### 用法
+
+```typescript
+new ZipPlugin({
+ mergeSelector: config.mergeSelector
+})
+ //……其他代码
+mergeSelector(p) {
+ // do something
+}
+```
+
+### 参数值
+
+ZipPlugin的参数是一个对象,属性如下:
+
+| 参数 | 类型 | 描述 |
+| ------------- | -------- | -------------------------------- |
+| mergeSelector | function | 一个方法,根据返回值决定如何压缩 |
+
+### 细节
+
+使用ZipPlugin插件之前,需要安装cross-zip 和 cross-zip-cli, 在终端中输入:
+
+```shell
+//全局安装
+npm install cross-zip -g
+npm install cross-zip-cli -g
+```
+
+安装完成之后才可以使用这个插件。
+
+```typescript
+new ZipPlugin({
+ mergeSelector: path => {
+
+ // 如果文件是assets/Button/路径下的, 压缩到assets/but.zip
+ if (path.indexOf("assets/Button/") >= 0) {
+ return "assets/but.zip"
+ }
+ }
+})
+```
+
+![image-20180802164312618](./006tNc79ly1ftvgmpt1gyj31kw11sna8.png)
+
+(图中项目是新建的默认EUI项目)
+
+
+
+## 插件---TextureMergerPlugin
+
+### 定义
+
+使用 TextureMerger 实现纹理自动合并,通常与ConvertResConfigFilePlugin插件配合使用。
+
+### 语法
+
+```typescript
+new TextureMergerPlugin({textureMergerRoot:[ 'resource']})
+```
+
+### 参数值
+
+| 参数 | 类型 | 描述 |
+| ----------------- | ---- | ---------------------- |
+| textureMergerRoot | 数组 | 数组内的值表示扫描路径 |
+
+插件只合成textureMergerRoot参数中指定的目录中的tmproject
+
+### 细节
+
+插件依赖 TextureMerger 1.7 以上的版本。
+
+TextureMergerPlugin根据项目中的`tmproject`文件进行合图操作(暂时需要关闭TextureMerger工具才能使用),通过TextureMerger工具的命令行控制完成。
+
+#### 生成tmproject文件
+
+* 开发者通过wing做出一款游戏后,我们建议使用TextureMerger工具进行合图操作,这样主要目的就是可以自由设置,开发者可以根据项目的需求来调节最后的显示效果和合图的方式。使用[TextureMerger工具](http://developer.egret.com/cn/github/egret-docs/tools/TextureMerger/update/update172/index.html)生成`tmproject`文件。
+
+
+
+* 当游戏项目比较小,对资源配置的要求不高时,开发者可以选择使用一个自动化的脚本来处理生成`tmproject`文件。
+
+ 脚本 autoMerger.js,主要将对应的res.json里面的组进行合并图集操作,支持粒子,龙骨,位图字体的筛选,支持多个res.json,自动扫描配置好的res.json,但是由于资源引用问题,建议将所有res.json合并为一个文件后,然后再执行这个脚本去生成对应的tmproject文件,因为针对的是比较普遍的情况,所以性能比较低,如果开发者所需项目命名比较规范统一,建议修改脚本去提高性能,使用此脚本时开发者看不到最终显示效果,如果组的资源过多,很有可能导致合完的图集很大,大量空白区域被闲置,**因此建议开发者修改组之后或是采用[TextureMerger工具](http://developer.egret.com/cn/github/egret-docs/tools/TextureMerger/manual/index.html)进行拆分**,以达到最好的效果。
+
+ 脚本使用:
+
+ 将合图插件autoMerger.js拷贝到所需工程的scripts目录下(其他目录可能导致发布流程被破坏),修改autoMerger.js里面的两个参数。
+
+ ```typescript
+ // 要扫描的res.json文件数组
+ var resjsons = ["default.res.json"];
+ ```
+
+ ```typescript
+ // tmproject文件的输出目录, 必须在resource目录下
+ var targetDir = "resource/TextureMerger";
+ ```
+
+ 在Egret Wing中打开终端,或使用其他终端进入当前项目根目录:
+
+ ```shell
+ node scripts/autoMerger.js
+ ```
+
+#### autoMerget脚本
+
+
+```typescript
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var fs = require("fs");
+var path = require("path");
+var resjsons = ["resource/default.res.json"]; //要扫描的res.json文件
+var targetDir = "resource/TextureMerger"; //输出目录
+var pathNor = path.relative(targetDir, "resource"); //返回一个相对路径
+var tempindex = 0;
+//创建输出文件夹
+if (resjsons.length > 0) {
+ if (!fs.existsSync(targetDir)) {
+
+ // var paths = path.normalize(targetDir).split("\\"); //windows 下使用
+ var paths = path.normalize(targetDir).split("\/"); //mac linux 下使用
+
+ var target = ".";
+ for (var _i = 0, paths_1 = paths; _i < paths_1.length; _i++) {
+ var p = paths_1[_i];
+
+ // target += ("\\" + p); // windows 下使用
+ target += ("\/" + p); // mac linux 下使用
+
+ if (!fs.existsSync(target))
+ // 根据路径创建文件夹
+ fs.mkdirSync(target);
+ }
+ }
+}
+var _loop_1 = function (resJson) {
+ // 判断是否是res.json文件
+ if (fs.existsSync(resJson) && resJson.indexOf("res.json") > -1) {
+ var defaultJson = fs.readFileSync(resJson, "utf-8");
+ // 解析res.json文件内容
+ var defaultObject = JSON.parse(defaultJson);
+ var groups = defaultObject.groups; //组
+ var resources = defaultObject.resources; //资源
+ var resourcesHash_1 = {}; // 用来存放resources的资源信息
+
+ // 遍历resources
+ for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) {
+ var resource = resources_1[_i];
+ resourcesHash_1[resource.name] = resource.url;
+ }
+
+ // 遍历groups
+ for (var _a = 0, groups_1 = groups; _a < groups_1.length; _a++) {
+ var group = groups_1[_a];
+ var tmproject = {}; //用来存放tmproject文件的信息
+ // tmproject文件配置
+ tmproject["options"] = {
+ "layoutMath": "2",
+ "sizeMode": "2n",
+ "useExtension": 1,
+ "layoutGap": 1,
+ "extend": 0
+ };
+ // projectName
+ tmproject["projectName"] = group.name + "_" + tempindex;
+ // 版本
+ tmproject["version"] = 5;
+ tempindex++;
+
+ // 获取res.json分组的keys, 并分割成数组
+ var oldkeys = group.keys.split(",");
+ var oldkeysHash = {};
+ // 遍历oldkeys
+ for (var _b = 0, oldkeys_1 = oldkeys; _b < oldkeys_1.length; _b++) {
+ var key = oldkeys_1[_b];
+ // 保存到oldkeysHash对象中
+ oldkeysHash[key] = true;
+ }
+
+ var newKeys = [];
+ // 遍历oldkeys
+ for (var _c = 0, oldkeys_2 = oldkeys; _c < oldkeys_2.length; _c++) {
+ var key = oldkeys_2[_c];
+ if (key.indexOf("json") == -1) {
+ if (!oldkeysHash[key.replace("png", "json")]) { //粒子和龙骨对应的图集不合图
+ if (!oldkeysHash[key.replace("png", "fnt")]) //位图字体
+ newKeys.push(key);
+ }
+ else if (key.indexOf("jpg") > -1) {
+ newKeys.push(key);
+ }
+ }
+ }
+ oldkeysHash = {};
+ oldkeys = [];
+ // files路径
+ var urls = newKeys.map(function (key) {
+ return path.join(pathNor, resourcesHash_1[key]);
+ });
+ tmproject["files"] = urls;
+ // 根据tmproject写入文件
+ if (urls.length > 0) {
+ fs.writeFileSync(path.join(targetDir, tmproject["projectName"] + ".tmproject"), JSON.stringify(tmproject));
+ }
+ tmproject = {};
+ }
+ }
+};
+//根据数组开始扫描
+for (var _a = 0, resjsons_1 = resjsons; _a < resjsons_1.length; _a++) {
+ var resJson = resjsons_1[_a];
+ _loop_1(resJson);
+}
+
+```
+
+
+
+
+#### 调用插件
+
+publish之后,会在打包后的文件夹的resource目录下生成一个TextureMerger文件夹,文件夹内就是合并完成后的纹理集。
+
+![image-20180806144123553](./006tKfTcly1ftzzaieuuxj31kw104wqe.png)
+
+此时纹理集并没有被添加到 res.json 配置中,需要使用[ConvertResConfigFilePlugin](#ConvertResConfigFilePlugin)插件。
+
+
+
+## 插件---ConvertResConfigFilePlugin
+
+### 定义
+
+对原有的资源进行筛选,将合图之前的小图资源引用删除,增加对合并图集的引用加载,通常与TextureMergerPlugin插件配合使用。
+
+### 语法
+
+```typescript
+new ConvertResConfigFilePlugin({
+ resourceConfigFiles: [{
+ filename: "resource/default.res.json", root: "resource/" }],
+ nameSelector: (p) => {
+ return path.basename(p).split(".").join("_");
+ }
+})
+```
+
+### 参数值
+
+ConvertResConfigFilePlugin的参数是一个对象,属性如下:
+
+| 参数 | 类型 | 描述 |
+| ------------------- | ------- | ---------------------------------- |
+| resourceConfigFiles | array | 数组,数组中是一个对象 |
+| nameSelector | funcion | 一个方法,根据返回值决定文件的name |
+| TM_Verbose | boolean | 是否输出警告 |
+
+resourceConfigFiles 数组中的对象属性中,filename属性是被修改的配置文件,root属性是资源路径,应该与游戏业务逻辑里面的相一致,同时整个插件执行的时候,只扫描这个root文件夹下面的资源。
+
+### 细节
+
+nameSelector函数主要是规定了怎么资源的url名字转为对应res.json中的名字,默认情况就是上面所示,如果开发者有自己的统一规范可以替换掉这里的逻辑。
+
+如果开发者资源名称和url名称没有统一的规范,建议先统一修改res.json的引用设置再去调用此插件。
+
+当TM_Verbose打印出警告的时候,表示有多个res.json 都引用同一份合图结果,证明证明这个资源没有划分好(不影响代码执行)。
+
+### TIP
+
+当文件打包出的图集在res.json文件上级的时候,是不能使用的,在res.json中不能出现 `../` 这种向上级寻找资源的语法,因此开发者如果要使用合图插件,只能将tmproject文件放到与res.json或是它的子集中去。另外可能存在很多res.json都会引用同一份的合图,这份合图的位置就要保证在所有res.json文件的子集下。
+
+
+
diff --git a/Engine2D/cmdExtensionPlugin/plugin/01.jpg b/Engine2D/cmdExtensionPlugin/plugin/01.jpg
new file mode 100644
index 0000000..ff11f78
Binary files /dev/null and b/Engine2D/cmdExtensionPlugin/plugin/01.jpg differ
diff --git a/Engine2D/cmdExtensionPlugin/plugin/02.jpg b/Engine2D/cmdExtensionPlugin/plugin/02.jpg
new file mode 100644
index 0000000..698c236
Binary files /dev/null and b/Engine2D/cmdExtensionPlugin/plugin/02.jpg differ
diff --git a/Engine2D/cmdExtensionPlugin/plugin/03.jpg b/Engine2D/cmdExtensionPlugin/plugin/03.jpg
new file mode 100644
index 0000000..ce9730b
Binary files /dev/null and b/Engine2D/cmdExtensionPlugin/plugin/03.jpg differ
diff --git a/Engine2D/cmdExtensionPlugin/plugin/README.md b/Engine2D/cmdExtensionPlugin/plugin/README.md
new file mode 100644
index 0000000..b23d5c8
--- /dev/null
+++ b/Engine2D/cmdExtensionPlugin/plugin/README.md
@@ -0,0 +1,105 @@
+## 命令行扩展插件
+
+### 脚本插件目录结构
+
+```
+scripts
+ |-- api.d.ts // 文档
+ |-- config.ts // 构建脚本入口
+ |-- myplugin.ts // 开发者自定义插件的示例
+ |-- node.d.ts // node的.d.ts 文件
+```
+
+### 插件运行机制简介
+
+开发者在 build 和 publish 的时候可以执行自定义插件,在项目构建时会执行 config.ts 文件中的 buildConfig 函数,这个函数的功能是返回一个对象,对象中的内容会根据执行不同的命令返回相对应的输出路径和需要执行的插件,插件在返回对象的 commands 数组中实例化后就会执行。
+
+![image](01.jpg)
+
+### 插件编写规范
+
+扩展的插件要实现 plugins.Command 接口,接口中有两个方法,onFile 方法会在项目中的每个文件都会执行此函数,返回 file 表示保留此文件,返回 null 表示将此文件从构建管线中删除,传入的参数是实现了 File 接口的类型。onFinish 方法会在所有文件均执行完后,最终会执行此函数,传入的参数是实现了 CommandContext 接口的类型。基本结构如图:
+
+![image](02.jpg)
+
+### 内置插件简介
+
+另外为了开发者的便利性,我们已经内置了几个常用的插件,详细的介绍请您查看 api.d.ts 文件。
+
+### 开发插件示例
+
+我们要的功能很简单,只是在编译后 js 文件名添加这次编译的时间戳,以便达到对 js 文件版本控制。
+首先在 scripts 文件中建立 TestPlugin.ts 文件,并实现 plugins.Command 接口。
+
+```javascript
+export class TestPlugin implements plugins.Command {
+ constructor() {
+ }
+ async onFile(file: plugins.File) {
+ return file;
+ }
+ async onFinish(commandContext: plugins.CommandContext) {
+ }
+}
+```
+
+我们要保存时间戳和已修改的 js 文件名字,就要声明这几个属性来保存,然后在构造函数里生成时间戳,代码如下:
+
+```javascript
+private timeStamp: number; //时间戳
+
+private modifyInitial: Array = []; //保存修改过的库文件 js 文件名字
+private modifyGame: Array = []; //保存修改过的 main 文件 js 文件名字
+
+private manifestPath: string; //保存 manifest 路径
+
+constructor() {
+ this.timeStamp = Date.now();
+}
+```
+
+然后我来扩展 onFile 的方法,先判断类型为 js 的文件,使用 file.extname 来判断,如果为 js 文件将生成好的时间戳加到 js 文件的名字上,我们还将所有修改的 js 文件重新放到 manifest.json 中,所以要将 manifest 路径和修改过的 js 文件名字保存起来以便我们后续修改,最后返回这个文件。代码如下:
+
+```javascript
+async onFile(file: plugins.File) {
+ const extName = file.extname;
+ if (extName == ".js") {
+ const pos = file.path.lastIndexOf(".");
+ const prefix = file.path.slice(0, pos);
+ const nowName = prefix + this.timeStamp + extName;
+ file.path = nowName;
+
+ if (file.basename.indexOf("main.min") >= 0) {
+ this.modifyGame.push(file.relative);
+ } else {
+ this.modifyInitial.push(file.relative);
+ }
+ }
+
+ if (file.basename.indexOf("manifest.json") >= 0) {
+ this.manifestPath = file.relative;
+ }
+ return file;
+}
+```
+
+我们还需在 onFinish 方法中处理 manifest.json 文件,先将所有保存好的 js 文件名字放到一个对象中,然后将这个对象转换为一个 JSON 字符串,最后保利用 createFile 方法修改 manifest 文件。代码如下:
+
+```javascript
+async onFinish(commandContext: plugins.CommandContext) {
+ let obj = {
+ initial: this.modifyInitial,
+ game: this.modifyGame
+ };
+ const serialize = JSON.stringify(obj);
+ commandContext.createFile(this.manifestPath, new Buffer(serialize));
+}
+```
+
+现在我们已经完成了这小小的插件,要想使用还需要把我们的插件引入到 config.ts 文件中,首先使用 import 引入我们的插件,例:import { testPlugin } from './TestPlugin';然后在 buildConfig 的返回值的 commands 数组中实例化这个插件:new testPlugin()。最后执行命令 egret publish 命令的运行结果如图:
+
+![image](03.jpg)
+
+### 小结
+
+通过这篇文档,大家已经能够非常容易的编写 Egret 命令行插件了,有任何问题大家到论坛上提问即可,白鹭官方会有专职人员为你解答。
diff --git a/Engine2D/cmdExtensionPlugin/teach/README.md b/Engine2D/cmdExtensionPlugin/teach/README.md
new file mode 100644
index 0000000..105b768
--- /dev/null
+++ b/Engine2D/cmdExtensionPlugin/teach/README.md
@@ -0,0 +1,426 @@
+# 插件使用案例教程
+
+## 引言
+
+本文不详细介绍各插件的细节,只展示使用方法,如果开发者对细节有兴趣可以参考 [API 文档](http://developer.egret.com/cn/github/egret-docs/Engine2D/cmdExtensionPlugin/api/index.html)。
+
+为了让开发者以更简单的使用Egret内置的插件,我们将通过一个案例来展示插件的具体使用方法和注意事项。**本文基于引擎5.2.7,低于该版本的引擎可能部分功能无效**
+
+本文案例从一个刚编写完成的[eui卡牌项目](http://bbs.egret.com/thread-50009-1-1.html)开始发布到微信小游戏,为了让代码包的**体积更小**,**更好管理**,逐步添加使用不同的插件,以实现不同的需求。[源文件下载地址](http://tool.egret-labs.org/DocZip/engine/plugin-egret-eui-demo2.zip)
+### todos
+
+* 使用UglifyPlugin将代码混淆压缩
+* 使用ResSplitPlugin把部分资源分离出去
+* 使用ZipPlugin把文件压缩成zip格式
+* 使用TextureMergerPlugin将纹理合并,且用ConvertResConfigFilePlugin修改res.json配置文件
+
+
+
+## 项目初始化
+
+1. 把index.html中的`data-scale-mode`改成`fixedWidth`
+2. 打开EgretLauncher,将本项目发布成微信小游戏
+3. 打开微信开发者工具
+
+
+
+## 使用UglifyPlugin压缩代码
+
+在微信开发者工具可以看到,js文件夹中5个库文件和一个`main.js`。
+
+现在需求是是要把库文件压缩到一个文件`lib.min.js`中。
+
+回到EgretWing,编辑sctipts下的config.wxgame.ts:
+
+```javascript
+//***其他代码***
+//
+
+if (command == 'build') {
+ return {
+ outputDir,
+ commands: [
+ // 清理js,resource文件夹
+ new CleanPlugin({ matchers: ["js", "resource"] }),
+ new CompilePlugin({ libraryType: "debug", defines: { DEBUG: true, RELEASE: false } }),
+ new ExmlPlugin('commonjs'), // 非 EUI 项目关闭此设置
+ new WxgamePlugin(),
+
+ // 压缩插件
+ new UglifyPlugin([
+ {
+ // 需要被压缩的文件
+ sources: [
+ "libs/modules/egret/egret.js",
+ "libs/modules/eui/eui.js",
+ "libs/modules/assetsmanager/assetsmanager.js",
+ "libs/modules/tween/tween.js",
+ ],
+ // 压缩后的文件
+ target: "lib.min.js"
+ }
+ ]),
+
+ new ManifestPlugin({ output: 'manifest.js' })
+ ]
+ }
+ }
+
+//
+// ***其他代码***
+```
+
+保存后在终端执行:
+
+```shell
+egret build
+```
+
+可以在微信开发者工具看到发布后的代码,js文件夹内的库文件已经被压缩到lib.min.js。
+
+但是报错,找不到eui,这是因为自动生成的`manifest.js`里面对js的引用顺序出错,需要优先引用lib.min.js
+
+打开根目录下的`manifest.js`, 修改一下引用顺序。
+
+```javascript
+require("js/lib.min.js")
+require("js/main.js")
+require("js/default.thm.js")
+```
+
+每次编译的时候`manifest.js`都会被重新生成,所以我们使用一个自定义脚本来修改他们的顺序
+
+打开 scripts下的myPlugin.ts :
+
+```typescript
+/**
+ * 示例自定义插件,您可以查阅 http://developer.egret.com/cn/2d/projectConfig/cmdExtensionPluginin/
+ * 了解如何开发一个自定义插件
+ */
+export class CustomPlugin implements plugins.Command {
+ private buffer
+ constructor() {
+ }
+
+ async onFile(file: plugins.File) {
+ // 保存manifest.js文件的内容
+ if(file.basename.indexOf('manifest.js') > -1) {
+ this.buffer = file.contents
+ }
+ return file;
+ }
+
+ async onFinish(commandContext: plugins.CommandContext) {
+ // 把'lib.min.js'移到第一位
+
+ if (this.buffer) {
+ let contents: string = this.buffer.toString()
+ let arr = contents.split('\n')
+ let lib
+ arr.forEach((item, index) => {
+ if (item.indexOf('lib.min.js') > -1) {
+ lib = item
+ arr.splice(index, 1)
+ }
+ })
+ if (lib != null) {
+ arr.unshift(lib)
+ }
+
+ let newCont = arr.join('\n')
+ commandContext.createFile('manifest.js', new Buffer(newCont))
+ }
+ }
+}
+```
+
+这个文件就是用来自定义插件的,在config.wxgame.ts中已经默认引用,所以只需要调用即可,注意调用顺序
+
+```typescript
+new ManifestPlugin({ output: 'manifest.js' }),
+// 在manifest.js生成之后调用
+new CustomPlugin()
+```
+
+
+
+
+
+## 使用ResSplitPlugin分离资源文件
+
+因为微信对代码包的大小是有限制的,总大小不能超过4M(使用分包功能可以提升到8M),所以我们需要通过ResSplitPlugin把某些游戏资源文件分离出去,将游戏资源放置在一个外部CDN服务器上,需要的时候动态加载即可。
+
+编辑config.wxgame.ts:
+
+```javascript
+// ***其他代码***
+//
+
+new ResSplitPlugin({
+ verbose: false, matchers:
+ [
+ // from 使用glob表达式来匹配文件, projectName就是项目的名字
+ { from: "resource/art/about/**.**", to: `${projectName}_wxgame_remote` },
+ { from: "resource/art/heros_goods/**.**", to: `${projectName}_wxgame_remote` }
+ ]
+})
+
+// ***其他代码***
+```
+
+保存后在终端执行:
+
+```shell
+egret build
+```
+
+微信开发者工具中resource > art 下的`about`和`heros_goods`已经不在了。
+
+被分离出去的在 Egret 项目根目录中 `egret-eui-demo_wxgame_remote` 文件夹内。
+
+
+
+* *注意 1:* 需要开发者自己写逻辑,判断一下如果是微信游戏时,哪些资源是从远程加载的,哪些是放在本地的
+* *注意 2:* 为了便于调试,我们把资源放在了 Egret 项目根目录中 `egret-eui-demo_wxgame_remote` 文件夹内,正式发布的一般放在 CDN 上
+
+
+
+## 使用ZipPlugin把文件压缩成zip格式
+
+为了减少加载次数和传输量,我们可以把文件压缩成zip格式,使用的时候可以使用第三方库JSZip来读取使用zip文件。
+
+使用ZipPlugin插件之前,需要安装cross-zip 和 cross-zip-cli , 在终端中输入:
+
+```shell
+//全局安装
+npm install cross-zip -g
+npm install cross-zip-cli -g
+```
+安装完成之后,在config.wxgame.ts添加代码:
+
+```typescript
+new ZipPlugin({
+ mergeSelector: p => {
+ // 如果文件是assets/路径下的, 压缩到assets.zip
+ if (p.indexOf("assets/") >= 0) {
+ return "assets.zip"
+ }
+ }
+})
+```
+
+项目中其实assets里面的资源都是没有用到的,这里我们用它来演示压缩插件的使用。
+
+保存后在终端执行:
+
+```shell
+egret build
+```
+
+执行之后可以在微信开发者工具看到,resource目录下原来的assets文件夹已经被压缩成了assets.zip。
+
+
+
+## 使用TextureMergerPlugin,ConvertResConfigFilePlugin合并纹理集
+
+项目中使用的图片资源都是单独的png文件,在加载的时候每张图片都会单独请求。我们可以通过合并纹理集的方式把这些图片合成一张图,以减少请求数量。
+使用插件之前,我们需要有纹理集的配置文件`tmpropject`, 可以用两种方式生成:
+
+1. 安装[TextureMerger工具](https://egret.com/downloads/texture.html)
+2. 执行脚本生成
+
+这里使用第二种方法,使用脚本autoMerger.js:
+
+```js
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var fs = require("fs");
+var path = require("path");
+var resjsons = ["resource/default.res.json"]; //要扫描的res.json文件
+var targetDir = "resource/TextureMerger"; //输出目录
+var pathNor = path.relative(targetDir, "resource"); //返回一个相对路径
+var tempindex = 0;
+//创建输出文件夹
+if (resjsons.length > 0) {
+ if (!fs.existsSync(targetDir)) {
+
+ // var paths = path.normalize(targetDir).split("\\"); //windows 下使用
+ var paths = path.normalize(targetDir).split("\/"); //mac linux 下使用
+
+ var target = ".";
+ for (var _i = 0, paths_1 = paths; _i < paths_1.length; _i++) {
+ var p = paths_1[_i];
+
+ // target += ("\\" + p); // windows 下使用
+ target += ("\/" + p); // mac linux 下使用
+
+ if (!fs.existsSync(target))
+ // 根据路径创建文件夹
+ fs.mkdirSync(target);
+ }
+ }
+}
+var _loop_1 = function (resJson) {
+ // 判断是否是res.json文件
+ if (fs.existsSync(resJson) && resJson.indexOf("res.json") > -1) {
+ var defaultJson = fs.readFileSync(resJson, "utf-8");
+ // 解析res.json文件内容
+ var defaultObject = JSON.parse(defaultJson);
+ var groups = defaultObject.groups; //组
+ var resources = defaultObject.resources; //资源
+ var resourcesHash_1 = {}; // 用来存放resources的资源信息
+
+ // 遍历resources
+ for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) {
+ var resource = resources_1[_i];
+ resourcesHash_1[resource.name] = resource.url;
+ }
+
+ // 遍历groups
+ for (var _a = 0, groups_1 = groups; _a < groups_1.length; _a++) {
+ var group = groups_1[_a];
+ var tmproject = {}; //用来存放tmproject文件的信息
+ // tmproject文件配置
+ tmproject["options"] = {
+ "layoutMath": "2",
+ "sizeMode": "2n",
+ "useExtension": 1,
+ "layoutGap": 1,
+ "extend": 0
+ };
+ // projectName
+ tmproject["projectName"] = group.name + "_" + tempindex;
+ // 版本
+ tmproject["version"] = 5;
+ tempindex++;
+
+ // 获取res.json分组的keys, 并分割成数组
+ var oldkeys = group.keys.split(",");
+ var oldkeysHash = {};
+ // 遍历oldkeys
+ for (var _b = 0, oldkeys_1 = oldkeys; _b < oldkeys_1.length; _b++) {
+ var key = oldkeys_1[_b];
+ // 保存到oldkeysHash对象中
+ oldkeysHash[key] = true;
+ }
+
+ var newKeys = [];
+ // 遍历oldkeys
+ for (var _c = 0, oldkeys_2 = oldkeys; _c < oldkeys_2.length; _c++) {
+ var key = oldkeys_2[_c];
+ if (key.indexOf("json") == -1) {
+ if (!oldkeysHash[key.replace("png", "json")]) { //粒子和龙骨对应的图集不合图
+ if (!oldkeysHash[key.replace("png", "fnt")]) //位图字体
+ newKeys.push(key);
+ }
+ else if (key.indexOf("jpg") > -1) {
+ newKeys.push(key);
+ }
+ }
+ }
+ oldkeysHash = {};
+ oldkeys = [];
+ // files路径
+ var urls = newKeys.map(function (key) {
+ return path.join(pathNor, resourcesHash_1[key]);
+ });
+ tmproject["files"] = urls;
+ // 根据tmproject写入文件
+ if (urls.length > 0) {
+ fs.writeFileSync(path.join(targetDir, tmproject["projectName"] + ".tmproject"), JSON.stringify(tmproject));
+ }
+ tmproject = {};
+ }
+ }
+};
+//根据数组开始扫描
+for (var _a = 0, resjsons_1 = resjsons; _a < resjsons_1.length; _a++) {
+ var resJson = resjsons_1[_a];
+ _loop_1(resJson);
+}
+
+
+```
+
+把这个脚本放在scripts文件夹内,这个脚本是根据项目的`default.res.json`文件的内容来生成`tmpropject`文件
+
+在终端中执行:
+
+```shell
+node scripts/autoMerger.js
+```
+执行成功之后可以在resource文件夹中看到多出了一个TextureMerger文件夹,里面就是根据`default.res.json`分组生成的`tmpropject`文件。
+
+现在只需要执行TextureMergerPlugin插件就可以自动合并,这里需要注意TextureMergerPlugin依赖 TextureMerger 1.7 以上的版本,如果不符合请自行安装,并且在运行时TextureMerger需要处于关闭状态。
+
+```typescript
+new TextureMergerPlugin({textureMergerRoot:[ 'resource']})
+```
+
+保存后在终端执行:
+
+```shell
+egret build
+```
+
+执行完成后,在微信开发者工具可以看到,resource > TextureMerger 内新增了三个png文件,就是合并之后的纹理集。游戏运行的时候只需要加载这三个纹理集就可以,无需加载那些单独的png文件但是需要去res.json里面配置,把单独的资源引用都删除,加上纹理集的引用。
+
+这些操作当然不需要手动去完成,现在只需要使用ConvertResConfigFilePlugin插件就可以实现这个功能。
+
+编辑config.wxgame.ts:
+
+```typescript
+new TextureMergerPlugin({textureMergerRoot:[ 'resource']})
+
+new ConvertResConfigFilePlugin({
+ resourceConfigFiles: [{ filename: "resource/default.res.json", root: "resource/" }],
+ nameSelector: (p) => {
+ return path.basename(p).split(".").join("_")
+ },
+ TM_Verbose: true
+})
+```
+
+保存后在终端执行:
+
+```shell
+egret build
+```
+
+在微信开发者工具中,打开调试器,在network面板可以看到加载的纹理集。
+
+这里有个注意事项,在游戏中点击英雄按钮,切换到英雄场景时,会发现列表里面的图片加载不出来。
+
+在network面板可以看到加载请求是单独的png文件,而不是纹理集。
+
+这是因为列表中的图片地址是直接使用url。
+
+```typescript
+// 原始数组
+let dataArr:any[] = [
+ {image: 'resource/art/heros_goods/heros01.png', name: '亚特伍德', value: '评价: 很特么厉害, 为所欲为', isSelected: false},
+ {image: 'resource/art/heros_goods/heros02.png', name: '亚特伍德', value: '评价: 很特么厉害, 为所欲为', isSelected: false},
+ {image: 'resource/art/heros_goods/heros03.png', name: '亚特伍德', value: '评价: 很特么厉害, 为所欲为', isSelected: true},
+ {image: 'resource/art/heros_goods/heros04.png', name: '亚特伍德', value: '评价: 很特么厉害, 为所欲为', isSelected: false},
+ {image: 'resource/art/heros_goods/heros05.png', name: '亚特伍德', value: '评价: 很特么厉害, 为所欲为', isSelected: false},
+ {image: 'resource/art/heros_goods/heros06.png', name: '亚特伍德', value: '评价: 很特么厉害, 为所欲为', isSelected: false},
+ {image: 'resource/art/heros_goods/heros07.png', name: '亚特伍德', value: '评价: 很特么厉害, 为所欲为', isSelected: false}
+]
+// 转成eui数据
+let euiArr:eui.ArrayCollection = new eui.ArrayCollection(dataArr)
+// 把list_hero数据源设置成euiArr
+this.list_hero.dataProvider = euiArr
+// 设置list_hero的项呈视器 (这里直接写类名,而不是写实例)
+this.list_hero.itemRenderer = heroList_item
+```
+
+这种引用方式的图片,需要开发者手动在代码中修改,将图片地址修改成纹理集中的图片。
+
+
+
+## 结语
+
+本文通过使用UglifyPlugin,ResSplitPlugin,ZipPlugin,TextureMergerPlugin,ConvertResConfigFilePlugin插件,使项目发布到微信小程序之后的代码包体积减小,用户发起的请求数变少,且将代码混淆压缩。
+
+使用Egret自带的插件,已经可以满足开发者的基本需求,如果有针对项目的特殊需求,可以选择[自定义插件](../../cmdExtensionPlugin/plugin/README.md)。
+
diff --git a/Engine2D/colorEffects/blendMode/README.md b/Engine2D/colorEffects/blendMode/README.md
new file mode 100644
index 0000000..2188f12
--- /dev/null
+++ b/Engine2D/colorEffects/blendMode/README.md
@@ -0,0 +1,48 @@
+
+混合模式是指同一个显示容器中的两个显示对象重叠时,重叠区域如何呈现的方式,也就是两个显示对象的重叠区域像素如何混合产生结果像素。
+
+## 1.覆盖混合
+
+### 说明
+
+覆盖混合,表示为"normal",该显示对象出现在背景前面。显示对象的像素值将覆盖背景的像素值。在显示对象为透明的区域,背景是可见的。
+
+### 设置
+通常不设置混合模式,默认就是覆盖混合。设置图片为覆盖模式的代码:
+```img.blendMode = egret.BlendMode.NORMAL;```
+
+### 效果
+使用覆盖混合的效果:
+
+![](normal.png)
+
+
+## 2.叠加混合
+
+### 说明
+
+叠加混合,表示为"add" :将显示对象的原色值添加到它的背景颜色中,上限值为 0xFF。此设置通常用于使两个对象间的加亮溶解产生动画效果。
+
+### 设置
+设置图片为覆盖模式的代码:
+```img.blendMode = egret.BlendMode.ADD;```
+
+### 效果
+使用叠加混合的效果:
+
+![](add.png)
+
+## 3.擦除混合
+
+### 说明
+擦除混合,表示为"erase" :根据显示对象的 Alpha 值擦除背景。即不透明区域将被完全擦除。
+
+### 设置
+设置图片为覆盖模式的代码:
+```img.blendMode = egret.BlendMode.ERASE;```
+
+### 效果
+使用擦除混合的效果:
+
+![](erase.png)
+
\ No newline at end of file
diff --git a/Engine2D/colorEffects/blendMode/add.png b/Engine2D/colorEffects/blendMode/add.png
new file mode 100644
index 0000000..7e04e3b
Binary files /dev/null and b/Engine2D/colorEffects/blendMode/add.png differ
diff --git a/Engine2D/colorEffects/blendMode/erase.png b/Engine2D/colorEffects/blendMode/erase.png
new file mode 100644
index 0000000..ca3189e
Binary files /dev/null and b/Engine2D/colorEffects/blendMode/erase.png differ
diff --git a/Engine2D/colorEffects/blendMode/normal.png b/Engine2D/colorEffects/blendMode/normal.png
new file mode 100644
index 0000000..c2a9ff4
Binary files /dev/null and b/Engine2D/colorEffects/blendMode/normal.png differ
diff --git a/Engine2D/colorEffects/filter/57398262999f1.png b/Engine2D/colorEffects/filter/57398262999f1.png
new file mode 100644
index 0000000..3f7fc8f
Binary files /dev/null and b/Engine2D/colorEffects/filter/57398262999f1.png differ
diff --git a/Engine2D/colorEffects/filter/57398262a82f2.png b/Engine2D/colorEffects/filter/57398262a82f2.png
new file mode 100644
index 0000000..9185a35
Binary files /dev/null and b/Engine2D/colorEffects/filter/57398262a82f2.png differ
diff --git a/Engine2D/colorEffects/filter/57398262b8b53.png b/Engine2D/colorEffects/filter/57398262b8b53.png
new file mode 100644
index 0000000..00c878f
Binary files /dev/null and b/Engine2D/colorEffects/filter/57398262b8b53.png differ
diff --git a/Engine2D/colorEffects/filter/57398262da6c7.png b/Engine2D/colorEffects/filter/57398262da6c7.png
new file mode 100644
index 0000000..3d5876b
Binary files /dev/null and b/Engine2D/colorEffects/filter/57398262da6c7.png differ
diff --git a/Engine2D/colorEffects/filter/5739826305543.png b/Engine2D/colorEffects/filter/5739826305543.png
new file mode 100644
index 0000000..d56c806
Binary files /dev/null and b/Engine2D/colorEffects/filter/5739826305543.png differ
diff --git a/Engine2D/colorEffects/filter/5739826314d12.png b/Engine2D/colorEffects/filter/5739826314d12.png
new file mode 100644
index 0000000..287df3d
Binary files /dev/null and b/Engine2D/colorEffects/filter/5739826314d12.png differ
diff --git a/Engine2D/colorEffects/filter/5739826334769.png b/Engine2D/colorEffects/filter/5739826334769.png
new file mode 100644
index 0000000..642a15a
Binary files /dev/null and b/Engine2D/colorEffects/filter/5739826334769.png differ
diff --git a/Engine2D/colorEffects/filter/57398263469d8.png b/Engine2D/colorEffects/filter/57398263469d8.png
new file mode 100644
index 0000000..20c99d7
Binary files /dev/null and b/Engine2D/colorEffects/filter/57398263469d8.png differ
diff --git a/Engine2D/colorEffects/filter/README.md b/Engine2D/colorEffects/filter/README.md
new file mode 100644
index 0000000..c7ea74d
--- /dev/null
+++ b/Engine2D/colorEffects/filter/README.md
@@ -0,0 +1,250 @@
+## 1.发光滤镜
+
+### 1.1.说明
+使用 `GlowFilter` 类可以对显示对象应用发光效果。发光样式的选项包括内侧发光、外侧发光以及挖空模式。
+这里创建一个函数用来对传入的显示对象用给定的参数进行发光滤镜处理。
+在接下的示例代码中,要传给滤镜的参数,将首先以局部变量的方式定义,并把每个参数的含义在注释部分进行说明。然后将这些参数填充到滤镜的构造函数相应位置。注意,为了结构清晰便于理解代码,所定义的局部变量与滤镜的构造函数参数将一一对应,并且顺序也是完全一致的。
+
+### 1.2.设置
+白鹭小鸟在程序中用一张位图表示:
+```var img:egret.Bitmap;```
+
+创建滤镜:
+
+``` javascript
+var color:number = 0x33CCFF; /// 光晕的颜色,十六进制,不包含透明度
+var alpha:number = 0.8; /// 光晕的颜色透明度,是对 color 参数的透明度设定。有效值为 0.0 到 1.0。例如,0.8 设置透明度值为 80%。
+var blurX:number = 35; /// 水平模糊量。有效值为 0 到 255.0(浮点)
+var blurY:number = 35; /// 垂直模糊量。有效值为 0 到 255.0(浮点)
+var strength:number = 2; /// 压印的强度,值越大,压印的颜色越深,而且发光与背景之间的对比度也越强。有效值为 0 到 255。暂未实现
+var quality:number = egret.BitmapFilterQuality.HIGH; /// 应用滤镜的次数,建议用 BitmapFilterQuality 类的常量来体现
+var inner:boolean = false; /// 指定发光是否为内侧发光,暂未实现
+var knockout:boolean = false; /// 指定对象是否具有挖空效果,暂未实现
+
+var glowFilter:egret.GlowFilter = new egret.GlowFilter( color, alpha, blurX, blurY,
+ strength, quality, inner, knockout );
+```
+
+最后对位图对象应用发光滤镜:
+``` javascript
+img.filters = [ glowFilter ];
+```
+
+### 1.3.效果
+如图是使用滤镜前后的效果对比:
+![egret-bird-filter-no][] ![egret-bird-filter-glow][]
+
+[egret-bird-filter-no]: egret-bird-filter-no.png
+[egret-bird-filter-glow]: egret-bird-filter-glow.png
+
+## 2.颜色矩阵滤镜
+
+### 2.1.说明
+ColorMatrixFilter--颜色矩阵滤镜(egret.ColorMatrixFilter) 在颗粒等级上提供更好的控制显示对象的颜色转换方式。ColorMatrixFilter为 4行5列的多维矩阵(20个元素的数组)。下图为等效的矩阵。
+
+ ![](57398262999f1.png)
+
+
+### 2.2.设置
+
+下面是一个图片灰度化的示例。首先准备一张图片:
+
+ ![](57398263469d8.png)
+
+然后通过下面颜色转换矩阵代码添加一个“灰度化”的效果:
+
+```javascript
+var hero:egret.Bitmap = new egret.Bitmap();
+hero.texture = RES.getRes("hero_png");
+this.addChild(hero);
+//颜色矩阵数组
+var colorMatrix = [
+ 0.3,0.6,0,0,0,
+ 0.3,0.6,0,0,0,
+ 0.3,0.6,0,0,0,
+ 0,0,0,1,0
+];
+
+var colorFlilter = new egret.ColorMatrixFilter(colorMatrix);
+hero.filters = [colorFlilter];
+```
+
+在上述示例中,首先新建了一个显示对象,然后新建了一个颜色转换矩阵 `ColorMatrixFilter`,并通过显示对象的 `filters` 属性来设置滤镜。显示对象的 `filters` 属性包含当前与显示对象关联的每个滤镜对象的索引数组。
+
+实现效果的关键是颜色转换矩阵的设置。上面我们将每个颜色通道都乘相同的系数来实现灰度效果。
+
+### 2.3.效果
+
+ ![](5739826334769.png)
+
+> 通过 ColorMatrixFilter 的 matrix 属性可以设置颜色矩阵。需要注意的是不能直接通过 `colorFlilter.matrix[4] = 100;` 这样的方式直接修改颜色矩阵。只能通过获得数组的引用然后修改,最后重置矩阵:
+
+```javascript
+//获得数组。
+var test = colorFlilter.matrix;
+//修改数组中的值。
+test[4] = 100;
+//重置矩阵。
+colorFlilter.matrix = test;
+```
+
+### 2.4.矩阵数据说明
+
+在上面例子中我们实现了灰度图的效果,下面介绍颜色矩阵的含义:
+
+![](57398262999f1.png)
+
+实际的颜色值由下面的公式决定:
+
+``` javascript
+redResult = (a[0] * srcR) + (a[1] * srcG) + (a[2] * srcB) + (a[3] * srcA) + a[4];
+greenResult = (a[5] * srcR) + (a[6] * srcG) + (a[7] * srcB) + (a[8] * srcA) + a[9];
+blueResult = (a[10] * srcR) + (a[11] * srcG) + (a[12] * srcB) + (a[13] * srcA) + a[14];
+alphaResult = (a[15] * srcR) + (a[16] * srcG) + (a[17] * srcB) + (a[18] * srcA) + a[19];
+```
+
+公式中 srcR、srcG、srcB、srcA 表示原始显示对象的像素值, a 是颜色矩阵。新的红绿蓝和alpha通道实际由颜色矩阵和原始图片的像素值同时决定。颜色矩阵中的 Off 可以直接设置偏移量加上相应的 R G B A 的值的乘积即为最终的颜色值。所以与原来完全相同的矩阵转换应该是下面这样的:
+
+```javascript
+var colorMatrix = [
+ 1,0,0,0,0,
+ 0,1,0,0,0,
+ 0,0,1,0,0,
+ 0,0,0,1,0
+];
+```
+
+下面是几个颜色矩阵设置示例:
+
+#### 设置红色偏移量
+
+在颜色矩阵中直接设置每一行中最后一个值即可设置偏移量,直接设置红色通道的偏移量,结果整张图片变红。
+
+```javascript
+var colorMatrix = [
+ 1,0,0,0,100,
+ 0,1,0,0,0,
+ 0,0,1,0,0,
+ 0,0,0,1,0
+];
+```
+
+修改代码中的颜色矩阵数组,编译运行得到如下效果图:
+
+![](57398262a82f2.png)
+
+> 需要注意的 R G B 通道对应的偏移量的值应该为 -255 ~ 255,Alpha 通道对应的偏移量取值范围为 -255 ~ 255.应避免传入除数字外其他类型的值,比如字符串等。
+
+#### 绿色加倍
+
+如果想使绿色通道加倍,colorMatrix[6] 加倍即可:
+
+```javascript
+var colorMatrix = [
+ 1,0,0,0,0,
+ 0,2,0,0,0,
+ 0,0,1,0,0,
+ 0,0,0,1,0
+];
+```
+
+![](57398262b8b53.png)
+
+#### 红色决定蓝色值
+
+如果要使结果图像中的蓝色与原图的红色数量相等,将colorMatrix[10]设为1, colorMatrix[12]设为0 ,即结果的蓝色值完全由原始的红色值决定:
+
+```javascript
+var colorMatrix = [
+ 1,0,0,0,0,
+ 0,1,0,0,0,
+ 1,0,0,0,0,
+ 0,0,0,1,0
+];
+```
+
+![](5739826305543.png)
+
+#### 增加亮度
+
+增加亮度的最简单途径是给每个颜色值添加相同的偏移量。
+
+```javascript
+var colorMatrix = [
+ 1,0,0,0,100,
+ 0,1,0,0,100,
+ 0,0,1,0,100,
+ 0,0,0,1,0
+];
+```
+
+![](57398262da6c7.png)
+
+
+通过"颜色矩阵滤镜"可以完成除了亮度和灰度之外复杂的颜色调整,如调整对比度,饱和度和色相等。
+
+
+## 3.模糊滤镜
+### 3.1.设置
+在 Egret 中,通过 `BlurFilter` 类设置模糊滤镜。
+
+```javascript
+var hero:egret.Bitmap = new egret.Bitmap();
+hero.texture = RES.getRes("hero_png");
+this.addChild(hero);
+
+var blurFliter = new egret.BlurFilter( 1 , 1);
+hero.filters = [blurFliter];
+```
+
+和颜色转换矩阵类似,实例化一个 `BlurFilter` 并将其保存到显示对象的 `filters` 属性中即可。其中实例化 `BlurFilter` 有两个参数,即为 x 、y 方向的模糊度。
+值越大效果越模糊。
+
+### 3.2.效果
+![](5739826314d12.png)
+
+> 需要注意的是模糊滤镜对性能的消耗比较大,应谨慎使用。普通显示对象可以开启 `cacheAsBitmap` 提高一些性能。
+
+> 显示对象的 `filters` 属性可以保存多个滤镜效果,比如同时使用` hero.filters = [blurFliter,colorFlilter];` 模糊和颜色矩阵滤镜效果。多个效果同时生效。
+
+## 4.投影滤镜
+
+### 4.1.说明
+阴影算法基于模糊滤镜使用同一个框型滤镜。投影样式有多个选项,包括内侧或外侧阴影和挖空模式。
+
+### 4.2.设置
+白鹭小鸟在程序中用一张位图表示:
+```var img:egret.Bitmap;```
+
+创建滤镜,在定义局部变量时,对每一个参数的含义在注释部分进行简要的说明:
+
+
+``` javascript
+var distance:number = 6; /// 阴影的偏移距离,以像素为单位
+var angle:number = 45; /// 阴影的角度,0 到 360 度
+var color:number = 0x000000; /// 阴影的颜色,不包含透明度
+var alpha:number = 0.7; /// 光晕的颜色透明度,是对 color 参数的透明度设定
+var blurX:number = 16; /// 水平模糊量。有效值为 0 到 255.0(浮点)
+var blurY:number = 16; /// 垂直模糊量。有效值为 0 到 255.0(浮点)
+var strength:number = 0.65; /// 压印的强度,值越大,压印的颜色越深,而且阴影与背景之间的对比度也越强。有效值为 0 到 255。暂未实现
+var quality:number = egret.BitmapFilterQuality.LOW; /// 应用滤镜的次数,暂无实现
+var inner:boolean = false; /// 指定发光是否为内侧发光
+var knockout:boolean = false; /// 指定对象是否具有挖空效果
+
+var dropShadowFilter:egret.DropShadowFilter = new egret.DropShadowFilter( distance, angle, color, alpha, blurX, blurY,
+ strength, quality, inner, knockout );
+```
+
+最后对位图对象应用投影滤镜:
+``` javascript
+img.filters = [ dropShadowFilter ];
+```
+
+### 4.3.效果
+下图是使用滤镜前后的效果对比:
+![egret-bird-filter-no][] ![egret-bird-filter-shadow][]
+
+对比发光滤镜,可以看到投影滤镜的构造函数正好比发光滤镜多出前两个参数:`distance` 和 `angle` 。在投影滤镜的 `distance` 和 `angle` 属性设置为 0 时,投影滤镜与发光滤镜极为相似。
+
+[egret-bird-filter-no]: egret-bird-filter-no.png
+[egret-bird-filter-shadow]: egret-bird-filter-shadow.png
diff --git a/Engine2D/colorEffects/filter/egret-bird-filter-glow.png b/Engine2D/colorEffects/filter/egret-bird-filter-glow.png
new file mode 100644
index 0000000..aa2266a
Binary files /dev/null and b/Engine2D/colorEffects/filter/egret-bird-filter-glow.png differ
diff --git a/Engine2D/colorEffects/filter/egret-bird-filter-no.png b/Engine2D/colorEffects/filter/egret-bird-filter-no.png
new file mode 100644
index 0000000..5304ed0
Binary files /dev/null and b/Engine2D/colorEffects/filter/egret-bird-filter-no.png differ
diff --git a/Engine2D/colorEffects/filter/egret-bird-filter-shadow.png b/Engine2D/colorEffects/filter/egret-bird-filter-shadow.png
new file mode 100644
index 0000000..3beca67
Binary files /dev/null and b/Engine2D/colorEffects/filter/egret-bird-filter-shadow.png differ
diff --git a/Engine2D/colorEffects/shader/README.md b/Engine2D/colorEffects/shader/README.md
new file mode 100644
index 0000000..ac139a2
--- /dev/null
+++ b/Engine2D/colorEffects/shader/README.md
@@ -0,0 +1,95 @@
+
+### 1.使用说明
+
+egret 5.0.3 以上版本中提供了 `egret.CustomFilter` ,供开发者自由扩展滤镜,实现各种定制化效果。
+> 该功能仅在web和微端环境下支持
+
+
+`CustomFilter` 构造函数中需要传入顶点着色器和片段着色器程序的字符串,以及 `uniforms` 对象
+
+* 开发者可以根据项目需求自行编写顶点着色器和片段着色器程序
+
+* 顶点着色器中`aVertexPosition`,`aTextureCoord`,`aColor`,`projectionVector`属性由引擎传入
+
+* 引擎渲染之前会将 `uniforms` 对象的属性上传到着色器中,开发者可以每帧改变 `uniforms` 对象的属性达到实现不同效果的需求。该属性目前只支持数字和数组
+
+* `egret.CustomFilter` 同时提供了 `padding` 属性,该属性为滤镜的内边距,如果自定义滤镜所需区域比原区域大(如引擎提供的描边滤镜),需要手动设置该属性。该属性以像素为单位
+
+更详细的使用方法请参考[API文档](http://developer.egret.com/cn/apidoc/index/name/egret.CustomFilter#methodSummary)。
+
+### 2.实战教程
+
+下面示例实现一个黑白方块背景的效果,首先创建一个game项目,之后在Main.ts中createGameScene函数最后插入顶点着色器代码:
+
+```javascript
+let vertexSrc =
+ "attribute vec2 aVertexPosition;\n" +
+ "attribute vec2 aTextureCoord;\n" +
+ "attribute vec2 aColor;\n" +
+
+ "uniform vec2 projectionVector;\n" +
+
+ "varying vec2 vTextureCoord;\n" +
+
+ "const vec2 center = vec2(-1.0, 1.0);\n" +
+
+ "void main(void) {\n" +
+ " gl_Position = vec4( (aVertexPosition / projectionVector) + center , 0.0, 1.0);\n" +
+ " vTextureCoord = aTextureCoord;\n" +
+ "}";
+```
+
+在之后插入片段着色器代码:
+
+```javascript
+let fragmentSrc =
+ "precision lowp float;\n" +
+
+ "varying vec2 vTextureCoord;\n" +
+
+ "uniform float width;\n" +
+ "uniform float height;\n" +
+
+ "void main(void) {\n" +
+ "vec4 fg;\n" +
+ "if(mod(floor(vTextureCoord.x / width) + floor(vTextureCoord.y / height), 2.0) == 0.0) {" +
+ "fg = vec4(1,1,1,1);" +
+ "}" +
+ "else {" +
+ "fg = vec4(0,0,0,1);" +
+ "}" +
+ "gl_FragColor = fg;\n" +
+ "}";
+```
+在代码中定义了每个方格的宽高,这两个值由`uniforms`属性传入。之后根据uv信息以及传入的宽高,利用取余函数算出奇偶数,通过奇偶决定方格是黑色还是白色。
+
+对背景图使用自定义滤镜,设定每个方格大小为50像素:
+
+```javascript
+let size = 50;
+let filter = new egret.CustomFilter(vertexSrc, fragmentSrc, { width: size / stageW, height: size / stageH });
+sky.filters = [filter];
+```
+
+运行效果如下图,发现背景图变成了黑白交替的方格,每个方格大小为50像素。
+
+![](heibai.png)
+
+之后再通过帧函数改变方格大小(uniforms属性):
+
+```javascript
+let inc = 1;
+this.stage.addEventListener(egret.Event.ENTER_FRAME, function () {
+ size += inc;
+ if (size >= 80) {
+ inc = -1;
+ }
+ if (size <= 50) {
+ inc = 1;
+ }
+ filter.uniforms.width = size / stageW;
+ filter.uniforms.height = size / stageH;
+}, this);
+```
+
+再次运行游戏,会发现每帧方格的大小都会相应变化
diff --git a/Engine2D/colorEffects/shader/heibai.png b/Engine2D/colorEffects/shader/heibai.png
new file mode 100644
index 0000000..acc8ca9
Binary files /dev/null and b/Engine2D/colorEffects/shader/heibai.png differ
diff --git a/Engine2D/colorEffects/tint/README.md b/Engine2D/colorEffects/tint/README.md
new file mode 100644
index 0000000..2879763
--- /dev/null
+++ b/Engine2D/colorEffects/tint/README.md
@@ -0,0 +1,34 @@
+
+从 Egret 5.2.24 版本开始,`DisplayObject` 中新增加了一个 `tint` 属性,可以给当前对象设置填充色.
+
+**注意:该功能还处于测试阶段,可以用于游戏调试,正式版本请谨慎使用。**
+
+下面是一个示例,给图片加上不同的填充色。
+
+```javascript
+let texture: egret.Texture = RES.getRes('bird_png');
+
+let b1 = new egret.Bitmap();
+b1.texture = texture;
+this.addChild(b1)
+
+let b2 = new egret.Bitmap();
+b2.texture = texture;
+b2.tint = 0xff0000
+b2.x = 150;
+this.addChild(b2)
+
+let b3 = new egret.Bitmap();
+b3.texture = texture;
+b3.tint = 0x00ff00
+b3.x = 300;
+this.addChild(b3)
+
+let b4 = new egret.Bitmap();
+b4.texture = texture;
+b4.tint = 0x4169E1
+b4.x = 450;
+this.addChild(b4)
+```
+
+![](./p1.png)
diff --git a/Engine2D/colorEffects/tint/p1.png b/Engine2D/colorEffects/tint/p1.png
new file mode 100644
index 0000000..ea2e84d
Binary files /dev/null and b/Engine2D/colorEffects/tint/p1.png differ
diff --git a/Engine2D/debug/debug/README.md b/Engine2D/debug/debug/README.md
new file mode 100644
index 0000000..b00a5e1
--- /dev/null
+++ b/Engine2D/debug/debug/README.md
@@ -0,0 +1,79 @@
+
+## 1.使用 DEBUG 编译参数
+开发者经常写一些希望仅在开发阶段使用的代码,来进行数据校验、输出日志等。
+
+Egret 提供了 `DEBUG` 这一全局变量来实现这样的功能。
+
+下面的代码校验 `value` 是不是由4个数字组成,如果不是,输出指定的错误信息。
+
+```javascript
+ if (DEBUG) {
+ var rect = value.split(",");
+ if (rect.length != 4 || isNaN(parseInt(rect[0])) || isNaN(parseInt(rect[1])) ||
+ isNaN(parseInt(rect[2])) || isNaN(parseInt(rect[3]))) {
+ egret.$error(2016, this.currentClassName, toXMLString(node));
+ }
+ }
+```
+
+在发行版生成过程中,Egret 命令行会移除 `if(DEBUG){ ... }` 这一整个代码块,保持发行版包体的精简。
+
+Egret 还提供了另外一个与 `DEBUG` 对应的编译参数 `RELEASE`,用来编写只在发行版中运行的代码。
+
+
+## 2.使用内置日志输出面板
+
+在PC端可使用 `console` 提供的诸多方法输出日志,然后使用浏览器提供的开发者工具查看。
+
+但是在移动端这个方式受到了限制,大多数移动端浏览器没有查看日志的方法。
+因此 Egret 集成了向屏幕输出日志的功能,以方便移动设备调试。
+
+![显示日志](p1.png)
+
+在 index.html 文件中有如下代码块:
+
+```css
+
+
+```
+
+通过 data-show-log: 设置是否在屏幕中显示日志。 true 显示,false 不显示。
+
+在代码中可以直接调用 `egret.log(message?:any, ...optionalParams:any[])` 来输出日志。
+
+data-show-fps-style 可以设置日志的位置,文字大小和背景颜色
+
+## 3.显示帧频信息
+
+`data-show-fps="true/false"` 设置是否显示帧频信息,当这个值为 `true` 时 Egret 会在舞台的左上角显示 FPS 和 其他性能指标
+
+* FPS: 60 - 帧频
+
+* Draw: 13 - 每帧 draw 方法调用的平均次数
+
+* Cost: 0,0 - 1)Ticker 和 EnterFrame 阶段显示的耗时; 2)绘制显示对象耗时(单位是ms)
+
+**注:** 5.2 之前的版本 Cost 有3个值,分别为:1)Ticker 和 EnterFrame 阶段显示的耗时; 2)每帧舞台所有事件处理和矩阵运算耗时; 3)绘制显示对象耗时(单位是ms)
+
+## 4.动态隐藏和显示信息面板
+在游戏页面,FPS 面板和调试信息面板是在同一个 `div` 标签里。在引擎 `5.2.23` 版本之后,该 `div` 标签增加了`id`值 `egret-fps-panel`,
+当您在 `index.html` 里开启信息面板后,
+`data-show-fps="true" data-show-log="true"`。可以通过代码动态隐藏和显示这个面板。**注意** 该功能只有在 pc 的浏览器中才有效。
+
+```css
+//隐藏面板
+document.getElementById('egret-fps-panel').style.visibility ="hidden";
+//显示面板
+document.getElementById('egret-fps-panel').style.visibility ="visible";
+```
+
+
\ No newline at end of file
diff --git a/Engine2D/debug/debug/p1.png b/Engine2D/debug/debug/p1.png
new file mode 100644
index 0000000..6df8d12
Binary files /dev/null and b/Engine2D/debug/debug/p1.png differ
diff --git a/Engine2D/displayObjecContainer/addAndRemove/5668e2533b617.png b/Engine2D/displayObjecContainer/addAndRemove/5668e2533b617.png
new file mode 100644
index 0000000..2dea467
Binary files /dev/null and b/Engine2D/displayObjecContainer/addAndRemove/5668e2533b617.png differ
diff --git a/Engine2D/displayObjecContainer/addAndRemove/5668e25358e2b.png b/Engine2D/displayObjecContainer/addAndRemove/5668e25358e2b.png
new file mode 100644
index 0000000..12ca10a
Binary files /dev/null and b/Engine2D/displayObjecContainer/addAndRemove/5668e25358e2b.png differ
diff --git a/Engine2D/displayObjecContainer/addAndRemove/5668e25372b48.png b/Engine2D/displayObjecContainer/addAndRemove/5668e25372b48.png
new file mode 100644
index 0000000..c483c2b
Binary files /dev/null and b/Engine2D/displayObjecContainer/addAndRemove/5668e25372b48.png differ
diff --git a/Engine2D/displayObjecContainer/addAndRemove/5668e2537f781.png b/Engine2D/displayObjecContainer/addAndRemove/5668e2537f781.png
new file mode 100644
index 0000000..0dc42ec
Binary files /dev/null and b/Engine2D/displayObjecContainer/addAndRemove/5668e2537f781.png differ
diff --git a/Engine2D/displayObjecContainer/addAndRemove/5668e253912b4.png b/Engine2D/displayObjecContainer/addAndRemove/5668e253912b4.png
new file mode 100644
index 0000000..176fae2
Binary files /dev/null and b/Engine2D/displayObjecContainer/addAndRemove/5668e253912b4.png differ
diff --git a/Engine2D/displayObjecContainer/addAndRemove/5668e253a0fc6.png b/Engine2D/displayObjecContainer/addAndRemove/5668e253a0fc6.png
new file mode 100644
index 0000000..b72b0c6
Binary files /dev/null and b/Engine2D/displayObjecContainer/addAndRemove/5668e253a0fc6.png differ
diff --git a/Engine2D/displayObjecContainer/addAndRemove/README.md b/Engine2D/displayObjecContainer/addAndRemove/README.md
new file mode 100644
index 0000000..00dcc46
--- /dev/null
+++ b/Engine2D/displayObjecContainer/addAndRemove/README.md
@@ -0,0 +1,165 @@
+在Egret中建立显示对象和渲染显示对象是两个过程。建立显示对象后,对象会处于内存中,但不会参与渲染过程,只有把显示对象放到显示列表后,显示对象才会参与渲染过程。如果想将某个显示对象从渲染过程中删除,只需要将其移除显示列表即可。
+
+## 添加显示对象到显示列表
+
+当创建一个显示对象后,就可以将其添加到显示列表中,首先我们绘制一个Sprite,这个Sprite是一个宽高为100的绿色正方形。
+
+```
+var spr:egret.Sprite = new egret.Sprite();
+spr.graphics.beginFill( 0x00ff00 );
+spr.graphics.drawRect(0, 0, 100, 100);
+spr.graphics.endFill();
+```
+
+上面的代码就是我们所说的建立显示对象的过程,这一步完成后我们可以测试一下程序,在舞台中看不到任何内容。接下来我们将 spr 添加到显示列表中。
+
+```
+this.addChild( spr );
+```
+
+添加这句代码之后,我们再次编译运行程序,此时你可以在浏览器中看到效果如图:
+
+![](5668e2533b617.png)
+
+代码中 `addChild` 就是将 `spr` 添加到显示列表中。我们前面介绍过,显示列表是一个树状结构,这里 `spr` 的上一级就是 `this`,也就是我们的文档类。文档类是 `stage` 舞台的第一个子对象。
+
+下面是关于当前示例的层级示意图:
+
+![](5668e25358e2b.png)
+
+## 删除显示对象
+
+上面我们介绍了如何添加一个显示对象到显示列表中,下面来介绍一下如何将显示对象从显示列表中删除。
+
+执行删除的函数非常简单,使用 `removeChild` 方法即可删除一个显示对象。
+
+```
+this.removeChild( spr );
+```
+
+执行删除操作与添加显示对象操作类似,我们将被删除的显示对象作为参数传递给 `removeChild` 方法。示例中 `spr` 就是被删除的显示对象,而 `this` 则是 `spr` 的父级。
+
+## 显示对象操作的注意点
+
+### 显示对象独立于显示列表
+
+虽然我们的显示对象在运行时会被高频率的添加删除到显示列表,但显示对象独立于显示列表。简单解释一下,当我们创建一个显示对象Sprite时,该对象拥有自己的坐标属性,旋转角度属性等。这些属性都是显示对象独立拥有的。一旦该显示对象被键入到显示列表之中,Egret就会按照显示对象的状态进行显示。
+
+当用户将显示对象从显示列表中移除后,这些状态依然存在。将一个显示对象移除显示列表后,该对象并非在内存中被销毁。我们只是不让显示对象参与渲染而已。
+
+我们来通过一段代码来观察一下显示对象在容器中的操作与状态改变。
+
+```
+//创建了一个类型为Sprite的显示对象
+var spr:egret.Sprite = new egret.Sprite();
+spr.graphics.beginFill( 0x00ff00 );
+spr.graphics.drawRect(0, 0, 100, 100);
+spr.graphics.endFill();
+//该对象存在,被添加到显示列表中,在画面中显示
+this.addChild( spr );
+//该对象存在,但已被移除显示列表,画面上不显示
+this.removeChild( spr );
+//该对象存在,驻于内存中
+```
+
+### 相对坐标系
+
+显示对象的坐标系是相对坐标系,而非绝对坐标系。
+
+当我们将一个显示对象的x,y坐标值均设置为100的时候,该坐标值表示,当前显示对象居于父级原点100,100的位置。我们通过下面一个实例来看一下具体区别。
+
+首先我们建立两个容器,为了能够方便的看清效果,我们将两个容器的宽高都设置为100*100,同时将两个容器分别设置为红色和绿色。
+
+绿色的容器x轴设置为120像素。
+
+红色的容器y轴设置为130像素
+
+将两个容器都添加到显示列表中,他们的父级都是文档类。下面是示例代码:
+
+```
+var sprcon1:egret.Sprite = new egret.Sprite();
+sprcon1.graphics.beginFill( 0x00ff00 );
+sprcon1.graphics.drawRect(0, 0, 100, 100);
+sprcon1.graphics.endFill();
+this.addChild( sprcon1 );
+sprcon1.x = 120;
+
+var sprcon2:egret.Sprite = new egret.Sprite();
+sprcon2.graphics.beginFill( 0xff0000 );
+sprcon2.graphics.drawRect(0, 0, 100, 100);
+sprcon2.graphics.endFill();
+this.addChild( sprcon2 );
+sprcon2.y = 130;
+```
+
+此时运行后的效果如下:
+
+![](5668e25372b48.png)
+
+然后我们绘制一个宽高为50的蓝色正方形,我们将这个正方形的x轴和y轴都设置为10像素。下面我们分别将这个蓝色的正方形添加到不同的容器中,以便查看效果。
+
+创建并绘制一个蓝色正方形的代码:
+
+```
+var spr:egret.Sprite = new egret.Sprite();
+spr.graphics.beginFill( 0x0000ff );
+spr.graphics.drawRect( 0, 0, 50, 50 );
+spr.graphics.endFill();
+spr.x = 10;
+spr.y = 10
+```
+
+添加到文档类的显示容器中:
+
+```
+this.addChild( spr );
+```
+
+运行效果:
+
+![](5668e2537f781.png)
+
+添加到sprcon1绿色容器中:
+
+```
+sprcon1.addChild( spr );
+```
+
+运行效果:
+
+![](5668e253912b4.png)
+
+添加到sprcon2红色容器中:
+
+```
+sprcon2.addChild( spr );
+```
+
+运行效果:
+
+![](5668e253a0fc6.png)
+
+### 多次添加显示对象到显示列表
+
+同一个显示对象无论被代码加入显示列表多少次,在屏幕上只绘制一次。
+
+如果一个显示对象A被添加到了B这个容器中,然后A又被添加到了C容器中。那么在第二次执行 C.addChild(A) 的时候,A自动的从B容器中被删除,然后添加到C容器中。
+
+### 删除操作的注意点
+
+当我们想要删除一个显示对象的时候需要执行的操作是:
+
+`容器对象.removeChild( 显示对象 );`
+
+但执行这个删除操作,我们的“显示对象”必须拥有父级。换句话说,被删除的显示对象必须存在于容器对象当中。
+
+如果当前删除显示对象不在容器对象之中,那么在JavaScript控制台中你将看见报错信息:`Uncaught Error: [Fatal]child未被addChild到该parent:`
+
+避免这种问题的处理方法非常简单,就是当你每次removeChild之前,你都对即将要被删除的显示对象做一次判断,判断它是否拥有父级。判断的代码如下:
+
+```
+if( spr.parent ) {
+ spr.parent.removeChild( spr );
+}
+```
+
diff --git a/Engine2D/displayObjecContainer/childen/566143a3d8886.jpg b/Engine2D/displayObjecContainer/childen/566143a3d8886.jpg
new file mode 100644
index 0000000..5456031
Binary files /dev/null and b/Engine2D/displayObjecContainer/childen/566143a3d8886.jpg differ
diff --git a/Engine2D/displayObjecContainer/childen/566143a4018b9.jpg b/Engine2D/displayObjecContainer/childen/566143a4018b9.jpg
new file mode 100644
index 0000000..5456031
Binary files /dev/null and b/Engine2D/displayObjecContainer/childen/566143a4018b9.jpg differ
diff --git a/Engine2D/displayObjecContainer/childen/README.md b/Engine2D/displayObjecContainer/childen/README.md
new file mode 100644
index 0000000..7f69d12
--- /dev/null
+++ b/Engine2D/displayObjecContainer/childen/README.md
@@ -0,0 +1,83 @@
+想要获取一个容器的子对象,我们有两种方式可以选择,第一种是通过子对象的深度值来获取子对象,第二种是通过子对象的 name 属性来获取。
+
+## 通过深度获取
+
+通过深度值获取子对象可以使用 `getChildAt` 方法,具体使用方式如下:
+
+`容器.getChildAt( 深度值 );`
+
+我们来看一段示例代码,这段代码中我们向一个容器中存放了两个方块,通过深度来获取其中一个方块,并调整他的透明度。
+
+```
+var sprcon:egret.Sprite = new egret.Sprite();
+this.addChild( sprcon );
+sprcon.x = 10;
+
+var spr1:egret.Sprite = new egret.Sprite();
+spr1.graphics.beginFill( 0xff0000 );
+spr1.graphics.drawRect( 0, 0, 100, 100 );
+spr1.graphics.endFill();
+spr1.x = 50;
+spr1.name = "sprite1";
+sprcon.addChild( spr1 );
+
+var spr2:egret.Sprite = new egret.Sprite();
+spr2.graphics.beginFill( 0x00ff00 );
+spr2.graphics.drawRect( 0, 0, 100, 100 );
+spr2.graphics.endFill();
+spr2.x = 100;
+spr2.y = 50;
+spr2.name = "sprite2";
+sprcon.addChild( spr2 );
+
+var _spr:egret.DisplayObject = sprcon.getChildAt( 1 );
+_spr.alpha = 0.5;
+```
+
+编译并运行代码,效果如图:
+
+![](566143a3d8886.jpg)
+
+## 通过 Name 获取
+
+第二种方式是通过显示对象的 `name` 属性来获取,这种方式更加直接简单。我们来看一下示例代码:
+
+```
+var sprcon:egret.Sprite = new egret.Sprite();
+this.addChild( sprcon );
+sprcon.x = 10;
+
+var spr1:egret.Sprite = new egret.Sprite();
+spr1.graphics.beginFill( 0xff0000 );
+spr1.graphics.drawRect( 0, 0, 100, 100 );
+spr1.graphics.endFill();
+spr1.x = 50;
+spr1.name = "sprite1";
+sprcon.addChild( spr1 );
+
+var spr2:egret.Sprite = new egret.Sprite();
+spr2.graphics.beginFill( 0x00ff00 );
+spr2.graphics.drawRect( 0, 0, 100, 100 );
+spr2.graphics.endFill();
+spr2.x = 100;
+spr2.y = 50;
+spr2.name = "sprite2";
+sprcon.addChild( spr2 );
+
+var _spr:egret.DisplayObject = sprcon.getChildByName( "sprite2" );
+_spr.alpha = 0.5;
+```
+
+编译并运行代码,效果如图:
+
+![](566143a4018b9.jpg)
+
+## 获取方式对比
+
+我们通过深度值和 name 属性获取子对象的作用是相同的,但Egret在内部事项原理却大大不同。
+
+使用深度值获取子对象,Egret会根据当前容器的显示列表查找指定深度的显示对象,并作为返回值返回给用户。这种检索方式是快速的,不需要进行大量运算。
+
+通过name属性来获取子对象,Egret内部首先会对当前容器的所有子对象进行编译,同时匹配相同的name属性值,当发现相同name属性的时候,则将该子对象作为返回值返回给用户。虽然在Egret内部进行了相关算法优化,但还是在一定程度上消耗了一些性能。
+
+推荐使用第一种方法,通过深度值来获取子对象。
\ No newline at end of file
diff --git a/Engine2D/displayObjecContainer/concept/5565355e688c7.png b/Engine2D/displayObjecContainer/concept/5565355e688c7.png
new file mode 100644
index 0000000..94183b7
Binary files /dev/null and b/Engine2D/displayObjecContainer/concept/5565355e688c7.png differ
diff --git a/Engine2D/displayObjecContainer/concept/README.md b/Engine2D/displayObjecContainer/concept/README.md
new file mode 100644
index 0000000..c6f9448
--- /dev/null
+++ b/Engine2D/displayObjecContainer/concept/README.md
@@ -0,0 +1,69 @@
+## 概念
+
+所有的容器全部继承自 `DisplayObjectContainer` 类,这个名称为 `DisplayObjectContainer` 的类又继承自 `DisplayObject` 。也就是说,在Egret中,所有的容器其实也继承自 `DisplayObject`。
+
+在Egret中,`DisplayObjectContainer` 封装了一些显示列表中常用的功能。在后面的内容中,我们将详细介绍显示列表的操作。这些常用操作主要分为四类:
+
+* 添加、删除子对象
+
+* 访问子对象
+
+* 检测子对象
+
+* 设置叠放次序
+
+## Sprite
+
+在Egret中,我们还有一个其他的容器:`Sprite`。
+
+如果你查看Sprite类的内容,你会发现,`Sprite`仅仅是继承 `DisplayObjectContainer`。同时添加了一个Graphics功能。
+
+> 关于Graphics功能我们会在矢量绘图部分进行详细讲解。
+
+## 自定义容器
+
+想要自定义一个容器非常容易,我们编写一个类,并且继承 DisplayObjectContainer 即可。当然,如果你想实现相关的Graphics绘图功能,你也可以继承 Sprite。
+
+下面是一个自定义容器类的示例,这里我们定义了一个GridSprite。这个类默认会绘制一个红蓝相间的格子。
+
+```
+class GridSprite extends egret.Sprite
+{
+ public constructor()
+ {
+ super();
+ this.drawGrid();
+ }
+
+ private drawGrid()
+ {
+ this.graphics.beginFill( 0x0000ff );
+ this.graphics.drawRect( 0, 0, 50,50 );
+ this.graphics.endFill();
+
+ this.graphics.beginFill( 0x0000ff );
+ this.graphics.drawRect( 50, 50, 50, 50);
+ this.graphics.endFill();
+
+ this.graphics.beginFill( 0xff0000 );
+ this.graphics.drawRect( 50, 0, 50,50 );
+ this.graphics.endFill();
+
+ this.graphics.beginFill( 0xff0000 );
+ this.graphics.drawRect( 0, 50, 50,50 );
+ this.graphics.endFill();
+ }
+}
+```
+
+在文档类中,我们实例化 `GridSprite` 即可。
+
+```
+var _myGrid:GridSprite = new GridSprite();
+this.addChild( _myGrid );
+```
+
+编译运行效果如下:
+
+![](5565355e688c7.png)
+
diff --git a/Engine2D/displayObjecContainer/depthManagement/566d13d7e2212.png b/Engine2D/displayObjecContainer/depthManagement/566d13d7e2212.png
new file mode 100644
index 0000000..e88e26d
Binary files /dev/null and b/Engine2D/displayObjecContainer/depthManagement/566d13d7e2212.png differ
diff --git a/Engine2D/displayObjecContainer/depthManagement/566d13d810a78.png b/Engine2D/displayObjecContainer/depthManagement/566d13d810a78.png
new file mode 100644
index 0000000..15eee47
Binary files /dev/null and b/Engine2D/displayObjecContainer/depthManagement/566d13d810a78.png differ
diff --git a/Engine2D/displayObjecContainer/depthManagement/566d13d822cef.png b/Engine2D/displayObjecContainer/depthManagement/566d13d822cef.png
new file mode 100644
index 0000000..a33c4b4
Binary files /dev/null and b/Engine2D/displayObjecContainer/depthManagement/566d13d822cef.png differ
diff --git a/Engine2D/displayObjecContainer/depthManagement/566d13d8359d6.png b/Engine2D/displayObjecContainer/depthManagement/566d13d8359d6.png
new file mode 100644
index 0000000..2216e6f
Binary files /dev/null and b/Engine2D/displayObjecContainer/depthManagement/566d13d8359d6.png differ
diff --git a/Engine2D/displayObjecContainer/depthManagement/566d13d84e325.png b/Engine2D/displayObjecContainer/depthManagement/566d13d84e325.png
new file mode 100644
index 0000000..7d2dc09
Binary files /dev/null and b/Engine2D/displayObjecContainer/depthManagement/566d13d84e325.png differ
diff --git a/Engine2D/displayObjecContainer/depthManagement/566d13d868ed3.png b/Engine2D/displayObjecContainer/depthManagement/566d13d868ed3.png
new file mode 100644
index 0000000..8b8a05a
Binary files /dev/null and b/Engine2D/displayObjecContainer/depthManagement/566d13d868ed3.png differ
diff --git a/Engine2D/displayObjecContainer/depthManagement/566d13d877864.png b/Engine2D/displayObjecContainer/depthManagement/566d13d877864.png
new file mode 100644
index 0000000..a49d6a3
Binary files /dev/null and b/Engine2D/displayObjecContainer/depthManagement/566d13d877864.png differ
diff --git a/Engine2D/displayObjecContainer/depthManagement/README.md b/Engine2D/displayObjecContainer/depthManagement/README.md
new file mode 100644
index 0000000..7d7ae17
--- /dev/null
+++ b/Engine2D/displayObjecContainer/depthManagement/README.md
@@ -0,0 +1,225 @@
+每一个容器都会有一个自己的深度管理功能,这个深度管理就好像我们排队一样。
+
+![](566d13d7e2212.png)
+
+每一个显示对象在其父级的容器中都应该拥有一个属于自己的深度值,而且这个值相对于同级显示对象应该是唯一的。这个深度值实际上就是一个显示对象的叠放次序。我们也称之为 *“z-次序”*。
+
+深度是由每个容器的子对象列表所管理。每个容器都清楚自己拥有多少个子对象。我们可以通过容器的 `numChildren` 属性来获取当前容器的子对象数量。
+
+`容器.numChildren`
+
+在对深度的控制管理中,Egret提供了一些方便有效的深度管理API。下面我们就对深度管理功能做一些介绍。
+
+## 深度顺序
+
+Egret中容器的深度都是从0开始的,当一个显示对象第一个被添加到容器中时,它的深度值为0。这个显示对象也处于容器的最底层。当我们添加第二个显示对象的时候,他的深度值为1,并且在第一个显示对象上方。如果两个显示对象发生了相交,那么我们可以从视觉上看到,第二个显示对象遮挡住第一个显示对象。
+
+下面的示例中,我们创建了两个显示对象,并且让他们发生遮挡,一次来查看显示对象的深度值关系。
+
+```
+var spr1:egret.Sprite = new egret.Sprite();
+spr1.graphics.beginFill( 0xff0000 );
+spr1.graphics.drawRect( 0, 0, 100, 100);
+spr1.graphics.endFill();
+this.addChild( spr1 );
+
+var spr2:egret.Sprite = new egret.Sprite();
+spr2.graphics.beginFill( 0x00ff00 );
+spr2.graphics.drawRect( 0, 0, 80, 80);
+spr2.graphics.endFill();
+spr2.x = 50;
+spr2.y = 50;
+this.addChild( spr2 );
+```
+
+运行效果如下:
+
+![](566d13d810a78.png)
+
+## 添加/删除指定深度的对象
+
+我们默认使用的 `addChild` 方法会默认按照当前子对象深度进行排序,从0开始,每次深度加1,以此类推。
+
+当我们想讲某一个显示对象添加到一个指定深度的时候,我们需要使用 `addChildAt` 方法。这个操作很像排队时插队的想象。
+
+![](566d13d822cef.png)
+
+使用 `addChildAt` 方法也非常的容易,具体使用方法如下:
+
+`容器.addChildAt( 显示对象, 深度值 )`
+
+我们来看一个具体的演示代码,我们随机绘制四个颜色不同的正方形,将它们依次叠加排列,然后新建一个显示对象,并且放到深度为1的位置。
+
+```
+var sprcon:egret.Sprite = new egret.Sprite();
+this.addChild( sprcon );
+sprcon.x = 10;
+
+for(var i:number = 0; i<4; i++)
+{
+ var spr:egret.Sprite = new egret.Sprite();
+ spr.graphics.beginFill( 0xffffff * Math.random() );
+ spr.graphics.drawRect( 0, 0, 100, 100);
+ spr.graphics.endFill();
+ spr.x = i*20;
+ sprcon.addChild( spr );
+}
+
+var sprNew:egret.Sprite = new egret.Sprite();
+sprNew.graphics.beginFill( 0xff0000 );
+sprNew.graphics.drawRect( 0, 0, 300, 150 );
+sprNew.graphics.endFill();
+sprNew.x = 10;
+sprNew.y = 50;
+sprcon.addChildAt( sprNew, 1 );
+```
+
+运行效果如图:
+
+![](566d13d8359d6.png)
+
+我们不仅仅可以再添加显示对象时指定显示对象的深度,在删除显示对象时依然可以通过深度来进行控制。
+
+我们可以使用 容器.removeChild( 显示对象 ) 将一个显示对象移除显示列表,同样,还可以使用
+
+容器.removeChildAt( 深度值 ) 来删除一个指定深度的显示对象。
+
+我们通过上上面示例代码的修改,将深度值为2的显示对象移除显示列表。
+
+```
+var sprcon:egret.Sprite = new egret.Sprite();
+this.addChild( sprcon );
+sprcon.x = 10;
+
+for(var i:number = 0; i<4; i++)
+{
+ var spr:egret.Sprite = new egret.Sprite();
+ spr.graphics.beginFill( 0xffffff * Math.random() );
+ spr.graphics.drawRect( 0, 0, 100, 100);
+ spr.graphics.endFill();
+ spr.x = i*20;
+ sprcon.addChild( spr );
+}
+
+var sprNew:egret.Sprite = new egret.Sprite();
+sprNew.graphics.beginFill( 0xff0000 );
+sprNew.graphics.drawRect( 0, 0, 300, 150 );
+sprNew.graphics.endFill();
+sprNew.x = 10;
+sprNew.y = 50;
+sprcon.addChildAt( sprNew, 1 );
+
+sprcon.removeChildAt( 2 );
+```
+
+运行效果如下:
+
+![](566d13d84e325.png)
+
+有时候我们想一次性将一个容器内的所有子对象全部删除,那么我们不需要使用复杂的遍历操作来想子对象一一删除,例如:
+
+```
+var numChild:number = sprcon.numChildren;
+for(var t:number = 0; t 注意:如果对位图进行缩放或拉伸,图像会发生模糊。
+
+图3中展示了关于透明度的操作。显示对象的默认透明度为"1",表示完全不透明,通过 alpha 属性访问修改透明度。alpha取值范围为 0-1。示例代码如下:
+
+```javascript
+var shape:egret.Shape = new egret.Shape();
+shape.alpha = 0.4;
+```
+
+图4中展示了显示对象的旋转操作,旋转角度可通过 rotation 属性访问修改。将图中的矩形旋转30°,示例代码如下:
+
+```javascript
+var shape:egret.Shape = new egret.Shape();
+shape.rotation = 30;
+```
+
+上图展示了显示对象中常用的可视属性,下面列表是显示对象的全部可视属性。
+
+* alpha:透明度
+* width:宽度
+* height:高度
+* rotation:旋转角度
+* scaleX:横向缩放
+* scaleY:纵向缩放
+* skewX:横向斜切
+* skewY:纵向斜切
+* visible:是否可见
+* x:X轴坐标值
+* y:Y轴坐标值
+* anchorOffsetX:对象绝对锚点X
+* anchorOffsetY:对象绝对锚点Y
+
+### 3.核心显示类
+
+不同的内容对应不同的显示对象,Egret 中一共封装了8个显示相关的核心类,如下表。
+
+| 类 | 描述 |
+| --- | --- |
+| DisplayObject | 显示对象基类,所有显示对象均继承自此类 |
+| Bitmap | 位图,用来显示图片 |
+| Shape | 用来显示矢量图,可以使用其中的方法绘制矢量图形 |
+| TextField | 文本类 |
+| BitmapText | 位图文本类 |
+| DisplayObjectContainer | 显示对象容器接口,所有显示对象容器均实现此接口 |
+| Sprite | 带有矢量绘制功能的显示容器 |
+| Stage | 舞台类 |
+
+### 4.自定义显示对象类
+
+自定义显示对象类需要继承自 `DisplayObject`的具体子类,例如`Shape`或者`TextField`。
+
+示例代码如下:
+
+* 创建
+创建一个名称为 `MyGrid` 的类,并且继承自 `Shape` 。具体代码如下:
+
+```javascript
+class MyGrid extends egret.Shape{
+ public constructor(){
+ super();
+ this.drawGrid();
+ }
+
+ private drawGrid(){
+ this.graphics.beginFill( 0x0000ff );
+ this.graphics.drawRect( 0, 0, 50,50 );
+ this.graphics.endFill();
+
+ this.graphics.beginFill( 0x0000ff );
+ this.graphics.drawRect( 50, 50, 50, 50);
+ this.graphics.endFill();
+
+ this.graphics.beginFill( 0xff0000 );
+ this.graphics.drawRect( 50, 0, 50,50 );
+ this.graphics.endFill();
+
+ this.graphics.beginFill( 0xff0000 );
+ this.graphics.drawRect( 0, 50, 50,50 );
+ this.graphics.endFill();
+ }
+}
+```
+
+在 `MyGrid` 中绘制了一个红蓝相间的2*2格子,然后修改文档类`Main`,在文档类中创建并显示 `MyGrid`类的实例,具体代码如下:
+
+
+```javascript
+class Main extends egret.DisplayObjectContainer{
+ public constructor(){
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+
+ private onAddToStage(event:egret.Event){
+ var _myGrid:MyGrid = new MyGrid();
+ this.addChild( _myGrid );
+ }
+}
+```
+
+* 效果
+编译并测试,在浏览器中看到如下图的效果。
+
+![](556534d84ca7f.png)
+
+## 显示容器
+### 1.基本概念
+所有的显示容器全部继承自 `DisplayObjectContainer` 类,该类继承自 `DisplayObject` 。也就是说,在Egret中,所有的容器都继承自 `DisplayObject`。
+
+在Egret中,`DisplayObjectContainer` 封装了一些显示列表中常用的功能,将在后面文档中详细介绍。这些常用操作主要分为四类:
+
+* 添加、删除子对象
+
+* 访问子对象
+
+* 检测子对象
+
+* 设置叠放次序
+
+>在Egret中,显示对象被分为两大类:一种是可以包括其他显示对象的显示对象容器,简称为“容器”。另外一种是单纯的显示对象,除自身以外不能包括其他显示对象,简称“非容器对象”。
+
+### 2.Sprite
+
+在Egret中,`Sprite`是一个常用的容器。
+
+`Sprite`继承自 `DisplayObjectContainer`,同时添加了Graphics功能。
+
+> 关于Graphics功能,会在矢量绘图部分进行详细讲解。
+
+### 3.自定义容器
+
+自定义容器,可编写一个类,继承 `DisplayObjectContainer` 。如果要同时实现Graphics绘图功能,可继承 `Sprite`。
+
+下面是一个自定义容器类的示例,该示例定义了一个`GridSprite`类。这个类默认绘制一个红蓝相间的格子。
+
+```javascript
+class GridSprite extends egret.Sprite
+{
+ public constructor()
+ {
+ super();
+ this.drawGrid();
+ }
+
+ private drawGrid()
+ {
+ this.graphics.beginFill( 0x0000ff );
+ this.graphics.drawRect( 0, 0, 50,50 );
+ this.graphics.endFill();
+
+ this.graphics.beginFill( 0x0000ff );
+ this.graphics.drawRect( 50, 50, 50, 50);
+ this.graphics.endFill();
+
+ this.graphics.beginFill( 0xff0000 );
+ this.graphics.drawRect( 50, 0, 50,50 );
+ this.graphics.endFill();
+
+ this.graphics.beginFill( 0xff0000 );
+ this.graphics.drawRect( 0, 50, 50,50 );
+ this.graphics.endFill();
+ }
+}
+```
+
+在文档类中,实例化 `GridSprite` 即可。
+
+```javascript
+var _myGrid:GridSprite = new GridSprite();
+this.addChild( _myGrid );
+```
+
+编译运行效果如下:
+
+![](5565355e688c7.png)
+
+
+## 显示列表
+显示列表用来管理和组织容器和非容器对象,当某个显示对象处在显示列表中,就可以在画面中看到该对象。当显示对象从显示列表中移除后,该对象从画面中消失。
+
+在Egret内部维护着一个显示列表,开发者无需关心该列表是如何运行,只需对自己的显示对象进行相应的操作。下面以一个例子说明显示列表的工作方式。
+
+表达下图所示的场景
+
+![](5565305cb440c.png)
+
+* 明确显示对象层级架构
+
+在实际的操作中,可以把显示列表看成树状结构。
+
+在这个树状结构中,处于最上层的是“舞台”。对应到程序中,是 `stage` 对象。舞台是Egret显示架构中最根本的显示容器。每个Egret应有且只有一个`stage`对象。舞台是这个显示树结构的根节点。
+
+在舞台中,我们还拥有一个主容器。这个容器就是文档类所创建的容器。每一个Egret都会拥有一个文档类,这个文档类必须是一个显示对象容器。
+
+在这个场景中,包含了一个场景背景,背景是由背景图和一颗大树组成的。另外两个元素分别是人物和草地。其树状结构如下图:
+
+![](5565305cb55a6.png)
+
+上面的树状结构图就是Egret的“显示列表”。
diff --git a/Engine2D/displayObject/resetDepth/README.md b/Engine2D/displayObject/resetDepth/README.md
new file mode 100644
index 0000000..95ce1e4
--- /dev/null
+++ b/Engine2D/displayObject/resetDepth/README.md
@@ -0,0 +1,37 @@
+重设子对象深度有2种方法:[使用 setChildIndex ](../depthManagement/README.md#4重设子对象深度)和使用 zIndex.
+
+从 Egret 5.2.24 版本开始,`DisplayObject` 中新增加了一个 `zIndex` 属性,可以设置对象的 Z 轴顺序。该值越大,越靠近顶部。
+
+在 PC 的 Chrome 浏览器和安卓系统中,`zIndex` 的效率比 `setChildIndex` 高很多。极限测试时可以达到10倍以上。
+
+在 iOS 系统中,两种方式的效率基本一致,没有很大区别,这跟系统浏览器的内核有关。
+
+**注意,要给一个对象使用 zIndex,包含此显示对象的 DisplayObjectContainer 对象一定要设置 sortableChildren = true,开启排序功能,否则设置 zIndex 是无效的**
+
+```javascript
+let container = new egret.Sprite();
+container.sortableChildren = true;//注意,一定要设置为true
+this.addChild(container);
+
+let texture: egret.Texture = RES.getRes('bird_png');
+
+let b1 = new egret.Bitmap();
+b1.texture = texture;
+b1.x = 100;
+this.addChild(b1)
+
+let b2 = new egret.Bitmap();
+b2.texture = texture;
+b2.x = 270;
+this.addChild(b2)
+
+let b3 = new egret.Bitmap();
+b3.texture = texture;
+b3.x = 440;
+this.addChild(b3)
+
+
+b2.zIndex = 3;//将第二个图片设置到顶部
+```
+![](./p1.png)
+
diff --git a/Engine2D/displayObject/resetDepth/p1.png b/Engine2D/displayObject/resetDepth/p1.png
new file mode 100644
index 0000000..b17f3c8
Binary files /dev/null and b/Engine2D/displayObject/resetDepth/p1.png differ
diff --git a/Engine2D/displayObject/transform/556535128a4a2.png b/Engine2D/displayObject/transform/556535128a4a2.png
new file mode 100644
index 0000000..c82e04b
Binary files /dev/null and b/Engine2D/displayObject/transform/556535128a4a2.png differ
diff --git a/Engine2D/displayObject/transform/556535128b8ba.png b/Engine2D/displayObject/transform/556535128b8ba.png
new file mode 100644
index 0000000..4375a3b
Binary files /dev/null and b/Engine2D/displayObject/transform/556535128b8ba.png differ
diff --git a/Engine2D/displayObject/transform/README.md b/Engine2D/displayObject/transform/README.md
new file mode 100644
index 0000000..babbf8e
--- /dev/null
+++ b/Engine2D/displayObject/transform/README.md
@@ -0,0 +1,210 @@
+
+## 1.锚点的操作
+每个显示对象都包含一个锚点,锚点默认位于显示对象的左上角。
+
+当设置一个显示对象的坐标位置时,会以锚点为参照改变显示对象的绘图位置。同时,锚点相对于显示对象的位置也是可以改变的。
+
+### 默认锚点
+
+```javascript
+class AnchorTest extends egret.DisplayObjectContainer
+{
+ public constructor()
+ {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+
+ private onAddToStage(event:egret.Event)
+ {
+ var shp:egret.Shape = new egret.Shape();
+ shp.graphics.beginFill( 0x00ff00 );
+ shp.graphics.drawRect( 0, 0, 100, 100 );
+ shp.graphics.endFill();
+ shp.x = 100;
+ shp.y = 100;
+ this.addChild( shp );
+ }
+}
+```
+
+上面的代码中,绘制了一个绿色的正方形,锚点默认在正方形的左上角位置,通过设置 `shp` 的 `x`、`y`属性来改变正方形的位置。
+
+效果如下图:
+
+![](556535128a4a2.png)
+
+### 修改锚点
+
+可通过`anchorOffsetX`和 `anchorOffsetY`属性访问修改锚点的位置。
+
+修改上例锚点的位置,让锚点居于正方形左上角x轴 50 像素的位置,代码如下:
+
+```javascript
+shp.anchorOffsetX = 50;
+```
+
+再次编译项目并测试,效果如下:
+
+![](556535128b8ba.png)
+
+可以看到,绿色正方形位置依然是x:100,y:100。但实际效果中,正方形的位置和上一张图中的位置有明显的差异。这是因为修改了锚点的位置。
+
+## 2.位置和平移
+
+### 位置
+通过的 x 和 y 属性可访问修改显示对象的位置。
+
+``` javascript
+container.x = 17;
+container.y = 212;
+```
+
+显示对象定位系统将舞台视为一个笛卡尔坐标系(带有水平 x 轴和垂直 y 轴的常见网格系统)。坐标系的原点(x 和 y 轴相交的 0,0 坐标)位于舞台的左上角。从原点开始,x 轴的值向右为正,向左为负,而 y 轴的值向下为正,向上为负(与典型的图形系统相反)。例如,通过前面的代码行可以将对象 container 移到 x 轴坐标 17(原点向右 17 个像素)和 y 轴坐标 212(原点向下 212 个像素)。
+
+默认创建显示对象时,x 和 y 属性均设置为 0,对象在其父容器的左上角。
+
+### 本地坐标和舞台坐标
+
+x 和 y 属性始终是指显示对象相对于其父显示对象坐标轴的 (0,0) 坐标的位置。因此,对于包含在 DisplayObjectContainer 实例内的 Shape 实例(如圆),如果将 Shape 对象的 x 和 y 属性设置为 0,会将圆放在 DisplayObjectContainer 的左上角,但该位置不一定是舞台的左上角。若要确定对象相对于全局舞台坐标的位置,可以使用任何显示对象的 globalToLocal() 方法将坐标从全局(相对于舞台)坐标转换为本地(相对于显示对象容器)坐标,如下所示:
+
+```javascript
+//创建一个空的 DisplayObjectContainer,把它的 x 和 y 坐标都改为
+var container: egret.DisplayObjectContainer = new egret.DisplayObjectContainer();
+container.x = 200;
+container.y = 200;
+this.addChild(container);
+
+//画一个红色的圆,添加到 container 中
+var circle: egret.Shape = new egret.Shape();
+circle.graphics.beginFill(0xff0000);
+circle.graphics.drawCircle(25,25,25);
+circle.graphics.endFill();
+container.addChild(circle);
+
+//给圆增加点击事件
+circle.touchEnabled = true;
+circle.addEventListener(egret.TouchEvent.TOUCH_TAP,onClick,this);
+
+function onClick():void{
+ //把舞台左上角的坐标(0,0)转换为 container 内部的坐标
+ var targetPoint: egret.Point = container.globalToLocal(0,0);
+ //重新定位圆,可以看到圆形移到了屏幕的左上角
+ circle.x = targetPoint.x;
+ circle.y = targetPoint.y;
+}
+```
+
+同样,也可以使用 DisplayObject 类的 localToGlobal() 方法将本地坐标转换为舞台坐标。
+
+### 平移
+
+通过触摸移动显示对象,示例代码如下:
+
+当手指按到屏幕时监听 TOUCH_MOVE 事件,每次手指移动时调用`onMove()`函数,使拖动的对象跳到手指所在的x,y坐标。当手指离开屏幕后取消监听,对象停止跟随。
+
+```javascript
+//设定2个偏移量
+var offsetX:number;
+var offsetY:number;
+
+//画一个红色的圆
+var circle: egret.Shape = new egret.Shape();
+circle.graphics.beginFill(0xff0000);
+circle.graphics.drawCircle(25,25,25);
+circle.graphics.endFill();
+this.addChild(circle);
+
+//手指按到屏幕,触发 startMove 方法
+circle.touchEnabled = true;
+circle.addEventListener(egret.TouchEvent.TOUCH_BEGIN,startMove,this);
+
+//手指离开屏幕,触发 stopMove 方法
+circle.addEventListener(egret.TouchEvent.TOUCH_END,stopMove,this);
+
+function startMove(e:egret.TouchEvent):void{
+ //计算手指和圆形的距离
+ offsetX = e.stageX - circle.x;
+ offsetY = e.stageY - circle.y;
+ //手指在屏幕上移动,会触发 onMove 方法
+ this.stage.addEventListener(egret.TouchEvent.TOUCH_MOVE,onMove,this);
+}
+
+function stopMove(e:egret.TouchEvent) {console.log(22);
+ //手指离开屏幕,移除手指移动的监听
+ this.stage.removeEventListener(egret.TouchEvent.TOUCH_MOVE,onMove,this);
+}
+function onMove(e:egret.TouchEvent):void{
+ //通过计算手指在屏幕上的位置,计算当前对象的坐标,达到跟随手指移动的效果
+ circle.x = e.stageX - offsetX;
+ circle.y = e.stageY - offsetY;
+}
+```
+
+## 3.尺寸和缩放
+
+有两种方式可测量和操作显示对象的大小:尺寸属性(width 和 height)或缩放属性(scaleX 和 scaleY)。
+
+### 尺寸
+尺寸属性 `width` 和 `height` 最初设置为对象的大小,以像素为单位。可以通过读取这些属性的值来确定显示对象的大小,也可以指定新值来更改对象的大小,如下所示:
+
+``` javascript
+//设定对象的大小
+mySprite.width = 50;
+mySprite.height = 100;
+```
+更改显示对象的 height 或 width 会导致缩放对象。
+
+### 缩放
+
+通过缩放属性 `scaleX` 和 `scaleY` 可以等比更改显示对象的大小,如下面代码:
+
+```javascript
+//设定对象的大小
+mySprite.scaleX = 2;
+mySprite.scaleY = 2;
+```
+
+将显示对象的宽和高同时放大了2倍。缩放是相对于显示对象的锚点进行的。
+
+## 4.旋转
+
+使用 `rotation` 属性可以旋转显示对象,将其设置为一个数字(以度为单位),表示要应用于该对象的旋转量,正数为顺时针,负数为逆时针。旋转是相对于显示对象的锚点进行的。
+
+下面代码使 `mySprit` 以锚点为圆心,顺时针旋转45°。
+
+```javascript
+//把对象旋转 45 度(一整周旋转的 1/8)
+mySprite.rotation = 45;
+```
+
+## 5.斜切
+
+斜切是对图像在2D空间进行的一种平行矩阵变形。
+
+斜切可从两个方向进行控制,对X方向的斜切将导致矩形的底边在X方向发生相应的偏移。
+
+![skewX_compare][]
+
+如上图所示,是对白鹭小鸟进行X方向斜切10所达到的结果。左边是未变形的原始图片,右边是变形后的图片。
+
+```javascript
+//设定对象的X方向斜切
+mySprite.skewX = 10;
+```
+
+同理,对Y方向的斜切将导致矩形的右侧边在Y方向发生相应的偏移。
+
+![skewY_compare][]
+
+如上图所示,是对白鹭小鸟进行Y方向斜切10所达到的结果。
+
+[skewX_compare]: skewX_compare.png
+[skewY_compare]: skewY_compare.png
+
+```javascript
+//设定对象的Y方向斜切
+mySprite.skewY = 10;
+```
+
+在适当的动画呈现场合使用斜切变形,可以在不增加图片资源的前提下实现灵活而有趣的效果。
diff --git a/Engine2D/displayObject/transform/skewX_compare.png b/Engine2D/displayObject/transform/skewX_compare.png
new file mode 100644
index 0000000..6b6ad04
Binary files /dev/null and b/Engine2D/displayObject/transform/skewX_compare.png differ
diff --git a/Engine2D/displayObject/transform/skewY_compare.png b/Engine2D/displayObject/transform/skewY_compare.png
new file mode 100644
index 0000000..0770625
Binary files /dev/null and b/Engine2D/displayObject/transform/skewY_compare.png differ
diff --git a/Engine2D/event/event/README.md b/Engine2D/event/event/README.md
new file mode 100644
index 0000000..27f817f
--- /dev/null
+++ b/Engine2D/event/event/README.md
@@ -0,0 +1,37 @@
+Event类是所有事件类的基类。当创建一个自定义事件的时候,事件应该继承自Event类。同时Event类也包含一些事件。这些事件通常与显示列表,显示对象的状态有关。
+
+在使用Event类时,有以下几个属性与方法需要注意。
+
+* 首先是构造函数中的三个参数,`type`、`bubbles`和`cancelable`。
+
+ * `type`指定事件的类型,在“约会”的例子中,`type`事件类型为“DATE”。我们经常使用的事件类型有“ADDED”、“COMPLETE”等。
+
+ * `bubbles`是指定事件是否参与事件流的冒泡阶段,关于事件流,会在后面的小节中介绍。
+
+ * `cancelable`表示是否可以取消与事件关联的默认动作。
+
+* 另外还需要关注的属性是`target`,这个属性表示事件的目标,也就是事件的发送者。其他的一些方法都与事件流有关,后面的内容会进行详细介绍。
+
+### 自定义事件
+
+通常情况下,游戏中都会编写一些自定义事件,在上一小节中,已经编写过一个“约会”的自定义事件了,下面是详细代码。
+
+```javascript
+class DateEvent extends egret.Event
+{
+ public static DATE:string = "约会";
+ public _year:number = 0;
+ public _month:number = 0;
+ public _date:number = 0;
+ public _where:string = "";
+ public _todo:string = "";
+ public constructor(type:string, bubbles:boolean=false, cancelable:boolean=false)
+ {
+ super(type,bubbles,cancelable);
+ }
+}
+```
+
+上述自定义事件类`DateEvent`继承自 `egret.Event` 类。同时定义一个名称为 `DATE` 的属性,该属性为静态属性,类型为字符串。
+
+上述自定义事件定义了一些事件中所需要的数据,这些数据包括日期,地点,做什么。在自定义事件类的时候,开发者可以根据自己的需要来定义事件类型和事件数据。
diff --git a/Engine2D/event/listener/README.md b/Engine2D/event/listener/README.md
new file mode 100644
index 0000000..c203fb9
--- /dev/null
+++ b/Engine2D/event/listener/README.md
@@ -0,0 +1,65 @@
+事件侦听器也就是事件的处理者,负责接收事件携带的信息,并在接收到该事件后执行特定的代码。
+
+Egret中,事件的侦听器必须是一个函数。事件的发送者必须是 `egret.EventDispatcher` 类或者子类的实例。只有事件发送者才能侦听事件,并且可以注册侦听器。
+
+侦听事件分为两个部分,第一是建立侦听器,侦听器可以是独立的函数,也可以是某一个对象的方法。第二步是注册侦听器,使用事件发送者的 `addEventListener()` 将相应的事件分配给侦听器。
+
+下面是注册侦听函数的定义。
+
+```javascript
+public addEventListener(type:string, listener:Function, thisObject:any, useCapture:boolean = false, priority:number = 0)
+```
+
+
+* `type`:事件类型,必选。
+
+* `listener`:用来处理事件的侦听器,必选。
+
+* `thisObject`:作用域,必选,一般填写this。因为TypeScript与JavaScript的this作用域不同,其this指向也会不同。如果不填写this的话,那么编译后的代码会发生错误。 关于this的问题,可以学习JavaScript中的原型链。
+
+* `useCapture`: 确定侦听器是运行于捕获阶段还是运行于冒泡阶段,可选。设置为 true,则侦听器只在捕获阶段处理事件,而不在冒泡阶段处理事件。设置为 false,则侦听器只在冒泡阶段处理事件。
+
+* `priority`: 事件侦听器的优先级,可选。优先级由一个带符号的整数指定。数字越大,优先级越高。优先级为 n 的所有侦听器会在优先级为 n -1 的侦听器之前得到处理。如果两个或更多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。默认优先级为 0。
+
+### 1.创建侦听器
+
+侦听器必须是函数,它可以是一个独立函数,也可以是一个实例的方法。侦听器必须有一个参数,并且这个参数必须是 Event 类实例或其子类的实例, 同时,侦听器的返回值必须为空(void)。范例代码如下:
+
+```javascript
+listenerName(evt:Event):void {...}
+```
+
+### 2.注册侦听器与移除侦听器
+
+只有事件的发送者才可以注册侦听器,事件的发送者必须是 `EventDispatcher` 类或其子类的实例。移除侦听器也同理,通常情况下,注册侦听器与移除侦听器都是成对出现。
+
+注册侦听器
+
+```javascript
+事件发送者.addEventListener(事件类型, 侦听器, this);
+```
+
+移除侦听器
+
+```javascript
+事件发送者.removeEventListener(事件类型, 侦听器, this);
+```
+
+### 3.检测侦听器
+
+如果需要在逻辑中检测某一个事件发送者是否注册了侦听器,有两个方法可以使用。 一个是 `hasEventListener` ,另外一个是 `willTrigger` 。两个方法执行效果相同,都是判断一个事件发送者是否注册了某一个类型的事件。
+
+如果该事件类型已经被注册过,返回 `true`,如果没有被注册过,返回 `false`。
+
+```javascript
+事件发送者.hasEventListener(事件类型);
+```
+
+### 4.TouchEvent的启动开关
+
+TouchEvent的启动开关 `touchEnabled` 指定此对象是否接收触摸或其他用户输入。默认值为 false,实例将不接收任何触摸事件(或其他用户输入事件)。如果将 `touchEnabled`设置为 true,则显示对象实例将会接收触摸事件或其他用户输入事件。要更改显示对象的所有子级的 touchEnabled 行为,请使用 `DisplayObjectContainer.touchChildren`。
+
+实际使用过程,如果某些显示对象需要侦听TouchEvent,请先打开:
+```javascript
+显示对象实例.touchEnabled = true;
+```
diff --git a/Engine2D/event/principle/566143cb47133.png b/Engine2D/event/principle/566143cb47133.png
new file mode 100644
index 0000000..10d028b
Binary files /dev/null and b/Engine2D/event/principle/566143cb47133.png differ
diff --git a/Engine2D/event/principle/README.md b/Engine2D/event/principle/README.md
new file mode 100644
index 0000000..7b437f0
--- /dev/null
+++ b/Engine2D/event/principle/README.md
@@ -0,0 +1,21 @@
+Egret中的事件机制是一套业内标准的事件处理架构。所提供的事件模式也非常的清晰、强大和高效。
+
+在Egret中,事件模型定义了一套标准的生成和处理事件消息的方法,使程序中的对象可以相互交互,通信,保持自身状态和相应变化。简单的说,数据的提供者只管发出数据对象,只要确保数据对象是 `egret.Event` 类或者子类的实例即可。这种数据对象 ,称为`事件(Event)`。数据对象的发出者,称之为事件`发送者(Event dispatcher)`。同时,接受事件的对象,称为 `事件侦听者(Event listener)`。
+
+以下是一个简单的例子。
+
+当我们想要和男(女)朋友约会的时候,通常都会有一个约会的发起者,同时还有个一个约会对象。那么这个邀请过程,就是一个典型的事件过程。
+
+这个过程请见下图:
+
+![](566143cb47133.png)
+
+男朋友是事件`发送者`,邀请约会就是男朋友发送的`事件`。而女朋友就是`事件侦听器`。
+
+这个事件,包含三条主要内容:事件的类型,事件的目标,事件的相关数据。事件的类型就是邀请约会,女朋友会 根据事件的不同,来执行不同的任务。比如,事件是“邀请约会”,那么女朋友可能会执行,梳妆打扮,然后赴约。如果事件 是“肚子饿了”,那么女朋友会执行买菜做饭。
+
+事件的`目标`,就是事件的发送者。如果没有这个信息,那么女朋友接到事件后,就无法知道是谁要约她,或者是谁饿了。
+
+事件的`数据`,就是事件所要包含的信息。上面的约会事件中,事件的信息可以包括事件,地点,干什么。同理,“肚子饿了”这个事件,要包含的信息是想吃些什么,在家里吃还是去外面吃等等。当然,也有一些事件是不包含信息的,例如“捶背”,事件 接受者只要收到这个事件,直接执行就可以了。
+
+根据上面这个例子,可以进一步了解Egret中的事件执行流程了。
diff --git a/Engine2D/event/priority/README.md b/Engine2D/event/priority/README.md
new file mode 100644
index 0000000..5e7b436
--- /dev/null
+++ b/Engine2D/event/priority/README.md
@@ -0,0 +1,8 @@
+通过制定事件的优先级来设置事件侦听器的执行顺序。
+
+可以在注册侦听器的时候制定事件的优先级。
+```javascript
+public addEventListener(type:string, listener:Function, thisObject:any, useCapture:boolean = false, priority:number = 0)
+```
+
+制定优先级需要设置 `priority` 属性。该属性为一个number类型,当数字越大,则优先级越大。在触发事件的时候优先级越高,越先执行。
diff --git a/Engine2D/event/process/566143f9ec1bc.png b/Engine2D/event/process/566143f9ec1bc.png
new file mode 100644
index 0000000..fc2152f
Binary files /dev/null and b/Engine2D/event/process/566143f9ec1bc.png differ
diff --git a/Engine2D/event/process/README.md b/Engine2D/event/process/README.md
new file mode 100644
index 0000000..54ff2d8
--- /dev/null
+++ b/Engine2D/event/process/README.md
@@ -0,0 +1,99 @@
+事件机制包含4个步骤:注册侦听器,发送事件,侦听事件,移除侦听器。这四个步骤是按照顺序来执行的。
+
+注册侦听器,即指定事件由哪个对象的哪个方法来接受。在上一节约会的例子中,我们指定由男朋友来发送事件,由女朋友来接受事件。
+
+只有在注册侦听器后,发送的事件才能被侦听。而且发送的事件必须和侦听器事件的类型匹配。在发送事件后,侦听器才能侦听到事件。
+
+下面通过实例展示“约会”这个事件发送过程,以及代码编写过程。
+
+### 文档类
+
+```javascript
+class SampleDate extends egret.DisplayObjectContainer
+{
+ public constructor()
+ {
+ super();
+
+ //创建一个男朋友
+ var boy:Boy = new Boy();
+ boy.name = "男朋友";
+ //创建一个女朋友
+ var girl:Girl = new Girl();
+ girl.name = "女朋友";
+ //注册侦听器
+ boy.addEventListener(DateEvent.DATE,girl.getDate,girl);
+ //男朋友发送要求
+ boy.order();
+ //约会邀请完成后,移除侦听器
+ boy.removeEventListener(DateEvent.DATE,girl.getDate,girl);
+ }
+}
+```
+
+### 男朋友类
+
+```javascript
+class Boy extends egret.Sprite
+{
+ public constructor()
+ {
+ super();
+ }
+ public order()
+ {
+ //生成约会事件对象
+ var daterEvent:DateEvent = new DateEvent(DateEvent.DATE);
+ //添加对应的约会信息
+ daterEvent._year = 2014;
+ daterEvent._month = 8;
+ daterEvent._date = 2;
+ daterEvent._where = "肯德基";
+ daterEvent._todo = "共进晚餐";
+ //发送要求事件
+ this.dispatchEvent(daterEvent);
+ }
+}
+```
+
+### 女朋友类
+
+```javascript
+class Girl extends egret.Sprite
+{
+ public constructor()
+ {
+ super();
+ }
+
+ public getDate(evt:DateEvent)
+ {
+ console.log("得到了" + evt.target.name + "的邀请!" );
+ console.log("会在" + evt._year + "年" + evt._month + "月" + evt._date + "日,在"+ evt._where+ evt._todo);
+ }
+}
+```
+
+### 约会事件类
+
+```javascript
+class DateEvent extends egret.Event
+{
+ public static DATE:string = "约会";
+ public _year:number = 0;
+ public _month:number = 0;
+ public _date:number = 0;
+ public _where:string = "";
+ public _todo:string = "";
+
+ public constructor(type:string, bubbles:boolean=false, cancelable:boolean=false)
+ {
+ super(type,bubbles,cancelable);
+ }
+}
+```
+
+编译并运行,效果如图:
+
+![](566143f9ec1bc.png)
+
diff --git a/Engine2D/event/touchEvent/568e5eb1eef1f.png b/Engine2D/event/touchEvent/568e5eb1eef1f.png
new file mode 100644
index 0000000..0cc0dab
Binary files /dev/null and b/Engine2D/event/touchEvent/568e5eb1eef1f.png differ
diff --git a/Engine2D/event/touchEvent/568e5eb20e0fe.png b/Engine2D/event/touchEvent/568e5eb20e0fe.png
new file mode 100644
index 0000000..29a95f2
Binary files /dev/null and b/Engine2D/event/touchEvent/568e5eb20e0fe.png differ
diff --git a/Engine2D/event/touchEvent/README.md b/Engine2D/event/touchEvent/README.md
new file mode 100644
index 0000000..f5ed489
--- /dev/null
+++ b/Engine2D/event/touchEvent/README.md
@@ -0,0 +1,131 @@
+### 1.触摸事件
+对于移动游戏,触摸事件是最常用的用户交互事件类型。Egret 为触摸事件设置了专门的触摸事件类`egret.TouchEvent`。
+
+其包含的事件类型主要有:
+* TOUCH_BEGIN:当用户第一次触摸启用触摸的设备时(例如,用手指触摸配有触摸屏的移动电话或平板电脑)触发
+* TOUCH_CANCEL:由于某个事件取消了触摸时触发
+* TOUCH_END:当用户移除与启用触摸的设备的接触时(例如,将手指从配有触摸屏的移动电话或平板电脑上抬起)触发
+* TOUCH_MOVE:当用户触碰设备并移动时进行触发,而且会连续触发,直到接触点被删除
+* TOUCH_TAP:当用户在触摸设备上与开始触摸的同一 DisplayObject 实例上抬起接触点时触发(相当与点击事件)
+
+在Egret中使用触摸事件时,需要打开显示对象的触摸事件开关,即将该显示对象的`touchEnabled`属性设置为`true`。代码示例如下:
+
+```javascript
+class TouchEventTest extends egret.DisplayObjectContainer
+{
+ public constructor()
+ {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+ private onAddToStage(event:egret.Event)
+ {
+ //添加显示文本
+ this.drawText();
+ //绘制一个透明度为1的绿色矩形,宽高为100*80
+ var spr1:egret.Sprite = new egret.Sprite();
+ spr1.graphics.beginFill(0x00ff00, 1);
+ spr1.graphics.drawRect(0, 0, 100, 80);
+ spr1.graphics.endFill();
+ spr1.width = 100;
+ spr1.height = 80;
+ this.addChild( spr1 );
+ //设置显示对象可以相应触摸事件
+ spr1.touchEnabled = true;
+ //注册事件
+ spr1.addEventListener( egret.TouchEvent.TOUCH_TAP, this.onTouch, this );
+ this.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onTouchTap, this);
+ this.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onTouchTaps, this, true);
+ }
+ private onTouch( evt:egret.TouchEvent )
+ {
+ this.txt.text += "\n点击了spr1";
+ }
+ private onTouchTap( evt:egret.TouchEvent )
+ {
+ this.txt.text += "\n容器冒泡侦听\n---------";
+ }
+ private onTouchTaps( evt:egret.TouchEvent )
+ {
+ this.txt.text += "\n容器捕获侦听";
+ }
+ //绘制文本
+ private txt:egret.TextField;
+ private drawText():void
+ {
+ this.txt = new egret.TextField();
+ this.txt.size = 12;
+ this.txt.x = 250;
+ this.txt.width = 200;
+ this.txt.height = 200;
+ this.txt.text = "事件文字";
+ this.addChild( this.txt );
+ }
+}
+```
+
+### 2.取消触摸事件
+
+取消触摸事件,在由于某个事件 取消了触摸 时触发。
+
+以点击事件为例,一个点击的流程一般会触发3个 touch 事件:`TouchBegin` 触摸开始,`TouchEnd` 触摸结束,`TouchTap` 点击。
+
+在某些特殊情况,比如 EUI 中的 `Scroller` 滚动列表,当手指点中它后,首先抛出一个 `TouchBegin`,如果此时没有滚动,直接离开屏幕,那么还是原来标准的流程,抛出 `TouchEnd` 和 `TouchTap`。但是当手指滚动它以后,则会抛出一个 `TouchCancel` 事件,而后续的 `TouchEnd` 和 `TouchTap` 事件就不会被触发了。
+
+下面是一个示例代码,创建一个滚动列表并增加监听
+
+~~~javascript
+var scroller = new eui.Scroller();
+var list = new eui.List();
+list.itemRendererSkinName = `
+ `
+var ac = new eui.ArrayCollection([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
+list.dataProvider = ac;
+scroller.viewport = list;
+scroller.height = 200;
+this.addChild(scroller);
+
+scroller.addEventListener(egret.TouchEvent.TOUCH_BEGIN,()=>{console.log("111 Scroller Begin")},this);
+list.addEventListener(egret.TouchEvent.TOUCH_BEGIN,()=>{console.log("111 List Begin")},this);
+
+scroller.addEventListener(egret.TouchEvent.TOUCH_END,()=>{console.log("222 Scroller END")},this);
+list.addEventListener(egret.TouchEvent.TOUCH_END,()=>{console.log("222 List END")},this);
+
+scroller.addEventListener(egret.TouchEvent.TOUCH_TAP,()=>{console.log("33 Scroller Tap")},this);
+list.addEventListener(egret.TouchEvent.TOUCH_TAP,()=>{console.log("33 List Tap")},this);
+
+scroller.addEventListener(egret.TouchEvent.TOUCH_CANCEL,()=>{console.log("44 Scroller cancel")},this);
+list.addEventListener(egret.TouchEvent.TOUCH_CANCEL,()=>{console.log("44 List cancel")},this);
+~~~
+
+
+当没有滚动,点击列表后,会依次抛出以下事件。
+
+~~~javascript
+111 List Begin
+111 Scroller Begin
+222 List END
+222 Scroller END
+33 List Tap
+33 Scroller Tap
+~~~
+
+![](568e5eb1eef1f.png)
+
+上图为点击后的样子
+
+当滚动 `scroller` 以后,会抛出 `TouchCancel`,后续的 touch 事件不会被触发。
+
+~~~javascript
+111 List Begin
+111 Scroller Begin
+44 List cancel
+44 Scroller cancel
+~~~
+
+![](568e5eb20e0fe.png)
+
+另外 `TouchCancel` 触发以后,说明触摸被取消了,本次触摸被选中的选项条也会恢复成选中前的状态。
diff --git a/Engine2D/facebookInstantGames/README.md b/Engine2D/facebookInstantGames/README.md
new file mode 100644
index 0000000..cac2fff
--- /dev/null
+++ b/Engine2D/facebookInstantGames/README.md
@@ -0,0 +1,364 @@
+# Facebook Instant Games 开发快速指南
+
+开发者可以基于现有的Egret HTML5游戏迁移到Facebook Instant Games平台,也可以开发全新针对于Facebook Instant Games平台的HTML5游戏。
+
+本指南旨在带领开发者快速使用Egret工具提交并测试Facebook Instant Games平台游戏,其涉及平台功能与规则限制,请参考Facebook官方文档。
+
+## 创建 Facebook Instant Games 应用
+
+您需要在 [https://developers.facebook.com](https://developers.facebook.com) 登录您的Facebook账号
+
+![](a1.png)
+
+在我的应用中,点击**添加新应用**,填写应用相关信息,如下图:
+
+![](a2.png)
+
+进入到新创建的项目详情面板中,在添加商品中,选择**Facebook Instant Games**,如图:
+
+![](a3.png)
+
+在小游戏详情面板中,填写基本信息
+
+![](a4.png)
+
+进入到**虚拟主机**产品,点击**生成素材上传访问口令**按钮,将生成的口令保存,以备后用,如图:
+
+![](a5.png)
+
+![](a6.png)
+
+## 创建 Egret 项目
+
+创建Egret项目,扩展库中需要选择`Facebook Instant Games`
+
+![](a7.png)
+
+## 编写代码或迁移您的项目
+
+关于API,您可查看 [Egret文档中心](http://developer.egret.com/cn/apidoc/) 以获取更详细的说明。
+
+此处以一个示例项目为例,代码如下:
+
+##### Button.ts
+
+~~~ javascript
+class Button extends egret.Sprite {
+
+ public constructor(label: string) {
+ super();
+ this.drawText(label);
+ this.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.touch_begin, this);
+ this.addEventListener(egret.TouchEvent.TOUCH_END, this.touch_end, this);
+ this.addEventListener(egret.TouchEvent.TOUCH_TAP, this.click, this);
+ this.draw();
+ this.touchEnabled = true;
+ }
+
+ private touch_begin(evt: egret.TouchEvent): void {
+ this.isUp = false;
+ this.draw();
+ }
+ private touch_end(evt: egret.TouchEvent): void {
+ this.isUp = true;
+ this.draw();
+ }
+ private click(evt: egret.TouchEvent): void {
+ this.dispatchEvent(new egret.Event("CHAGE_STAGE"));
+ }
+
+ private isUp: boolean = true;
+ private draw(): void {
+ this.graphics.clear();
+ this.removeChildren();
+ if (this.isUp) {
+ this.drawUp();
+ } else {
+ this.drawDown();
+ }
+ this.addChild(this.textF);
+ }
+
+ private textF: egret.TextField;
+ private drawText(label: string): void {
+ if (this.textF == null) {
+ let text: egret.TextField = new egret.TextField();
+ text.text = label;
+ text.width = (Context.stageWidth - 30) / 2;
+ text.height = 35;
+ text.size = 22;
+ text.verticalAlign = egret.VerticalAlign.MIDDLE;
+ text.textAlign = egret.HorizontalAlign.CENTER;
+ this.textF = text;
+ this.textF.strokeColor = 0x292b2f;
+ }
+ }
+
+ private drawUp(): void {
+ this.graphics.beginFill(0x666666);
+ this.graphics.lineStyle(2, 0x282828);
+ this.graphics.drawRoundRect(0, 0, (Context.stageWidth - 30) / 2, 35, 15, 15);
+ this.graphics.endFill();
+
+ this.graphics.lineStyle(2, 0x909090, 0.5);
+ this.graphics.moveTo(5, 2);
+ this.graphics.lineTo((Context.stageWidth - 30) / 2 - 5, 2);
+ this.graphics.endFill();
+
+ this.graphics.lineStyle(2, 0x676767, 0.7);
+ this.graphics.moveTo(5, 37);
+ this.graphics.lineTo((Context.stageWidth - 30) / 2 - 5, 37);
+ this.graphics.endFill();
+
+ this.textF.stroke = 0;
+ }
+ private drawDown(): void {
+ this.graphics.beginFill(0x3b3b3b);
+ this.graphics.lineStyle(2, 0x282828);
+ this.graphics.drawRoundRect(0, 0, (Context.stageWidth - 30) / 2, 35, 15, 15);
+ this.graphics.endFill();
+
+ this.graphics.lineStyle(2, 0x313131, 0.5);
+ this.graphics.moveTo(5, 2);
+ this.graphics.lineTo((Context.stageWidth - 30) / 2 - 5, 2);
+ this.graphics.endFill();
+
+ this.graphics.lineStyle(2, 0x676767, 0.7);
+ this.graphics.moveTo(5, 37);
+ this.graphics.lineTo((Context.stageWidth - 30) / 2 - 5, 37);
+ this.graphics.endFill();
+
+ this.textF.stroke = 1;
+ }
+}
+~~~
+
+##### Context.ts
+
+~~~ javascript
+class Context {
+ static stageWidth: number = 0;
+ static stageHeight: number = 0;
+
+ public static init(_stage: egret.Stage): void {
+ Context.stageWidth = _stage.stageWidth;
+ Context.stageHeight = _stage.stageHeight;
+ }
+}
+~~~
+
+
+##### Menu.ts
+
+~~~ javascript
+class Menu extends egret.Sprite {
+
+ public constructor(title: string) {
+ super();
+
+ this.graphics.lineStyle(2, 0x282828);
+ this.graphics.moveTo(0, 35);
+ this.graphics.lineTo(Context.stageWidth, 35);
+ this.graphics.endFill();
+
+ this.graphics.lineStyle(2, 0x6a6a6a);
+ this.graphics.moveTo(0, 37);
+ this.graphics.lineTo(Context.stageWidth, 37);
+ this.graphics.endFill();
+
+ this.drawText(title);
+ this.addChild(this.textF);
+ }
+
+ private textF: egret.TextField;
+ private drawText(label: string): void {
+ if (this.textF == null) {
+ let text: egret.TextField = new egret.TextField();
+ text.text = label;
+ text.width = Context.stageWidth
+ text.height = 35;
+ text.size = 22;
+ text.verticalAlign = egret.VerticalAlign.MIDDLE;
+ text.textAlign = egret.HorizontalAlign.CENTER;
+ this.textF = text;
+ this.textF.strokeColor = 0x292b2f;
+ }
+ }
+
+ private viewNum: number = 0;
+
+ public addTestFunc(label: string, callback: Function, target: Object): void {
+ let btn: Button = new Button(label);
+
+ btn.x = (Context.stageWidth - 30) / 2 + 20;
+ btn.y = 48 + this.viewNum* 47;
+
+ this.addChild(btn);
+ btn.addEventListener("CHAGE_STAGE", callback, target);
+ this.viewNum++;
+ }
+}
+~~~
+
+##### Main.ts
+
+~~~ javascript
+class Main extends egret.DisplayObjectContainer {
+
+ public static menu: any;
+ private static _that: egret.DisplayObjectContainer;
+ public constructor() {
+ super();
+ this.once(egret.Event.ADDED_TO_STAGE, this.addStage, this);
+ }
+
+ private addStage(evt: egret.Event): void {
+ this.initializeAsync();
+
+ FBInstant.startGameAsync().then(() => {
+ egret.log("start game");
+ Main._that = this;
+ Context.init(this.stage);
+ Main.menu = new Menu("Egret Facebook SDK Demo")
+ this.addChild(Main.menu);
+ this.createMenu();
+ });
+ }
+
+ public static backMenu(): void {
+ Main._that.removeChildren();
+ Main._that.addChild(Main.menu);
+ }
+
+ private createMenu(): void {
+ Main.menu.addTestFunc("baseinfo", this.baseinfo, this);
+ Main.menu.addTestFunc("quit", this.quit, this);
+ Main.menu.addTestFunc("logEvent", this.logEvent, this);
+ Main.menu.addTestFunc("shareAsync", this.shareAsync, this);
+ Main.menu.addTestFunc("player", this.player, this);
+ Main.menu.addTestFunc("getConnectedPlayersAsync", this.getEgretConnectedPlayersAsync, this);
+ Main.menu.addTestFunc("contextinfo", this.contextinfo, this);
+ Main.menu.addTestFunc("share", this.share, this);
+ }
+
+ private initializeAsync(): void {
+ FBInstant.initializeAsync().then(function () {
+ egret.log("getLocale:", FBInstant.getLocale());
+ egret.log("getPlatform:", FBInstant.getPlatform());
+ egret.log("getSDKVersion", FBInstant.getSDKVersion());
+ egret.log("getSupportedAPIs", FBInstant.getSupportedAPIs());
+ egret.log("getEntryPointData", FBInstant.getEntryPointData());
+ })
+
+ setTimeout(function () {
+ FBInstant.setLoadingProgress(100);
+ }, 1000);
+ }
+
+ private baseinfo() {
+ egret.log("baseinfo");
+ egret.log("getLocale:", FBInstant.getLocale());
+ egret.log("getPlatform:", FBInstant.getPlatform());
+ egret.log("getSDKVersion", FBInstant.getSDKVersion());
+ egret.log("getSupportedAPIs", FBInstant.getSupportedAPIs());
+ egret.log("getEntryPointData", FBInstant.getEntryPointData());
+ }
+
+ private quit(): void {
+ egret.log("quit");
+ FBInstant.quit();
+ }
+
+ private logEvent(): void {
+ egret.log("logEvent");
+ FBInstant.logEvent("test", 2, { "test": "ta" });
+ }
+
+
+ private shareAsync(): void {
+ egret.log("shareAsync");
+ let data: FBInstant.SharePayload = {
+ intent: "",
+ text: "",
+ image: "",
+ };
+ FBInstant.shareAsync(data);
+ }
+
+
+ private player() {
+ egret.log("player");
+ egret.log("player.getID", FBInstant.player.getID());
+ egret.log("player.getName", FBInstant.player.getName());
+ egret.log("player.getPhoto", FBInstant.player.getPhoto());
+ }
+
+ private async getEgretConnectedPlayersAsync() {
+ egret.log("frends info:::");
+ let datas: FBInstant.ConnectedPlayer[] = await FBInstant.player.getConnectedPlayersAsync();
+ egret.log(datas);
+ datas.forEach(element => {
+ egret.log("player.getID", element.getID());
+ egret.log("player.getName", element.getName());
+ egret.log("player.getPhoto", element.getPhoto());
+ });
+ }
+
+ private contextinfo(): void {
+ egret.log("Context.getID", FBInstant.context.getID());
+ egret.log("Context.getType", FBInstant.context.getType());
+ }
+
+ private share(): void {
+ egret.log("share");
+ let data: FBInstant.SharePayload = {
+ intent: "",
+ text: "",
+ image: "",
+ };
+ FBInstant.shareAsync(data);
+ }
+}
+~~~
+
+## 开发建议
+
+我们建议您,在开发过程中为接入预留接口。本机测试过程中可忽略Facebook接口,当需要在Facebook中测试时,再开启相关API。
+
+## 打包上传
+
+在 index.html 里引入 sdk 的 js 文件。注意:该 js 文件必须像下面这样远程加载,不能放到本地,否则无法通过 Facebook 的审核。
+
+```
+
+```
+
+如果您安装了最新版本的Egret Wing,可点击发布按钮打开上传面板。或者可通过Egret Launcher,项目中的发布设置按钮打开上传面板。
+
+选择**Facebook**选项卡,填写您的APP ID和刚刚生成的上传口令,在备注中,填写此次上传版本的描述信息。
+
+![](a9.png)
+
+点击上传即可将当前项目打包并推送到Facebook服务器中。
+
+## 测试
+
+上传成功了,您可在应用管理后台看到刚刚上传的版本。
+
+![](a11.png)
+
+如要对此版本进行测试,则点击**推送到生产环境**
+
+![](a12.png)
+
+当对应版本从“待命”变为“生产”后,则可对此版本进行测试。
+
+在Facebook Instant Games中,点击**详情**,最下方的**分享游戏**,将当前游戏分享至您的Facebook信息流中。
+
+![](a13.png)
+
+![](a14.png)
+
+在手机Facebook APP中点击您刚刚分享的游戏,可打开游戏进行测试。
+
+![](a152.png) ![](a163.png)
diff --git a/Engine2D/facebookInstantGames/a1.png b/Engine2D/facebookInstantGames/a1.png
new file mode 100644
index 0000000..5291bdf
Binary files /dev/null and b/Engine2D/facebookInstantGames/a1.png differ
diff --git a/Engine2D/facebookInstantGames/a10.png b/Engine2D/facebookInstantGames/a10.png
new file mode 100644
index 0000000..11853a4
Binary files /dev/null and b/Engine2D/facebookInstantGames/a10.png differ
diff --git a/Engine2D/facebookInstantGames/a11.png b/Engine2D/facebookInstantGames/a11.png
new file mode 100644
index 0000000..1125ee3
Binary files /dev/null and b/Engine2D/facebookInstantGames/a11.png differ
diff --git a/Engine2D/facebookInstantGames/a12.png b/Engine2D/facebookInstantGames/a12.png
new file mode 100644
index 0000000..e02428c
Binary files /dev/null and b/Engine2D/facebookInstantGames/a12.png differ
diff --git a/Engine2D/facebookInstantGames/a13.png b/Engine2D/facebookInstantGames/a13.png
new file mode 100644
index 0000000..a470269
Binary files /dev/null and b/Engine2D/facebookInstantGames/a13.png differ
diff --git a/Engine2D/facebookInstantGames/a14.png b/Engine2D/facebookInstantGames/a14.png
new file mode 100644
index 0000000..8ec5a44
Binary files /dev/null and b/Engine2D/facebookInstantGames/a14.png differ
diff --git a/Engine2D/facebookInstantGames/a15.png b/Engine2D/facebookInstantGames/a15.png
new file mode 100644
index 0000000..f9ee4bf
Binary files /dev/null and b/Engine2D/facebookInstantGames/a15.png differ
diff --git a/Engine2D/facebookInstantGames/a152.png b/Engine2D/facebookInstantGames/a152.png
new file mode 100644
index 0000000..da27ecc
Binary files /dev/null and b/Engine2D/facebookInstantGames/a152.png differ
diff --git a/Engine2D/facebookInstantGames/a16.png b/Engine2D/facebookInstantGames/a16.png
new file mode 100644
index 0000000..34f0cdf
Binary files /dev/null and b/Engine2D/facebookInstantGames/a16.png differ
diff --git a/Engine2D/facebookInstantGames/a163.png b/Engine2D/facebookInstantGames/a163.png
new file mode 100644
index 0000000..095ff6e
Binary files /dev/null and b/Engine2D/facebookInstantGames/a163.png differ
diff --git a/Engine2D/facebookInstantGames/a2.png b/Engine2D/facebookInstantGames/a2.png
new file mode 100644
index 0000000..cd53ddc
Binary files /dev/null and b/Engine2D/facebookInstantGames/a2.png differ
diff --git a/Engine2D/facebookInstantGames/a3.png b/Engine2D/facebookInstantGames/a3.png
new file mode 100644
index 0000000..18e49a8
Binary files /dev/null and b/Engine2D/facebookInstantGames/a3.png differ
diff --git a/Engine2D/facebookInstantGames/a4.png b/Engine2D/facebookInstantGames/a4.png
new file mode 100644
index 0000000..5b07172
Binary files /dev/null and b/Engine2D/facebookInstantGames/a4.png differ
diff --git a/Engine2D/facebookInstantGames/a5.png b/Engine2D/facebookInstantGames/a5.png
new file mode 100644
index 0000000..0e56374
Binary files /dev/null and b/Engine2D/facebookInstantGames/a5.png differ
diff --git a/Engine2D/facebookInstantGames/a6.png b/Engine2D/facebookInstantGames/a6.png
new file mode 100644
index 0000000..944fd26
Binary files /dev/null and b/Engine2D/facebookInstantGames/a6.png differ
diff --git a/Engine2D/facebookInstantGames/a7.png b/Engine2D/facebookInstantGames/a7.png
new file mode 100644
index 0000000..d7308ce
Binary files /dev/null and b/Engine2D/facebookInstantGames/a7.png differ
diff --git a/Engine2D/facebookInstantGames/a8.png b/Engine2D/facebookInstantGames/a8.png
new file mode 100644
index 0000000..8277627
Binary files /dev/null and b/Engine2D/facebookInstantGames/a8.png differ
diff --git a/Engine2D/facebookInstantGames/a9.png b/Engine2D/facebookInstantGames/a9.png
new file mode 100644
index 0000000..6863467
Binary files /dev/null and b/Engine2D/facebookInstantGames/a9.png differ
diff --git a/Engine2D/getStarted/helloWorld/56a1a8c3b9412.jpg b/Engine2D/getStarted/helloWorld/56a1a8c3b9412.jpg
new file mode 100644
index 0000000..735c08f
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/56a1a8c3b9412.jpg differ
diff --git a/Engine2D/getStarted/helloWorld/56a1a8c3eb90a.png b/Engine2D/getStarted/helloWorld/56a1a8c3eb90a.png
new file mode 100644
index 0000000..17bdd48
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/56a1a8c3eb90a.png differ
diff --git a/Engine2D/getStarted/helloWorld/README.md b/Engine2D/getStarted/helloWorld/README.md
new file mode 100644
index 0000000..a6b43d9
--- /dev/null
+++ b/Engine2D/getStarted/helloWorld/README.md
@@ -0,0 +1,88 @@
+
+### 安装引擎
+
+下载[Egret Engine](http://www.egret.com/products/engine.html),(可参考:[安装与部署](../../projectConfig/installation/README.md))。
+
+### 安装开发工具
+
+打开 Egret Launcher,会显示登录界面,如下图。
+
+![](./login.png)
+
+登陆成功后会显示 Egret Launcher 主界面。
+
+![](./main.png)
+
+### 创建项目
+
+1、点击菜单 `项目` -> `创建项目` 来创建项目,如下图。
+
+![](./project1.png)
+
+也可以选择 `导入项目` 来导入已有项目。
+
+
+2、在弹出的新建项目面板中,设置项目的基本配置,如下图。
+
+![](project2.png)
+
+* 项目名称
+当前项目的名称,如 HelloWorld。
+
+* 项目路径
+该项目所存放的文件路径。
+
+* 项目类型
+该项目的项目类型,如 Egret 游戏项目 , Egret EUI 项目。
+
+* 引擎版本
+ 当前项目所使用的 Egret 的版本。
+
+* 选择扩展库
+项目中需要使用的系统库。更多关于扩展库选择的介绍可以参考:[扩展库简介](../../projectConfig/extendRepSummary/README.md)
+
+* 舞台尺寸
+ 默认游戏舞台的高度与宽度,以像素为单位.
+
+* 缩放模式
+ 屏幕的适配方式,这里选择showALL模式。更多关于缩放模式的介绍可以参考:[屏幕适配](../../screenAdaptation/zoomMode/README.md)
+
+* 旋转方式
+ 屏幕的旋转模式,这里选择auto模式。更多关于旋转设置的介绍可以参考:[屏幕适配](../../screenAdaptation/rotationMode/README.md)
+
+点击 `创建` ,创建Hello World项目。
+
+项目可以直接在Egret Launcher 中进行打开,管理。
+
+![](project3.png)
+
+### 项目结构
+
+在Egret Wing左侧,可看到当前项目的目录结构:
+
+![](project4.png)
+
+各文件夹功能说明
+* .wing:包括 Egret 项目的任务配置文件和启动配置文件。
+* wingProperties.json:Egret Wing 项目配置文件。
+* bin-debug:项目调试时,所产生的文件存放于此目录。
+* libs:库文件,包括 Egret 核心库和其他扩展库存放于此目录。
+* resource:项目资源文件存放于此目录。
+* scripts:项目构建和发布时需要用到的脚本文件存放在此目录。
+* src:项目代码文件存放于此目录。
+* template:项目模板文件存放于此目录。
+* egretProperties.json:项目的配置文件。具体的配置说明可以参考:[EgretProperties说明](../../projectConfig/configFile/README.md)
+* index.html:入口文件。具体的配置说明可以参考:[入口文件说明](../../projectConfig/indexFile/README.md)
+* manifest.json:网页清单文件。
+* tsconfig.json:typescript 编译配置文件。
+
+
+### 运行项目
+
+点击菜单“项目”->“构建”,编译项目,如下图。
+
+![](build.png)
+
+构建完成之后点击菜单“项目”->“调试”,运行项目,如下图。
+
+![](debug1.png)
diff --git a/Engine2D/getStarted/helloWorld/arrow.png b/Engine2D/getStarted/helloWorld/arrow.png
new file mode 100644
index 0000000..f94619e
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/arrow.png differ
diff --git a/Engine2D/getStarted/helloWorld/build.png b/Engine2D/getStarted/helloWorld/build.png
new file mode 100644
index 0000000..9be3d4b
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/build.png differ
diff --git a/Engine2D/getStarted/helloWorld/create1.jpg b/Engine2D/getStarted/helloWorld/create1.jpg
new file mode 100644
index 0000000..ddac2bd
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/create1.jpg differ
diff --git a/Engine2D/getStarted/helloWorld/create2.jpg b/Engine2D/getStarted/helloWorld/create2.jpg
new file mode 100644
index 0000000..ed86073
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/create2.jpg differ
diff --git a/Engine2D/getStarted/helloWorld/create3.png b/Engine2D/getStarted/helloWorld/create3.png
new file mode 100644
index 0000000..93eb9d1
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/create3.png differ
diff --git a/Engine2D/getStarted/helloWorld/create4.jpg b/Engine2D/getStarted/helloWorld/create4.jpg
new file mode 100644
index 0000000..2c640d1
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/create4.jpg differ
diff --git a/Engine2D/getStarted/helloWorld/debug1.png b/Engine2D/getStarted/helloWorld/debug1.png
new file mode 100644
index 0000000..1017200
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/debug1.png differ
diff --git a/Engine2D/getStarted/helloWorld/down.jpg b/Engine2D/getStarted/helloWorld/down.jpg
new file mode 100644
index 0000000..b4a74bf
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/down.jpg differ
diff --git a/Engine2D/getStarted/helloWorld/login.png b/Engine2D/getStarted/helloWorld/login.png
new file mode 100644
index 0000000..3d86cfa
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/login.png differ
diff --git a/Engine2D/getStarted/helloWorld/main.png b/Engine2D/getStarted/helloWorld/main.png
new file mode 100644
index 0000000..4182d3e
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/main.png differ
diff --git a/Engine2D/getStarted/helloWorld/project1.png b/Engine2D/getStarted/helloWorld/project1.png
new file mode 100644
index 0000000..4741223
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/project1.png differ
diff --git a/Engine2D/getStarted/helloWorld/project2.png b/Engine2D/getStarted/helloWorld/project2.png
new file mode 100644
index 0000000..1cab8c3
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/project2.png differ
diff --git a/Engine2D/getStarted/helloWorld/project3.png b/Engine2D/getStarted/helloWorld/project3.png
new file mode 100644
index 0000000..20b7cdc
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/project3.png differ
diff --git a/Engine2D/getStarted/helloWorld/project4.png b/Engine2D/getStarted/helloWorld/project4.png
new file mode 100644
index 0000000..489fe96
Binary files /dev/null and b/Engine2D/getStarted/helloWorld/project4.png differ
diff --git a/Engine2D/getStarted/lifecycle/README.md b/Engine2D/getStarted/lifecycle/README.md
new file mode 100644
index 0000000..f27d23b
--- /dev/null
+++ b/Engine2D/getStarted/lifecycle/README.md
@@ -0,0 +1,51 @@
+
+在游戏中,用户可以切换应用的前后台。在用户进入后台时,关闭游戏逻辑、渲染逻辑、背景音乐,可以保证更好的用户体验。
+
+
+
+白鹭引擎从 4.1 版本开始引入生命周期管理器:```egret.lifecycle```。其代码示例如下:
+
+```typescript
+egret.lifecycle.onPause = ()=> {
+ console.log("app 进入后台");
+ egret.ticker.pause(); // 关闭渲染与心跳
+}
+egret.lifecycle.onResume = ()=> {
+ console.log("app 进入前台");
+ egret.ticker.resume(); // 打开渲染与心跳
+}
+```
+
+针对不同的游戏运行环境,开发者可以对生命周期管理器进行扩展,以手机QQ举例,其扩展如下:
+
+```typescript
+
+// 手机QQ注册了 appInBackgound 这一变量,在 TypeScript 中进行声明,防止报错
+declare interface Window {
+
+ appInBackgound:boolean;
+}
+
+egret.lifecycle.addLifecycleListener( (context)=>{
+
+ // 方法一:通过事件监听的方式进行通知
+ document.addEventListener("qbrowserVisibilityChange", function(e:any){
+ if (e.hidden){
+ context.pause();
+ }
+ else{
+ context.resume();
+ };
+ });
+
+ // 方法二:在每一帧进行判断
+ context.onUpdate = ()=> {
+ if (window.appInBackgound){
+ context.pause();
+ }
+ else{
+ context.resume();
+ }
+ }
+} )
+```
diff --git a/Engine2D/hit/pixelHit/5565345c3987a.png b/Engine2D/hit/pixelHit/5565345c3987a.png
new file mode 100644
index 0000000..2f6aa1f
Binary files /dev/null and b/Engine2D/hit/pixelHit/5565345c3987a.png differ
diff --git a/Engine2D/hit/pixelHit/5565345c3d61d.png b/Engine2D/hit/pixelHit/5565345c3d61d.png
new file mode 100644
index 0000000..eb38e06
Binary files /dev/null and b/Engine2D/hit/pixelHit/5565345c3d61d.png differ
diff --git a/Engine2D/hit/pixelHit/README.md b/Engine2D/hit/pixelHit/README.md
new file mode 100644
index 0000000..5e54e91
--- /dev/null
+++ b/Engine2D/hit/pixelHit/README.md
@@ -0,0 +1,52 @@
+
+像素碰撞检测,是判断显示对象的图案(非透明区域)是否与一点相交。同样使用 `hitTestPoint()` 方法,用法为:
+
+```javascript
+var isHit:boolean = shp.hitTestPoint( x: number, y:number, true:boolean );
+```
+
+相比于矩形碰撞检测,增加了第三个参数 `true` ,表示要使用像素碰撞检测。
+
+* 示例代码1:
+
+```javascript
+var shp:egret.Shape = new egret.Shape();
+shp.graphics.beginFill( 0xff0000 );
+shp.graphics.drawRect( 0,0,100,100);
+shp.graphics.endFill();
+shp.width = 100;
+shp.height = 100;
+this.addChild( shp );
+
+var isHit:boolean = shp.hitTestPoint( 10, 10, true );
+this.infoText.text = "isHit: " + isHit;
+```
+
+这段代码运行后效果与矩形碰撞检测的效果相同,如图:
+
+![](5565345c3987a.png)
+
+* 示例代码2:
+
+```javascript
+var shp:egret.Shape = new egret.Shape();
+shp.graphics.beginFill( 0xff0000 );
+shp.graphics.drawCircle( 0, 0, 20);
+shp.graphics.endFill();
+shp.width = 100;
+shp.height = 100;
+this.addChild( shp );
+
+var isHit:boolean = shp.hitTestPoint( 25, 25, true );
+this.infoText.text = "isHit: " + isHit;
+```
+
+编译调试后,效果如下图:
+
+![](5565345c3d61d.png)
+
+文本中返回碰撞的结果,显示为 `false`,表示没有发生碰撞,与矩形碰撞检测的结果不同。
+
+这是因为:矩形碰撞检测,是判断显示对象的包围盒是否与一点相交;而像素碰撞检测,是判断显示对象的图案(非透明区域)是否与一点相交。
+
+>大量使用像素碰撞检测,会消耗更多的性能
diff --git a/Engine2D/hit/rectangleHit/5565345c3987a.png b/Engine2D/hit/rectangleHit/5565345c3987a.png
new file mode 100644
index 0000000..2f6aa1f
Binary files /dev/null and b/Engine2D/hit/rectangleHit/5565345c3987a.png differ
diff --git a/Engine2D/hit/rectangleHit/5565345c3d62d.png b/Engine2D/hit/rectangleHit/5565345c3d62d.png
new file mode 100644
index 0000000..4b55ba6
Binary files /dev/null and b/Engine2D/hit/rectangleHit/5565345c3d62d.png differ
diff --git a/Engine2D/hit/rectangleHit/README.md b/Engine2D/hit/rectangleHit/README.md
new file mode 100644
index 0000000..1406b1b
--- /dev/null
+++ b/Engine2D/hit/rectangleHit/README.md
@@ -0,0 +1,103 @@
+
+碰撞检测,判断显示对象是否与一点相交。
+
+矩形碰撞检测,是判断显示对象的包围盒是否与一点相交。
+
+Egret 提供 `hitTestPoint()` 方法进行碰撞检测,矩形碰撞检测的用法为:
+
+```javascript
+var isHit:boolean = shp.hitTestPoint( x: number, y:number );
+```
+
+`shp` 是待检测的显示对象,(x, y)是待检测的点的位置。如果发生碰撞,则方法返回 `true`,如果没有发生碰撞,则返回 `false`。
+
+* 示例代码1:
+
+```javascript
+class HitTest extends egret.DisplayObjectContainer
+{
+ public constructor()
+ {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+
+ private onAddToStage(event:egret.Event)
+ {
+ this.drawText();
+
+ var shp:egret.Shape = new egret.Shape();
+ shp.graphics.beginFill( 0xff0000 );
+ shp.graphics.drawRect( 0,0,100,100);
+ shp.graphics.endFill();
+ shp.width = 100;
+ shp.height = 100;
+ this.addChild( shp );
+
+ var isHit:boolean = shp.hitTestPoint( 10, 10 );
+ this.infoText.text = "isHit: " + isHit;
+
+ }
+
+ private infoText:egret.TextField;
+ private drawText()
+ {
+ this.infoText = new egret.TextField();
+ this.infoText.y = 200;
+ this.infoText.text = "isHit";
+ this.addChild( this.infoText );
+ }
+}
+```
+
+编译调试后,效果如下图:
+
+![](5565345c3987a.png)
+
+文本中返回碰撞的结果,显示为 `true`,表示发生了碰撞。
+
+* 示例代码2:
+
+```javascript
+class HitTest extends egret.DisplayObjectContainer
+{
+ public constructor()
+ {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+
+ private onAddToStage(event:egret.Event)
+ {
+ this.drawText();
+
+ var shp:egret.Shape = new egret.Shape();
+ shp.graphics.beginFill( 0xff0000 );
+ shp.graphics.drawCircle( 0, 0, 20);
+ shp.graphics.endFill();
+ shp.width = 100;
+ shp.height = 100;
+ this.addChild( shp );
+
+ var isHit:boolean = shp.hitTestPoint( 25, 25 );
+ this.infoText.text = "isHit: " + isHit;
+ }
+
+ private infoText:egret.TextField;
+ private drawText()
+ {
+ this.infoText = new egret.TextField();
+ this.infoText.y = 200;
+ this.infoText.text = "isHit: ";
+ this.addChild( this.infoText );
+ }
+}
+```
+
+编译调试后,效果如下图:
+
+![](5565345c3d62d.png)
+
+文本中返回碰撞的结果,显示为 `true`,表示发生了碰撞。
+
+>注意:该点并未与红色圆形直接相交,而是与红色圆形的包围盒相交。
diff --git a/Engine2D/mask/mask/55653415102ac.png b/Engine2D/mask/mask/55653415102ac.png
new file mode 100644
index 0000000..2310b36
Binary files /dev/null and b/Engine2D/mask/mask/55653415102ac.png differ
diff --git a/Engine2D/mask/mask/5565341511ede.png b/Engine2D/mask/mask/5565341511ede.png
new file mode 100644
index 0000000..36b7dfe
Binary files /dev/null and b/Engine2D/mask/mask/5565341511ede.png differ
diff --git a/Engine2D/mask/mask/55a32cdb75779.png b/Engine2D/mask/mask/55a32cdb75779.png
new file mode 100644
index 0000000..fb47dd7
Binary files /dev/null and b/Engine2D/mask/mask/55a32cdb75779.png differ
diff --git a/Engine2D/mask/mask/README.md b/Engine2D/mask/mask/README.md
new file mode 100644
index 0000000..90979ea
--- /dev/null
+++ b/Engine2D/mask/mask/README.md
@@ -0,0 +1,108 @@
+
+遮罩的作用是指定一个显示对象的可见区域,所有显示对象都具备遮罩功能。
+
+## 1.矩形遮罩
+
+矩形遮罩,即显示对象的可见区域是方形显示区域而非不规则显示区域。
+
+用法为:将一个矩形对象赋值给显示对象的 `mask` 属性。
+
+~~~javascript
+shp.mask = new egret.Rectangle(20,20,30,50);
+~~~
+
+> 如果 `rect` 发生变化,需要重新将 `rect` 赋值给 `shp.mask`。
+
+下面示例中绘制了两个 `Shape` 对象,对其中一个 `Shape` 使用矩形遮罩,另外一个 `Shape` 当做参考。代码如下:
+
+~~~javascript
+class Test extends egret.DisplayObjectContainer
+{
+ public constructor()
+ {
+ super();
+ this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
+ }
+
+ private onAddToStage(event:egret.Event)
+ {
+ var shp:egret.Shape = new egret.Shape();
+ shp.graphics.beginFill( 0xff0000 );
+ shp.graphics.drawRect( 0,0,100,100);
+ shp.graphics.endFill();
+ this.addChild( shp );
+
+ var shp2:egret.Shape = new egret.Shape();
+ shp2.graphics.beginFill( 0x00ff00 );
+ shp2.graphics.drawCircle( 0,0, 20);
+ shp2.graphics.endFill();
+ this.addChild( shp2 );
+ shp2.x = 20;
+ shp2.y = 20;
+ }
+}
+~~~
+
+编译运行,效果如下:
+
+![image](55653415102ac.png)
+
+现在对 `shp` 添加遮罩,具体代码如下:
+
+~~~javascript
+var rect:egret.Rectangle = new egret.Rectangle(20,20,30,50);
+shp.mask = rect;
+~~~
+
+
+编译运行,效果如下:
+
+![image](5565341511ede.png)
+
+可以看到,红色的正方形添加了遮罩后只显示了(20,20,30,50)这部分的图像。而未添加遮罩的绿色圆形依然显示完整
+
+
+## 2.显示对象遮罩
+
+显示对象遮罩,即显示对象的可见区域由另一个显示对象确定,可实现不规则遮罩。
+
+用法为:将被遮罩显示对象的 `mask` 属性设置为遮罩对象:
+
+```javascript
+//将maskSprite设置为mySprite的遮罩
+mySprite.mask = maskSprite;
+```
+被遮罩的显示对象的显示区域,在用作遮罩的显示对象的全部不透明区域之内。例如,下面的代码创建一个包含 100 x 100 像素的红色正方形的 `Shape` 实例和一个包含半径为 25 个像素的蓝色圆的 `Sprite` 实例,它被设置为正方形的遮罩。正方形的显示区域,是由圆的不透明区域覆盖的那一部分。
+
+```javascript
+//画一个红色的正方形
+ var square:egret.Shape = new egret.Shape();
+ square.graphics.beginFill(0xff0000);
+ square.graphics.drawRect(0,0,100,100);
+ square.graphics.endFill();
+ this.addChild(square);
+
+//画一个蓝色的圆形
+var circle:egret.Shape = new egret.Shape();
+circle.graphics.beginFill(0x0000ff);
+circle.graphics.drawCircle(25,25,25);
+circle.graphics.endFill();
+this.addChild(circle);
+
+square.mask = circle;
+```
+最终效果如图所示
+
+![](55a32cdb75779.png)
+
+用作遮罩的显示对象可设置动画、动态调整大小。遮罩显示对象不一定需要添加到显示列表中。但是,如果希望在缩放舞台时也缩放遮罩对象,或者如果希望支持用户与遮罩对象的交互(如调整大小),则必须将遮罩对象添加到显示列表中。
+
+通过将 `mask` 属性设置为 `null` 可以删除遮罩:
+
+```javascript
+mySprite.mask = null;
+```
+> 不能使用一个遮罩对象来遮罩另一个遮罩对象。
+
+> 显示对象作为遮罩,无需像矩形遮罩那样重复赋值 `mask`,但是 `mask` 必须是显示列表里的元素。
+
diff --git a/Engine2D/minigame/QQPlay/README.md b/Engine2D/minigame/QQPlay/README.md
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/Engine2D/minigame/QQPlay/README.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Engine2D/minigame/advance/README.md b/Engine2D/minigame/advance/README.md
new file mode 100644
index 0000000..1dd4ac2
--- /dev/null
+++ b/Engine2D/minigame/advance/README.md
@@ -0,0 +1,344 @@
+__注意:__
+
+* 因为小游戏特殊机制,涉及到的小游戏接口主要逻辑都需要写在小游戏逻辑代码内,但是可以通过 Egret 代码来调用
+* 后续版本 Egret 将会提供调用小游戏接口模板,届时大家可以参照模板编写代码。
+
+### 文件系统
+
+文件系统有两类文件:代码包文件和本地文件。
+
+#### 代码包文件
+
+代码包文件指的是在项目目录中添加的文件。由于代码包文件大小限制,代码包文件适用于放置首次加载时需要的文件,对于内容较大或需要动态替换的文件,不推荐用添加到代码包中,推荐在小程序启动之后再用下载接口下载到本地。
+
+##### 访问代码包文件
+
+代码包文件的访问方式是从项目根目录开始写文件路径。
+
+![](code-package.png)
+
+##### 修改代码包文件
+
+代码包内的文件无法在运行后动态修改或删除,修改代码包文件需要重新发布版本。
+
+#### 本地文件
+
+本地文件指的是小程序被用户添加到手机后,会有一块独立的文件存储区域,以用户维度隔离。即同一台手机,每个微信用户不能访问到其他登录用户的文件,同一个用户不同 appId 之间的文件也不能互相访问。
+
+![](file-sandbox.png)
+
+
+本地文件的文件路径均为以下格式:
+
+ {{协议名}}://文件路径
+
+>其中,协议名在 iOS/Android 客户端为 "wxfile",在开发者工具上为 "http",开发者无需关注这个差异,也不应在代码中去硬编码完整文件路径。
+
+##### 本地临时文件
+
+本地临时文件只能通过调用特定接口产生,不能直接写入内容。本地临时文件产生后,仅在当前生命周期内有效,重启之后即不可用。因此,不可把本地临时文件路径存储起来下次使用。如果需要下次在使用,可通过 saveFile 或 copyFile 接口把本地临时文件转换成本地存储文件或本地用户文件。
+
+示例
+
+ wx.chooseImage({
+ success(res) {
+ const tempFilePaths = res.tempFilePaths // tempFilePaths 的每一项是一个本地临时文件路径
+ }
+ })
+
+##### 本地缓存文件
+
+本地存储文件只能通过调用特定接口产生,不能直接写入内容。本地缓存文件产生后,重启之后仍可用。本地缓存文件只能通过 saveFile 接口将本地临时文件保存获得。
+
+示例
+
+ wx.saveFile({
+ tempFilePath: '', // 传入一个本地临时文件路径
+ success(res) {
+ console.log(res.savedFilePath) // res.savedFilePath 为一个本地缓存文件路径
+ }
+ })
+
+>本地缓存文件是最初的设计,1.7.0 版本开始,提供了功能更完整的本地用户文件,可以完全覆盖本地缓存文件的功能,如果不需要兼容低于 1.7.0 版本,可以不使用本地缓存文件。
+
+##### 本地用户文件
+
+本地用户文件是从 1.7.0 版本开始新增的概念。我们提供了一个用户文件目录给开发者,开发者对这个目录有完全自由的读写权限。通过 wx.env.USER_DATA_PATH 可以获取到这个目录的路径。
+
+示例
+
+ // 在本地用户文件目录下创建一个文件 a.txt,写入内容 "hello, world"
+ const fs = wx.getFileSystemManager()
+ fs.writeFileSync(`${wx.env.USER_DATA_PATH}/hello.txt`, 'hello, world', 'utf8')
+
+读写权限
+
+| 接口、组件 | 读 | 写 |
+|---|---|----|
+|代码包文件|有|无|
+|本地临时文件|有|无|
+|本地缓存文件|有|无|
+|本地用户文件|有|有|
+
+### 用户登陆签名
+
+小程序的一部分后台(HTTP)接口要求验证用户登录态。开发者在调用时需提供以session_key为密钥生成的签名。其中session_key是指通过wx.login 获得的登录态。
+
+#### 签名算法
+
+目前支持的签名算法是 hmac_sha256。 对于POST请求,开发者生成签名的算法是:
+
+ signature = hmac_sha256( post_data, session_key )
+
+其中post_data为本次POST请求的数据包。特别地,对于GET请求,post_data等于长度为0的字符串。
+
+ signature = hmac_sha256( "", session_key )
+
+##### 签名示例
+
+例如开发者需要请求的HTTP(POST)接口,其中请求包为一个json字符串。
+
+ curl -d '{"foo":"bar"}' 'https://api.weixin.qq.com/some_api?access_token=xxx&openid=xxx&signature=???&sig_method=hmac_sha256'
+
+开发者需要计算出signature参数。假设用户当前有效的session_key 为 :
+
+ 'o0q0otL8aEzpcZL/FT9WsQ=='
+
+则开发者生成签名应该是
+
+ hmac_sha256('{"foo":"bar"}', 'o0q0otL8aEzpcZL/FT9WsQ==') = 654571f79995b2ce1e149e53c0a33dc39c0a74090db514261454e8dbe432aa0b
+
+开发者服务器发起的HTTP请求
+
+ curl -d '{"foo":"bar"}' 'https://api.weixin.qq.com/some_api?access_token=xxx&openid=xxx&signature=654571f79995b2ce1e149e53c0a33dc39c0a74090db514261454e8dbe432aa0b&sig_method=hmac_sha256'
+
+#### session_key 合法性校验
+
+我们提供接口供开发者校验服务器所保存的登录态session_key是否合法。 为了保持session_key私密性,我们提供的校验接口本身不直接明文session_key,而是通过校验登录态签名完成。
+
+##### 接口地址
+
+请求方法:GET
+
+ https://api.weixin.qq.com/wxa/checksession?access\_token=ACCESS\_TOKEN&signature=SIGNATURE&openid=OPENID&sig\_method=SIG\_METHOD
+
+##### 调用示例
+
+ curl -G 'https://api.weixin.qq.com/wxa/checksession?access_token=OsAoOMw4niuuVbfSxxxxxxxxxxxxxxxxxxx&signature=fefce01bfba4670c85b228e6ca2b493c90971e7c442f54fc448662eb7cd72509&openid=oGZUI0egBJY1zhBYw2KhdUfwVJJE&sig_method=hmac_sha256'
+
+##### 参数说明
+
+| 参数 | 必填 | 说明 |
+|---|---|----|
+|access_token|是|接口调用凭证|
+|openid|是|用户唯一标识符|
+|signature|是|用户登录态签名|
+|sig_method|是|用户登录态签名的哈希方法|
+|buffer|是|托管数据,类型为字符串,长度不超过1000字节|
+
+##### 返回结果
+
+正确时的返回JSON数据包如下:
+
+ {"errcode":0,"errmsg":"ok"}
+
+错误时的返回JSON数据包如下(示例为签名错误):
+
+ {"errcode":87009,"errmsg":"invalid signature"}
+
+### 小游戏转发
+
+用户在使用小游戏过程中,可转发消息给其他用户或群聊。
+
+#### 转发菜单
+
+点击右上角按钮,会弹出菜单,菜单中的“转发”选项默认不展示。通过 wx.showShareMenu 和 wx.hideShareMenu 可动态显示、隐藏这个选项。
+
+#### 被动转发
+
+用户点击右上角菜单中的“转发”选项后,会触发转发事件,如果小游戏通过 wx.onShareAppMessage 监听了这个事件,可通过返回自定义转发参数来修改转发卡片的内容,否则使用默认内容。
+
+示例
+
+ wx.onShareAppMessage(() => {
+ // 用户点击了“转发”按钮
+ return {
+ title: '转发标题'
+ }
+ })
+
+#### 主动转发接口
+
+游戏内可通过 wx.shareAppMessage接口直接调起转发界面,与被动转发类似,可以自定义转发卡片内容。
+
+示例
+
+ wx.shareAppMessage({
+ title: '转发标题'
+ })
+
+#### withShareTicket 模式
+
+通过 wx.updateShareMenu 接口可修改转发属性。如果设置 withShareTicket 为 true ,会有以下效果
+
+* 选择联系人的时候只能选择一个目标,不能多选
+* 消息被转发出去之后,在会话窗口中无法被长按二次转发
+* 消息转发的目标如果是一个群聊,则
+ * 会在转发成功的时候获得一个 shareTicket
+ * 每次用户从这个消息卡片进入的时候,也会获得一个 shareTicket,通过调用 wx.getShareInfo 接口传入 shareTicket 可以获取群相关信息
+
+示例
+
+ // 设置 withShareTicket: true
+ wx.updateShareMenu({
+ withShareTicket: true
+ })
+
+#### 获取更多转发信息
+
+通常开发者希望转发出去的小程序被二次打开的时候能够获取到一些信息,例如群的标识。现在通过调用 wx.showShareMenu 并且设置 withShareTicket 为 true ,当用户将小程序转发到任一群聊之后,可以获取到此次转发的 shareTicket,此转发卡片在群聊中被其他用户打开时,可以通过 getLaunchOptionsSync() 获取到另一个 shareTicket。这两步获取到的 shareTicket 均可通过 wx.getShareInfo() 接口可以获取到相同的转发信息。
+
+### 用户数据的签名验证和加解密
+
+#### 数据签名校验
+
+为了确保开放接口返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。
+
+签名校验算法涉及用户的session_key,通过 wx.login 登录流程获取用户session_key,并自行维护与应用自身登录态的对应关系。
+通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key )
+开发者将 signature、rawData 发送到开发者服务器进行校验。服务器利用用户对应的 session_key 使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的完整性。
+
+##### 如wx.getUserInfo的数据校验:
+
+接口返回的rawData:
+
+ {
+ "nickName": "Band",
+ "gender": 1,
+ "language": "zh_CN",
+ "city": "Guangzhou",
+ "province": "Guangdong",
+ "country": "CN",
+ "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
+ }
+
+用户的 session-key:
+
+ HyVFkGl5F5OQWJZZaNzBBg==
+
+所以,用于签名的字符串为:
+
+ {"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==
+
+使用sha1得到的结果为
+
+ 75e81ceda165f4ffa64f4068af58c64b8f54b88c
+
+#### 加密数据解密算法
+
+接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:
+
+* 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
+* 对称解密的目标密文为 Base64_Decode(encryptedData)。
+* 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
+* 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
+
+另外,为了应用能校验数据的有效性,我们会在敏感数据加上数据水印( watermark )
+
+##### watermark参数说明:
+
+| 参数 | 类型 | 说明 |
+|---|---|----|
+|watermark|OBJECT|数据水印|
+|appid|String|敏感数据归属appid,开发者可校验此参数与自身appid是否一致|
+|timestamp|DateInt|敏感数据获取的时间戳, 开发者可以用于数据时效性校验|
+
+如接口wx.getUserInfo敏感数据当中的watermark:
+
+ {
+ "openId": "OPENID",
+ "nickName": "NICKNAME",
+ "gender": GENDER,
+ "city": "CITY",
+ "province": "PROVINCE",
+ "country": "COUNTRY",
+ "avatarUrl": "AVATARURL",
+ "unionId": "UNIONID",
+ "watermark":
+ {
+ "appid":"APPID",
+ "timestamp":TIMESTAMP
+ }
+ }
+
+注:此前提供的加密数据(encryptData)以及对应的加密算法将被弃用,请开发者不要再依赖旧逻辑。
+
+### 多线程 Worker
+
+对于游戏来说,每帧 16ms 是极其宝贵的,如果有一些可以异步处理的任务,可以放置于 Worker 中运行,待运行结束后,再把结果返回到主线程。Worker 运行于一个单独的全局上下文与线程中,不能直接调用主线程的方法,Worker 也不具备渲染的能力。 Worker 与主线程之间的数据传输,双方使用 postMessage 来发送数据,onMessage 来接收数据,传输的数据并不是直接共享,而是被复制的。
+
+#### 配置 Worker 信息
+
+在 game.json 中可配置 Worker 代码放置的目录,目录下的代码将被打包成一个文件:
+
+配置示例:
+
+ {
+ "workers": "workers"
+ }
+
+#### 添加 Worker 代码文件
+
+根据步骤 1 中的配置,在代码目录下新建以下两个入口文件:
+
+ workers/request/index.js
+ workers/request/utils.js
+ workers/response/index.js
+
+添加后,目录结构如下:
+
+ ├── game.js
+ ├── game.json
+ ├── project.config.json
+ └── workers
+ ├── request
+ │ ├── index.js
+ │ └── utils.js
+ └── response
+ └── index.js
+
+#### 编写 Worker 代码
+
+在 workers/request/index.js 编写 Worker 响应代码
+
+ const utils = require('./utils')
+
+ worker.onMessage(function (res) {
+ console.log(res)
+ })
+
+#### 在主线程中初始化 Worker
+
+在主线程的代码 game.js 中初始化 Worker
+
+ const worker = wx.createWorker('workers/request/index.js') // 文件名指定 worker 的入口文件路径,绝对路径
+
+#### 主线程向 Worker 发送消息
+
+ worker.postMessage({
+ msg: 'hello worker'
+ })
+
+worker 对象的其它接口请看 worker接口说明
+
+#### Tips
+
+* Worker 最大并发数量限制为 1 个,创建下一个前请用 Worker.terminate 结束当前 Worker
+* Worker 内代码只能 require 指定 Worker 路径内的文件,无法引用其它路径
+* Worker 的入口文件由 wx.createWorker 时指定,开发者可动态指定 Worker 入口文件
+* Worker 内不支持 wx 系列的 API
+* Workers 之间不支持发送消息
+
+### 小结
+
+目前文档的版本和微信小游戏官方版本一致,后续 Egret 会针对小游戏的 API 特性进行引擎方面的适配优化,以方便开发者更好、更方便的调用小游戏的接口。
\ No newline at end of file
diff --git a/Engine2D/minigame/advance/code-package.png b/Engine2D/minigame/advance/code-package.png
new file mode 100644
index 0000000..d952604
Binary files /dev/null and b/Engine2D/minigame/advance/code-package.png differ
diff --git a/Engine2D/minigame/advance/file-sandbox.png b/Engine2D/minigame/advance/file-sandbox.png
new file mode 100644
index 0000000..cf3bf68
Binary files /dev/null and b/Engine2D/minigame/advance/file-sandbox.png differ
diff --git a/Engine2D/minigame/api/README.md b/Engine2D/minigame/api/README.md
new file mode 100644
index 0000000..9e8ee28
--- /dev/null
+++ b/Engine2D/minigame/api/README.md
@@ -0,0 +1,132 @@
+### 如何在 Egret 中调用小游戏 API
+
+在 Egret 中是可以直接调用小游戏的 API 的,这篇文档简要介绍如何在 Egret 中使用小游戏的 API。
+
+#### 新增 platform.ts 文件
+
+![](platform.jpeg)
+
+在 src 下新增 platform.ts,代码如下
+
+~~~javascript
+ /**
+ * 平台数据接口。
+ * 由于每款游戏通常需要发布到多个平台上,所以提取出一个统一的接口用于开发者获取平台数据信息
+ * 推荐开发者通过这种方式封装平台逻辑,以保证整体结构的稳定
+ * 由于不同平台的接口形式各有不同,白鹭推荐开发者将所有接口封装为基于 Promise 的异步形式
+ */
+ declare interface Platform {
+
+ getUserInfo(): Promise;
+
+ login(): Promise
+
+ }
+
+ class DebugPlatform implements Platform {
+ async getUserInfo() {
+ return { nickName: "username" }
+ }
+ async login() {
+
+ }
+ }
+
+
+ if (!window.platform) {
+ window.platform = new DebugPlatform();
+ }
+
+
+
+ declare let platform: Platform;
+
+ declare interface Window {
+
+ platform: Platform
+ }
+~~~
+
+这样就可以在 Egret 项目中使用 platform 里的方法了。但是如果我们当前的项目想要发布成 H5 游戏的话也不会报错,保证整个项目的兼容性。
+
+#### 新增 platform.js 文件
+
+通过文末的 [小游戏 API 文档](https://mp.weixin.qq.com/debug/wxagame/dev/document/render/canvas/wx.createCanvas.html),我们可以方便的查看使用小游戏 API。
+
+![](miniplatform.jpeg)
+
+我们 platform.js 代码编写如下
+~~~javascript
+ /**
+ * 请在白鹭引擎的Main.ts中调用 platform.login() 方法调用至此处。
+ */
+
+ class WxgamePlatform {
+
+ name = 'wxgame'
+
+ login() {
+ return new Promise((resolve, reject) => {
+ wx.login({
+ success: (res) => {
+ resolve(res)
+ }
+ })
+ })
+ }
+
+ getUserInfo() {
+ return new Promise((resolve, reject) => {
+ wx.getUserInfo({
+ withCredentials: true,
+ success: function (res) {
+ var userInfo = res.userInfo
+ var nickName = userInfo.nickName
+ var avatarUrl = userInfo.avatarUrl
+ var gender = userInfo.gender //性别 0:未知、1:男、2:女
+ var province = userInfo.province
+ var city = userInfo.city
+ var country = userInfo.country
+ resolve(userInfo);
+ }
+ })
+ })
+ }
+ }
+
+
+ window.platform = new WxgamePlatform();
+~~~
+上述代码使用了小游戏的登陆 API,只需要在 Egret 项目中调用 platform.login() 方法即可。
+
+#### 引入 platform.js
+
+但是在真正运行之前还需要将 platform.js 文件引入进去
+
+![](require.jpeg)
+
+#### 调用小游戏的 API
+
+![](login.jpeg)
+
+最后只需要在你需要的地方添加方法就可了,搞定!
+
+![](clean.jpeg)
+
+运行发现没有效果,因为我刚才已经登陆过了,所以选择清除登录状态。
+
+![](case.jpeg)
+
+然后运行,搞定!
+
+### 小结
+
+因为上述过程 5.1.2 版本都已经集成,项目默认会有一个登陆方法的示例,大家可以按照示例使用其它的小游戏 API,为了保证最好的体验我们元旦回来后再进行更新,感谢大家一直以来的支持。
+
+### 小游戏 API 调用注意事项
+
+因为小游戏 API 运行需要小游戏环境,所以在 H5 上是无法直接预览的,所以你需要在「微信开发者工具」中预览效果。
+
+![](first-game.jpg)
+
+更多 API 请查看:[小游戏 API 文档](https://mp.weixin.qq.com/debug/wxagame/dev/document/render/canvas/wx.createCanvas.html)
diff --git a/Engine2D/minigame/api/case.jpeg b/Engine2D/minigame/api/case.jpeg
new file mode 100644
index 0000000..eaf284f
Binary files /dev/null and b/Engine2D/minigame/api/case.jpeg differ
diff --git a/Engine2D/minigame/api/clean.jpeg b/Engine2D/minigame/api/clean.jpeg
new file mode 100644
index 0000000..c3fc556
Binary files /dev/null and b/Engine2D/minigame/api/clean.jpeg differ
diff --git a/Engine2D/minigame/api/first-game.jpg b/Engine2D/minigame/api/first-game.jpg
new file mode 100644
index 0000000..c40cfd7
Binary files /dev/null and b/Engine2D/minigame/api/first-game.jpg differ
diff --git a/Engine2D/minigame/api/login.jpeg b/Engine2D/minigame/api/login.jpeg
new file mode 100644
index 0000000..16f351f
Binary files /dev/null and b/Engine2D/minigame/api/login.jpeg differ
diff --git a/Engine2D/minigame/api/miniplatform.jpeg b/Engine2D/minigame/api/miniplatform.jpeg
new file mode 100644
index 0000000..cac7ed5
Binary files /dev/null and b/Engine2D/minigame/api/miniplatform.jpeg differ
diff --git a/Engine2D/minigame/api/platform.jpeg b/Engine2D/minigame/api/platform.jpeg
new file mode 100644
index 0000000..56e0651
Binary files /dev/null and b/Engine2D/minigame/api/platform.jpeg differ
diff --git a/Engine2D/minigame/api/require.jpeg b/Engine2D/minigame/api/require.jpeg
new file mode 100644
index 0000000..f045e1d
Binary files /dev/null and b/Engine2D/minigame/api/require.jpeg differ
diff --git a/Engine2D/minigame/cloudapi/README.md b/Engine2D/minigame/cloudapi/README.md
new file mode 100644
index 0000000..a2ad75e
--- /dev/null
+++ b/Engine2D/minigame/cloudapi/README.md
@@ -0,0 +1,104 @@
+# 微信小游戏数据库API
+“小程序·云开发”是微信团队和腾讯云联合打造的“应用服务中台”。秉承高效、易用、安全、低成本的服务理念,为开发者提供稳定高性能的服务。“小程序·云开发”整合了微信公众平台和腾讯云的核心技术,提供云数据库、云存储、云函数、日志和监控等开发运维能力。通过“小程序·云开发”,开发者可无缝安全调用小程序的开放服务,提升开发效率,快速试错和落地产品。
+
+“小程序·云开发”近期新推出的实时数据推送能力,可满足回合制游戏、聊天室、世界消息等小游戏场景需求,具备多端实时数据同步能力,让小游戏开发更高效便捷。
+
+开发者可以在微信小游戏里直接调用API,就可以操作数据库的读写存储等功能,无需搭建服务器。提高开发效率,节约成本。
+[云开发介绍](https://developers.weixin.qq.com/minigame/dev/wxcloud/basis/getting-started.html) [数据库操作API](https://developers.weixin.qq.com/minigame/dev/wxcloud/reference-client-api/database/)
+
+### 一.使用前准备:开通云开发功能
+* 1.创建一个新的小游戏项目,勾选 `小程序.云开发`。 **注意:不能使用测试号**
+
+![](p1.png)
+
+* 2.在左上方的工具栏里点击`云开发`
+
+![](p2.png)
+
+* 3.在弹出的面板里点击`开通`,后续配置一些参数
+
+![](p3.png)
+
+* 4.云开发功能开通完成后,在老项目的 `project.config.json` 中增加一个字段 `"cloudfunctionRoot": "cloudfunction/"`,指定云函数的本地目录
+
+### 二.设置数据库
+* 1.打开云开发控制台 -> 数据库 -> `+` 创建一个名为 `logs` 的集合名称。
+* 2.点击 `添加记录`,使用系统自动生成的 id 创建一条记录。这个 id 在代码中会使用到。
+* 3.点击 `添加字段`,字段名称为 `content`,类型为 `array`
+![](p4.png)
+* 4.切换到 `权限设置`面板,把权限设置为 `所有用户可读,仅创建者可读写`
+![](p5.png)
+
+
+### 三.创建云函数
+因为数据库的权限问题,普通用户要想写入数据,必须使用云函数
+
+* 1.首先在微信小游戏项目中创建一个 `cloudfunction` 文件夹,就是我们刚才在 `project.config.json` 中配置的。然后在微信开发者工具中右键单击这个文件夹,选择 `新建 Node.js 云函数`,然后创建一个名为 `addLog` 的云函数文件夹
+
+![](p6.png)
+
+
+* 2.将 `addLog` 文件夹内的 `index.js` 代码修改如下:
+
+~~~javascript
+// 云函数入口文件
+const cloud = require('wx-server-sdk')
+cloud.init()
+// 云函数入口函数
+exports.main = async (event, context) => {
+ let newValue = event.value;
+ //获取数据库的引用
+ const db = cloud.database()
+ //获取数据库中的数组
+ let oldData = await db.collection('logs').doc('9390f2ff-0318-4826-87d8-78bf31568cab').get()
+ //获取内容的数组
+ let content = oldData.data.content
+ //加入新的数据
+ content.push(newValue)
+ //更新服务器上的数据
+ let newData = await db.collection('logs').doc('9390f2ff-0318-4826-87d8-78bf31568cab').update({
+ data:{
+ content:content
+ }
+ })
+ return newData
+}
+~~~
+* 3.右键在 `addLog` 文件夹上点击 `上传并部署:云端安装依赖`
+
+
+
+
+### 四.代码调用
+* 1.增加服务器上的数据,只要调用刚才创建的 `addLog` 云函数就可以了。
+
+~~~javascript
+wx.cloud.callFunction({
+ name: "addLog",
+ data: {
+ value: "abc" + Math.floor(Math.random() * 100)
+ },
+ success: function (res): any {
+ console.log("增加信息成功", res.result)
+ },
+ fail: function (err): any {
+ console.log("err", err)
+ }
+})
+~~~
+* 2.获取服务器上的数据
+
+~~~javascript
+const db = wx.cloud.database()
+
+db.collection('logs').doc('9390f2ff-0318-4826-87d8-78bf31568cab').get().then(res => {
+ console.log('获取数据', res.data.content)
+})
+~~~
+
+本示例演示了如何增加和查询数据,前端调用 API 即可,不需要后端的开发工作,简化了开发流程。
+
+
+访问官网查询更多的[数据库操作API](https://developers.weixin.qq.com/minigame/dev/wxcloud/reference-client-api/database/)
+
+[本示例Demo的下载地址](http://tool.egret-labs.org/DocZip/engine/tencent/cloudapi.zip) 需要将里面的 appID 和数据库相关参数修改成您自己的才可以测试使用。
diff --git a/Engine2D/minigame/cloudapi/p1.png b/Engine2D/minigame/cloudapi/p1.png
new file mode 100644
index 0000000..e75354f
Binary files /dev/null and b/Engine2D/minigame/cloudapi/p1.png differ
diff --git a/Engine2D/minigame/cloudapi/p2.png b/Engine2D/minigame/cloudapi/p2.png
new file mode 100644
index 0000000..f47da34
Binary files /dev/null and b/Engine2D/minigame/cloudapi/p2.png differ
diff --git a/Engine2D/minigame/cloudapi/p3.png b/Engine2D/minigame/cloudapi/p3.png
new file mode 100644
index 0000000..e4d67b0
Binary files /dev/null and b/Engine2D/minigame/cloudapi/p3.png differ
diff --git a/Engine2D/minigame/cloudapi/p4.png b/Engine2D/minigame/cloudapi/p4.png
new file mode 100644
index 0000000..c057612
Binary files /dev/null and b/Engine2D/minigame/cloudapi/p4.png differ
diff --git a/Engine2D/minigame/cloudapi/p5.png b/Engine2D/minigame/cloudapi/p5.png
new file mode 100644
index 0000000..81cce23
Binary files /dev/null and b/Engine2D/minigame/cloudapi/p5.png differ
diff --git a/Engine2D/minigame/cloudapi/p6.png b/Engine2D/minigame/cloudapi/p6.png
new file mode 100644
index 0000000..2bfa4fa
Binary files /dev/null and b/Engine2D/minigame/cloudapi/p6.png differ
diff --git a/Engine2D/minigame/contrast/README.md b/Engine2D/minigame/contrast/README.md
new file mode 100644
index 0000000..57d6563
--- /dev/null
+++ b/Engine2D/minigame/contrast/README.md
@@ -0,0 +1,83 @@
+
+### 什么是 HTML5 游戏
+
+HTML5 是 HTML 最新的修订版本,2014 年 10 月由万维网联盟(W3C)完成标准制定。目标是取代 1999 年所制定的 HTML4.01 和 XHTML1.0 标准,以期能在互联网应用迅速发展的时候,使网络标准达到匹配当代的网络需求。
+
+广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。HTML5 添加了许多新的语法特征,其中包括 video、audio 和 canvas 元素,同时集成了 SVG 内容。这些元素是为了更容易的在网页中添加和处理多媒体和图片内容而添加的。
+
+HTML5 游戏,简单来讲,可以看作是移动端的页游,无需下载软件即可体验。
+
+##### 优点
+
+* 即点即玩,碎片时间体验
+* 跨平台,手机、PC 均可体验
+* 流量成本低廉,易于推广
+* 开发成本低,快速迭代
+
+##### 缺点
+
+* 兼容性低,需要分别处理
+* 基础设备不完善,体验不好
+* 原生接口无法调用,游戏丰富度不够
+* 游戏性能需要提高,表现效果不够强
+
+
+### 什么是 原生游戏
+
+原生游戏也称手机游戏,是指运行于手机上的手机客户端软件。由于是运行在手机上的客户端软件,所以可以方便的调用手机的摄像头、麦克风等原生接口,可以大大提高 原生游戏的游戏体验。而且,原生游戏可以直接调用 OpenGL 进行图像渲染,保证可以做出炫酷的 2D、3D 游戏。
+
+##### 优点
+
+* 原生接口调用,增强游戏丰富度
+* 游戏性能很高,表现效果很强
+* 引擎支持成熟,开发效率高
+
+##### 缺点
+
+* 包体过大,下载缓慢
+* 竞争激烈,用户获取成本高昂
+* 无法跨平台使用,影响分发
+
+
+### 什么是 小游戏
+
+小游戏是一种即点即玩、无需下载的新的游戏体验形式,它可以让用户以全新的方式在微信上体验游戏。借助于微信社交关系链,游戏内可以显示积分排名等信息,而且用户还可以和好友进行竞技 PK。
+
+##### 优点
+
+* 即点即玩,碎片时间体验
+* 开发成本低,快速迭代
+* 原生接口调用,增强游戏丰富度
+* 游戏性能很高,表现效果很强
+
+##### 缺点
+
+* 只能在微信平台使用
+* 目前成功案例过少
+
+
+### 小游戏与 HTML5游戏、原生游戏对比
+
+##### 表格
+
+下表是根据即点即玩、跨平台、原生接口调用、性能、包体等方面进行的横向对比。
+
+|类别|小游戏|HTML5 游戏|原生游戏|
+|--|--|--|--|
+|即点即玩|是|是|否|
+|入口|微信|可以打开网页的地方|手机桌面|
+|跨平台|否|是|否|
+|原生接口调用|是|否|是|
+|包体|小|小|大|
+|流量成本|低|低|高|
+|留存|高|低|高|
+|性能|中|低|高|
+
+
+##### 说明
+
+小游戏不等于 原生游戏,也不等于 HTML5 游戏,小游戏可以看做是基于 Runtime 的 HTML5 游戏。
+
+正因为这个结构,小游戏可以做到很多 HTML5 游戏做不到的事,比如性能可以无限接近 原生游戏,比如可以调用摄像头、麦克分、微信支付等原生接口;小游戏也可以做到很多 原生游戏做不到的事,比如包体极小 2 秒下载体验。
+
+除此之外小游戏还解决了一直困扰 HTML5 游戏的二次进入的问题,小游戏可以通过微信下拉联系人列表显示最近小程序进行二次进入。
\ No newline at end of file
diff --git a/Engine2D/minigame/introduction/README.md b/Engine2D/minigame/introduction/README.md
new file mode 100644
index 0000000..aba2489
--- /dev/null
+++ b/Engine2D/minigame/introduction/README.md
@@ -0,0 +1,58 @@
+### 什么是小游戏
+
+12 月 28 日消息,微信 iOS 版更新到 6.6.1 版本。该版本有两大亮点:
+
+* 小程序功能升级。主要包括
+ * 微信在主界面新增了小程序任务栏的功能
+ * 小程序菜单进行了升级,并提供小程序间快速切换的功能
+ * 开放了小游戏开发文档和开发者工具
+* 小程序支持新类目——小游戏
+
+![](upgrade.jpg)
+
+### 如何体验小游戏
+
+#### 直接搜索「跳一跳」
+
+你可以直接通过搜索框搜索「跳一跳」如下图所示
+
+![](search.png)
+
+点击「跳一跳」即可体验小游戏
+
+#### 在「发现」-「游戏」-「小游戏」中体验
+
+当然,你也可以到「发现」-「游戏」-「小游戏」体验小游戏
+
+![](game.png)
+
+
+#### 快速启动小游戏
+
+为了让用户更便捷地启动和使用小程序,微信在最新版 6.6.1 的主界面中,增加了小程序任务栏。用户可以通过下拉的动作,唤出任务栏,打开最近使用过的小程序或进入小程序历史列表。
+
+![](switch.jpg)
+
+### 如何快速开发小游戏
+
+小游戏的运行环境在 iOS 上是 JavaScriptCore,在 Android 上是 V8,都是没有 BOM 和 DOM 的运行环境,没有全局的 document 和 window 对象。因此当你希望使用 DOM API 来创建 Canvas 和 Image 等元素的时候,会引发错误。
+
+也就是说如果直接使用主流的 HTML5 游戏引擎如 Egret、Cocos、Laya 开发的游戏是无法直接运行在小游戏上的。
+
+小游戏为主流 HTML5 游戏引擎的适配提供了 Adapter,Adapter 可以使用 wx API 模拟 BOM 和 DOM。顾名思义,这是对基于浏览器环境的游戏引擎在小游戏运行环境下的一层适配层,使游戏引擎在调用 DOM API 和访问 DOM 属性时不会产生错误。
+
+
+##### HTML5 游戏引擎是否支持小游戏
+
+在微信发布新版本后,白鹭引擎第一时间增加了对于微信小游戏开发的支持,开发者只需要使用白鹭引擎的最新版本,通过使用白鹭引擎完整工具流,就可以快速创建、开发与发布微信小游戏,而无需过多的关注底层技术细节。
+
+![](egret.png)
+
+
+##### 已有 HTML5 游戏是否可以转换为小游戏
+
+首先,已有 HTML5 游戏是可以转换为小游戏的。
+
+但是,Egret、Cocos、Laya 为了适配小游戏或多或少都修改了一些底层的业务逻辑,所以需要 HTML5 游戏先升级到对应引擎的最新版,然后按照小游戏的要求修改部分业务逻辑即可发布为小游戏。
+
+以 Egret 为例,需要开发者最低将引擎版本升级到 5.1.1 版本,然后根据小游戏的资源、代码标准稍作修改即可发布为小游戏。
\ No newline at end of file
diff --git a/Engine2D/minigame/introduction/egret.png b/Engine2D/minigame/introduction/egret.png
new file mode 100644
index 0000000..0f635db
Binary files /dev/null and b/Engine2D/minigame/introduction/egret.png differ
diff --git a/Engine2D/minigame/introduction/game.png b/Engine2D/minigame/introduction/game.png
new file mode 100644
index 0000000..a16676f
Binary files /dev/null and b/Engine2D/minigame/introduction/game.png differ
diff --git a/Engine2D/minigame/introduction/search.png b/Engine2D/minigame/introduction/search.png
new file mode 100644
index 0000000..faa99ba
Binary files /dev/null and b/Engine2D/minigame/introduction/search.png differ
diff --git a/Engine2D/minigame/introduction/switch.jpg b/Engine2D/minigame/introduction/switch.jpg
new file mode 100644
index 0000000..ab722a8
Binary files /dev/null and b/Engine2D/minigame/introduction/switch.jpg differ
diff --git a/Engine2D/minigame/introduction/upgrade.jpg b/Engine2D/minigame/introduction/upgrade.jpg
new file mode 100644
index 0000000..1ca3eba
Binary files /dev/null and b/Engine2D/minigame/introduction/upgrade.jpg differ
diff --git a/Engine2D/minigame/limit/README.md b/Engine2D/minigame/limit/README.md
new file mode 100644
index 0000000..a1e76af
--- /dev/null
+++ b/Engine2D/minigame/limit/README.md
@@ -0,0 +1,81 @@
+
+### 4M 说法的由来
+
+小游戏官方文档目前并没有明确指出包体不能超过 4M,但是从各个 CP 的反馈得到的结果是不能超过 4M,以后可能放宽限制,但是目前还是以 4M 为准优化游戏。
+
+### 4M 到底指的是什么
+
+##### 文件夹体积
+
+提到小游戏不能超过 4M 大家的第一反应是就是引擎发布后的游戏文件夹大小或者引擎发布为小游戏文件夹的大小。
+
+* 第一,这个包体肯定不是指引擎发布 H5 游戏后的游戏文件夹大小
+* 第二,这个包体也不是引擎发布为小游戏文件夹的大小
+
+__工具截图说明__
+
+![](tool1.png)
+
+如上图所示,点击预览后,开发者工具会将本地代码进行压缩,然后上传到小游戏服务器上。点击开发者工具右上角的「详情」我们可以看到,引擎发布为小游戏的文件夹大小是本地代码大小 1056KB,而实际上传到小游戏服务器的代码大小为 732KB,所以 4M 是指我们小游戏点击预览后经过开发者工具压缩后的包体体积。
+
+##### 代码压缩
+
+经过我们实验,对本地代码进行去格式和代码压缩对于最终的代码体积几乎没有影响,比如
+
+![](tool2.png)
+
+如上图所示,我在本地对 egret.wxgame.js 和 weapp-adapter.js 进行代码去格式化及压缩,本地代码缩小到了 789KB,但是预览代码包体积依然是 732KB,所以衡量大家代码包体的最终标准是预览时的包体大小。
+
+##### 小结
+
+如果在「详情」-「上次预览」的大小不超过 4M 即符合标准。
+
+### 一般 H5 游戏如何做?
+
+在开始分析小游戏之前我们先回顾一下一般 H5 游戏的做法。
+
+##### 轻度游戏做法
+
+业内一般的标准是 H5 游戏最好保证玩家在看到首屏界面之前加载的代码及资源在 2M 以内,以《猫来了》为例
+
+![](tool3.png)
+
+如上图所示,《猫来了》进入主场景前加载的所有资源在 2M 以内,剩下的 0.9M 是进入主场景以后加载的,这样能够让玩家尽可能短的时间内看到游戏画面。
+
+##### 中重度游戏做法
+
+还有一种方式就是在 2M 以内可以看到服务器选择界面或者角色选择界面,选择服务器后再加载 2M 左右的资源,这种方式适合比较重度的游戏,以《梦道》为例
+
+![](tool4.png)
+
+如上图所示,首屏加载 2M 以内,进入选择服务器界面后后台加载了 1.1M 的资源,这种方式也是可行的。
+
+![](tool5.png)
+
+选择服务器后又加载了 2M 左右的资源,进入选择角色界面,然后在后台加载了 6M 资源,这样把大量资源分到一个个小环节中分解掉。选择角色后再加载很少的一部分资源就可以直接进入游戏。
+
+##### 小结
+
+以上是处理首屏加载的两种方式,接下来咱们看一下小游戏应该如何做才能及如何小游戏的要求又能最大可能的保证玩家的游戏体验。
+
+### 小游戏建议如何做
+
+##### 欢乐消消消
+
+经过了 H5 游戏首屏加载方式的分析,想必大家对于小游戏的加载方式也有些想法。下面以《欢乐消消消》为例
+
+![](mobile1.jpg)
+
+如上图所示,4M 以内的资源在上述界面加载,如果像《跳一跳》一样,资源很少这个界面后就可以直接进入游戏,但是一般的商业游戏资源量没有这么少,所以《欢乐消消消》上述页面加载完毕后,启动了游戏本身的加载页面如下图
+
+![](mobile2.jpg)
+
+第一个界面需要遵守小游戏不能超过 4M 的限制,但是下面这个页面就可以用来加载远程资源了,当然为了用户体验还是需要保证这次加载的资源大小在 2M 左右,其它的资源在进入主界面后在后台加载。
+
+##### 小结
+
+大家可以把所有代码加上 loading 界面的素材放到初始包体中,后续主界面需要的资源在 loading 界面加载,然后进入主界面是一个比较稳妥的方式。
+
+### 如果代码逻辑超过了 4M 怎么办
+
+但是有些游戏代码逻辑过于庞大,导致仅代码体积就超过了 4M,如果游戏包含了 EUI,白鹭引擎后续版本会对 EUI 文件体积进行优化,另一种方式是对游戏代码进行优化,这一部分我们会专门以一篇文章向大家讲解。
\ No newline at end of file
diff --git a/Engine2D/minigame/limit/mobile1.jpg b/Engine2D/minigame/limit/mobile1.jpg
new file mode 100644
index 0000000..e6cb8a1
Binary files /dev/null and b/Engine2D/minigame/limit/mobile1.jpg differ
diff --git a/Engine2D/minigame/limit/mobile2.jpg b/Engine2D/minigame/limit/mobile2.jpg
new file mode 100644
index 0000000..735846e
Binary files /dev/null and b/Engine2D/minigame/limit/mobile2.jpg differ
diff --git a/Engine2D/minigame/limit/tool1.png b/Engine2D/minigame/limit/tool1.png
new file mode 100644
index 0000000..06b56a9
Binary files /dev/null and b/Engine2D/minigame/limit/tool1.png differ
diff --git a/Engine2D/minigame/limit/tool2.png b/Engine2D/minigame/limit/tool2.png
new file mode 100644
index 0000000..360a5ea
Binary files /dev/null and b/Engine2D/minigame/limit/tool2.png differ
diff --git a/Engine2D/minigame/limit/tool3.png b/Engine2D/minigame/limit/tool3.png
new file mode 100644
index 0000000..cf1c48a
Binary files /dev/null and b/Engine2D/minigame/limit/tool3.png differ
diff --git a/Engine2D/minigame/limit/tool4.png b/Engine2D/minigame/limit/tool4.png
new file mode 100644
index 0000000..ae7e737
Binary files /dev/null and b/Engine2D/minigame/limit/tool4.png differ
diff --git a/Engine2D/minigame/limit/tool5.png b/Engine2D/minigame/limit/tool5.png
new file mode 100644
index 0000000..39a55e7
Binary files /dev/null and b/Engine2D/minigame/limit/tool5.png differ
diff --git a/Engine2D/minigame/minigameFAQ/README.md b/Engine2D/minigame/minigameFAQ/README.md
new file mode 100644
index 0000000..77331d4
--- /dev/null
+++ b/Engine2D/minigame/minigameFAQ/README.md
@@ -0,0 +1,165 @@
+首先,再次强调一些微信小游戏的基础技术限制:
+
+* 不允许操作 DOM、BOM、如果必须改成小游戏相应的 API 调用方式,目前引擎会自动引入weapp-adapter.js 文件做兼容处理。
+
+* 不允许动态执行代码的能力,eval、setTimeout 和 setInterval 函数的第一个参数不能为字符串,Function构造函数的参数不能为字符串。
+
+
+* 关于小游戏体积问题,小游戏的体积不得大于 4M,缓存不得大于 50M。具体的解释为:
+
+ 1. 本地的代码和资源不得超过 4M。
+ 2. 单个小游戏项目缓存的文件不能超过 50M,目前当缓存超过 50M 时后续的资源将不会缓存,未来新版的 AssetsManager 将会允许开发者自定义哪些资源需要缓存的机制。
+ 3. 不允许从服务器下载脚本文件。
+
+
+接下来向诸位开发者汇总一下这两天开发者普遍遇到的问题以及解决方案:
+
+### 问题
+
+#### 我在使用白鹭引擎 5.0 / 4.x / 3.x 版本,可以直接转换为微信小游戏么?
+
+答:目前我们只支持白鹭引擎 5.1.x 版本发布为微信小游戏,推荐您使用最新的 5.1.2 版本。[升级教程](../../minigame/publish/README.md)
+
+#### 我在使用 egret res 库,5.1.2 创建的新项目使用的是 assetsmanager 库,这两个库有区别么?
+
+答:assetsmanager 是 res 的替代方案,这两者的 API 有 90% 保持一致,但是仍然有一些小区别,主要是在 RES.Analyzer 上,如果您遇到了相关问题,您可以在 egretProperties.json 中修改模块配置,从 assetsmanager 修改回 res 并执行 egret clean ,这样就可以换成 res 资源管理库了。更改如图所示:
+
+![img](x02.png)
+
+
+#### 微信开发者工具无法识别项目或者无法读取 manifest.js 文件
+
+答:请确保您的微信开发者工具版本是 v1.02.1712280[下载连接](https://mp.weixin.qq.com/debug/wxagame/dev/devtools/download.html?scene=21#wechat_redirect),遇到识别项目或者无法读取manifest.js 文件问题时先写检查下版本是不是太低导致的
+
+
+#### egret 设置横屏后微信小游戏不生效:
+
+答:需要在微信小游戏的项目中找到 game.json 文件,deviceOrientation 参数设置为 landscape,更多设置参考[官方文档](https://mp.weixin.qq.com/debug/wxagame/dev/index.html?t=201813),如图:
+
+![img](x01.png)
+
+下一引擎版本将会自动切换屏幕旋转模式
+
+
+
+#### 当老项目(5.1.2以前)升到到最新版时,发布小游戏项目报错:
+
+答:升级成功后,请首先保证 HTML5 版本可以正常运行,然后再尝试发布为微信小游戏,目前我们遇到了多位开发者通过创建 5.1.2 新项目后拷贝老项目代码和素材的方式尝试升级,由于忽视了修改 egretProperties.json 中的模块配置,导致运行失败的问题。[升级教程](../../minigame/publish/README.md)
+
+#### 在游戏使用到 egret.getDefinitionByName() 报错,找不到对应类时:
+
+答:需要将要反射的类挂载到 window 对象下,例如有个 class People{} 类,需要添加代码 window["People"] = People。[示例demo下载](http://developer.egret.com/cn/statics/downs/testglobal.zip)
+
+#### 在 EUI 中使用自定义组件,发布到微信小程序的 default.thm.js 报错提示找不到自定义组件,错误如图:
+
+![img](x03.png)
+
+答:参考上一条回答,需要将自定义组件暴露到全局作用域。
+
+#### 在小游戏中报错 “Main is not defined” 时,
+
+答:请查看游戏的入口类名是否为 Main,如不是请修改为 Main。
+
+
+#### 找不到 "不检验安全域名、TLS 版本以及 HTTPS 证书" 时如何解决:
+
+答:目前可以在 project.config.json 中手动设置 urlCheck 为 false。
+
+#### 第三方库 Proto Buffer 微信小游戏中使用报错:
+
+答: 因为 protobuf.js 内部包含了加载的逻辑,这部分逻辑需要适配到微信小游戏的 API 才可以使用,目前正在解决这个问题。
+
+#### 在小游戏中播放声音停止后,立即播放会导致没有声音:
+
+答:播放的声音停止后延迟 100ms 再进行播放。
+
+#### 短音效(长度小于 1s 的音效)连续播放会有卡顿、播放不出来等问题:
+
+答:小游戏的支持包升级到 v1.0.15 以上。
+
+#### 小游戏屏幕出现闪烁问题:
+
+答:把开放数据域和主域的帧率都改成 60 帧。
+
+#### 设置声音的音量无效。
+
+答:目前不要设置声音的音量,由于小游戏原生的声音设置 volume 无效,我们正在和微信团队配合,争取尽快解决这个问题。
+
+#### 在 iphone 7plus ios10 系统中会出现文字排版错误。
+答:解决方法:在进入游戏前先判断一下机型和系统型号,如果是 7plus,请切换到 canvas 模式来避免。
+
+#### 使用 navigator.userAgent 在小游戏中获取信息时无论是什么手机的返回值都是一样的 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E8301 MicroMessenger/6.6.0 MiniGame NetType/WIFI Language/zh_CN',
+
+答:目前请暂时避免这种使用方式,这个问题已经反馈给微信团队。
+
+#### 开发者已经安装了最新版微信开发工具,但是执行 egret run --target wxgame 命令时还是提示请安装最新版开发者工具。
+
+
+答:请开发者检查下自己的操作系统是否是 32位 Windows,这是 5.1.2 版本在 32位 Windows系统上的 BUG,我们会尽快修复,在此之前,建议开发者使用 egret publish --target wxgame 发布后,手动使用微信开发者工具打开。
+
+#### 使用 eui 皮肤时报错 'parseFromString' of undefined,如何解决。
+
+答:检查是否使用了 嵌入EXML到代码中,例:
+
+~~~javascript
+ var className = "skins.ButtonSkin";
+ var exmlText = `
+ ...
+ `;
+~~~
+
+需要改成单独的皮肤文件。
+
+
+#### 为什么真机关了调试模式就黑屏。
+
+答:这个问题的本质原因是,您现在没有 appId,用的是体验账号,如果关闭调试模式的话,会触发微信的 request 域名验证,所以就失败了,这个问题只能等到微信开放注册机制才能解决。
+
+
+#### 目前白鹭小游戏支持解析 xml 了吗,该如何使用?
+
+答:
+* 升级小游戏支持库到1.0.12版本
+* 在微信开发者工具的 Console 控制台输入 **egret.wxgame.version** 应输出1.0.12
+
+* 访问 [这里](./xmldom.zip) 下载小游戏xml支持库
+* 解压支持库,并拷贝到微信小游戏目录
+* 打开小游戏目录中 game.js
+* 在 **egret.runEgret** 之前加入代码:**window.DOMParser = require("./xmldom/xmldom.js").DOMParser;**
+
+#### 为什么引入第三方库报 `第三方库 is not defined` 错误.
+
+答:
+我们要再次强调小游戏有很多的限制,首先检查我们所使用的第三方库是否符合小游戏的标准,具体可以参考小游戏官方文档,如果不符合规范,我们只能自己来修改这个库以达到标准。后期我们会整理常用的库提供给开发者。
+经检查适合小游戏的标准,但还是会报我们使用的 **第三放库未定义**,需要我们把第三方库挂在到全局对象 window 上,我们可以在 wxgame.ts 的文件中添加。例如我们加入 zlib 库。如图:
+
+![](x04.png);
+
+#### 在 wing 调用小游戏开发工具,例如使用 run 命令,有如图提示:
+![](x05.png);
+
+答:
+请您直接使用微信开发者工具 打开这个小游戏项目即可。
+
+
+#### 升级到 5.1.5 时会报 `isMobile of function Capabilities` 错误
+
+答:
+升级小游戏包到最新版本(1.0.12)后,重新生成微信小游戏项目,可以解决。
+
+今天就和大家分享这么多。有关更多的问题请您到 egret 论坛 bbs.egret.com 参与讨论。
+
+#### WebGLRenderContext 在模拟器里报错
+![](error-5.png)
+
+ window 系统下,部分独立显卡对模拟器的支持有问题,需要切换成集成显卡。
+
+#### 为什么我动态设置帧频没有效果
+答:小游戏平台只能在 index.html 里设置,不能通过 stage.frameRate 方法动态修改
+
+#### 为什么加载图片时,在模拟器中产生很多类似这种的报错信息
+![](error-6.png)
+
+答:这是为了解决骁龙CPU的手机上产生两份纹理引起的,只会在模拟器上报错,真机上没有影响。把微信小游戏项目里 `library/image.js` 这个`log`注释掉就可以了。
+
+![](error-7.png)
diff --git a/Engine2D/minigame/minigameFAQ/error-5.png b/Engine2D/minigame/minigameFAQ/error-5.png
new file mode 100644
index 0000000..8bba5bb
Binary files /dev/null and b/Engine2D/minigame/minigameFAQ/error-5.png differ
diff --git a/Engine2D/minigame/minigameFAQ/error-6.png b/Engine2D/minigame/minigameFAQ/error-6.png
new file mode 100644
index 0000000..ab57281
Binary files /dev/null and b/Engine2D/minigame/minigameFAQ/error-6.png differ
diff --git a/Engine2D/minigame/minigameFAQ/error-7.png b/Engine2D/minigame/minigameFAQ/error-7.png
new file mode 100644
index 0000000..10cac9c
Binary files /dev/null and b/Engine2D/minigame/minigameFAQ/error-7.png differ
diff --git a/Engine2D/minigame/minigameFAQ/x01.png b/Engine2D/minigame/minigameFAQ/x01.png
new file mode 100644
index 0000000..3ff2ea8
Binary files /dev/null and b/Engine2D/minigame/minigameFAQ/x01.png differ
diff --git a/Engine2D/minigame/minigameFAQ/x02.png b/Engine2D/minigame/minigameFAQ/x02.png
new file mode 100644
index 0000000..c93aaac
Binary files /dev/null and b/Engine2D/minigame/minigameFAQ/x02.png differ
diff --git a/Engine2D/minigame/minigameFAQ/x03.png b/Engine2D/minigame/minigameFAQ/x03.png
new file mode 100644
index 0000000..8125284
Binary files /dev/null and b/Engine2D/minigame/minigameFAQ/x03.png differ
diff --git a/Engine2D/minigame/minigameFAQ/x04.png b/Engine2D/minigame/minigameFAQ/x04.png
new file mode 100644
index 0000000..70b2b7b
Binary files /dev/null and b/Engine2D/minigame/minigameFAQ/x04.png differ
diff --git a/Engine2D/minigame/minigameFAQ/x05.png b/Engine2D/minigame/minigameFAQ/x05.png
new file mode 100644
index 0000000..0785a47
Binary files /dev/null and b/Engine2D/minigame/minigameFAQ/x05.png differ
diff --git a/Engine2D/minigame/minigameFAQ/xmldom.zip b/Engine2D/minigame/minigameFAQ/xmldom.zip
new file mode 100644
index 0000000..6a66ce8
Binary files /dev/null and b/Engine2D/minigame/minigameFAQ/xmldom.zip differ
diff --git a/Engine2D/minigame/openDataContext/README.md b/Engine2D/minigame/openDataContext/README.md
new file mode 100644
index 0000000..c241a81
--- /dev/null
+++ b/Engine2D/minigame/openDataContext/README.md
@@ -0,0 +1,87 @@
+## 开放数据域的使用
+
+### 小游戏开放注册并添加了关系链数据,这一篇主要讲述利用关系链数据开发社交类游戏。
+
+ ![](./a05.jpg)
+
+ * 这张图片是来自于微信小游戏的跳一跳排行榜,小游戏不但开放了用户注册也把关系链数据开放了出来,有了这些数据,普通的开发者也可以开发出类似的排行榜功能,有了关系链数据,会大大增加游戏玩法,玩家之间的互动,给游戏带来了更大的趣味性。
+
+ * 小游戏主要提供了 ~~~wx.getFriendCloudStorage()~~~ 和 ~~~wx.getGroupCloudStorage()~~~ 两个 API 接口。但是为了保护关系链数据,小游戏增加了开放数据域的概念,开放数据域只能在离屏画布(sharedCanvas)上使用,这块画布和主域是可以共享的。我们需要把 sharedCanvas 绘制到主域上,这个过程需要开发者接触底层的 canvas 底层 API,对于不熟悉的同学会带来很大的不便,所以白鹭引擎对做了进一步的优化与封装。
+
+ * 请开发者先阅读微信小游戏开放数据的 [文档](https://mp.weixin.qq.com/debug/wxagame/dev/tutorial/open-ability/open-data.html?t=2018323) 这样对关系链会有更好的理解。
+
+### 使用示例:
+
+1、白鹭引擎使用开放数据域的原理简介。关系链数据必须在开放数据域中获取。引擎在主域中使用 `window["sharedCanvas"]` 接口获取到 sharedCanvas,然后直接使用 sharedCanvas 作为 `egret.Bitmap` 的 `egret.BitmapData` ,即可将开放数据域添加在主域的egret舞台上。这样在使用上带来了极大的方便性。
+
+2、由于 `开放数据域 是一个封闭、独立的 JavaScript 作用域`,因此开放数据域不能与主域共用一套 egret 文件。但如果引入了两套egret 文件又会使得小游戏包体的体积较大。为了减少发布后小游戏的大小,开发者需要直接在 `openDataContext/index.js` 文件中使用Canvas API进行画面绘制,有效减少了包体体积。为了方便开发者高效快速的使用开放数据域和离屏画布,该文件当中已经写好一套可直接使用的排行榜绘制逻辑,开发者可直接进行修改或资源替换,来实现预期的开放数据域的使用。
+
+3、离屏画布的显示对象可直接在主域中通过以下的方式进行创建。
+
+~~~javascript
+//创建开放数据域显示对象
+var platform = window.platform;
+this.bitmap = platform.openDataContext.createDisplayObject(null,this.stage.stageWidth, this.stage.stageHeight);
+~~~
+
+该接口在发布后的项目文件`platform.js`当中可进行查看。创建后的显示对象为 `egre.Bitmap` ,可直接添加到舞台上。
+
+可通过与主域与开放数据域的单向数据接口进行通讯。主域可向开放数据域单方向发送消息。
+
+~~~javascript
+
+//主域向子域发送自定义消息
+platform.openDataContext.postMessage({
+ isDisplay: this.isdisplay,
+ text: 'hello',
+ year: (new Date()).getFullYear(),
+ command: "open"
+});
+
+~~~
+
+子域可通过监听事件的方式获取到主域发送过来的自定义信息。
+
+~~~javascript
+wx.onMessage((data) => {
+ if (data.command == 'open') {
+ //显示开放域
+ if (!hasCreateScene) {
+ //创建并初始化
+ hasCreateScene = createScene();
+ ...
+ }
+}
+~~~
+
+开发者可通过这种方式通知开放域的显示与关闭,或者向开发数据域中传输数据。
+
+4、开放数据域的绘制文件中已经拥有一个通过Canvas API绘制,较为完整的排行榜示例,开发者可以通过修改或者重构该文件来使用离屏画布。
+
+index.js渲染出的默认画面如下图所示。
+
+![](./a06.png)
+
+开发者可通过直接修改 `index.js` 中的 显示属性 数据来达到自己的预期效果,例如 修改`perPageMaxNum`可以改变每页最多显示的玩家个数, 修改 `fontSize` 可以改变字体的大小, 修改 `lastButtonX lastButtonY`来改变向上翻页按钮的位置。这些属性都可以在 `init()` 初始化函数中进行修改。
+
+显示属性示例
+
+![](./a08.png)
+
+init函数示例
+
+![](./a07.png)
+
+建议不要使用固定数字的数值,而是以 `stageWidth stageHeight` 舞台宽高作为基数,以尽量减少不同手机出现的适配问题。
+
+6、开放数据域文件夹中的 `assets` 文件夹负责存放开放数据域中需要用到的图片资源,而且开放数据域也可以跟主域使用相同的图片资源。但需要注意的是,开放数据域的资源需要单独加载。开发者可通过修改 `index.js` 文件中的 `assets` 资源组来进行资源加载,具体见示例 demo。
+
+![](./a09.png)
+
+
+### 注意事项
+ * 一定要帧率为 60 帧。避免屏幕闪烁。
+ * 开放数据域尽量少使用库。
+ * 按照示例 demo 的流程,确认引擎、以及微信开发者工具都是最新了。开放数据还是报错请重新启动微信开发者工具。
+
+今天就先写到这里,具体可以参考示例 demo,如您在开发过程中遇到任何问题,请登录官方论坛进行[讨论](http://bbs.egret.com)。示例 [demo](https://github.com/egret-labs/egret-target-wxgame/tree/master/demos/openDataContext) 下载。
diff --git a/Engine2D/minigame/openDataContext/a01.jpg b/Engine2D/minigame/openDataContext/a01.jpg
new file mode 100644
index 0000000..fecda6d
Binary files /dev/null and b/Engine2D/minigame/openDataContext/a01.jpg differ
diff --git a/Engine2D/minigame/openDataContext/a02.jpg b/Engine2D/minigame/openDataContext/a02.jpg
new file mode 100644
index 0000000..130c53d
Binary files /dev/null and b/Engine2D/minigame/openDataContext/a02.jpg differ
diff --git a/Engine2D/minigame/openDataContext/a03.jpg b/Engine2D/minigame/openDataContext/a03.jpg
new file mode 100644
index 0000000..1c44afc
Binary files /dev/null and b/Engine2D/minigame/openDataContext/a03.jpg differ
diff --git a/Engine2D/minigame/openDataContext/a04.jpg b/Engine2D/minigame/openDataContext/a04.jpg
new file mode 100644
index 0000000..7ab826d
Binary files /dev/null and b/Engine2D/minigame/openDataContext/a04.jpg differ
diff --git a/Engine2D/minigame/openDataContext/a05.jpg b/Engine2D/minigame/openDataContext/a05.jpg
new file mode 100644
index 0000000..68ea1f4
Binary files /dev/null and b/Engine2D/minigame/openDataContext/a05.jpg differ
diff --git a/Engine2D/minigame/openDataContext/a06.png b/Engine2D/minigame/openDataContext/a06.png
new file mode 100644
index 0000000..5b52b89
Binary files /dev/null and b/Engine2D/minigame/openDataContext/a06.png differ
diff --git a/Engine2D/minigame/openDataContext/a07.png b/Engine2D/minigame/openDataContext/a07.png
new file mode 100644
index 0000000..7f9c28b
Binary files /dev/null and b/Engine2D/minigame/openDataContext/a07.png differ
diff --git a/Engine2D/minigame/openDataContext/a08.png b/Engine2D/minigame/openDataContext/a08.png
new file mode 100644
index 0000000..7fa31a0
Binary files /dev/null and b/Engine2D/minigame/openDataContext/a08.png differ
diff --git a/Engine2D/minigame/openDataContext/a09.png b/Engine2D/minigame/openDataContext/a09.png
new file mode 100644
index 0000000..901f30d
Binary files /dev/null and b/Engine2D/minigame/openDataContext/a09.png differ
diff --git a/Engine2D/minigame/package/README.md b/Engine2D/minigame/package/README.md
new file mode 100644
index 0000000..a1b7439
--- /dev/null
+++ b/Engine2D/minigame/package/README.md
@@ -0,0 +1,50 @@
+## 关于微信小游戏中新加入的分包加载 API
+--------------------------------
+微信小游戏增加了分包加载功能(微信 6.6.7 客户端),运用分包功能,小游戏代码包总上限可以从之前的 4 M提升至 8 M。开发者可以根据游戏品类和场景需要,在合适时机加载指定包,提升打开速度,优化用户体验。
+
+微信小游戏之所以提供了分包的策略,最主要的目标是希望开发者将包体积尽可能降低,将首屏加载的压力分散到游戏逻辑中,保证尽快给玩家一个可以交互的界面,而不是停留在微信小游戏的启动页中。为此,微信小游戏本次更新中不仅仅更新了分包加载,也在管理后台的运维中心提供了加载性能监控功能,允许开发者针对上述数据数据分析功能,正是希望通过这些数据分析能力帮助开发者更精细化的优化小游戏的加载效率。
+
+![](./pic1.jpg)
+
+因此,将微信的本次更新简单粗暴的理解为“包体积从4M提升到了8M”是片面的。也很不建议开发者直接这样做,因为目前您仍然要兼容微信不存在分包下载的老版本,如果您将您的游戏直接放置了8M的分包,就会在用户首次启动时必须加载完8M资源才能跳出启动页,这也不是很好的用户体验。
+
+为此,白鹭引擎的策略是,引入一个 loading.js 的逻辑,并将其与白鹭引擎的核心代码(以及最简化的loading资源)打包为主包,然后在 loading.js 中去动态下载子包,并在下载过程中借助已经加载的白鹭引擎为用户渲染出 Loading 界面。
+
+之所以将微信分包策略与白鹭引擎采用这种方式结合,是在效仿页游的分包机制。几乎所有的 Flash 页游都会至少存在两个 SWF 文件(可以近似理解为编译后的代码包文件),第一个SWF文件只负责加载逻辑并保持其体积尽可能小,而真正的业务逻辑由于代码总编译体积很大,都会放在后续加载。
+
+最后用一张图概述:
+![](./pic2.jpg)
+
+## 如何在白鹭引擎中使用分包下载
+------------------------
+借助于白鹭引擎 5.1 版引入的新的自定义构建管线功能,您无需升级白鹭引擎至最新版本,而只是在构建管线中添加一些插件,并调整少量逻辑就可以完成此改动。
+
+考虑到这项功还没有经过长时间的测试,我们暂时不将该功能集成在引擎里,而是给开发者提供一个示例项目。开发者应首先在引擎提供的示例项目中将该功能跑通,然后再将其应用于您的正式项目。
+
+#### 步骤一:下载示例项目
+
+您可以在 [https://github.com/himuil/subPackageDemo](https://github.com/himuil/subPackageDemo) 处下载示例项目,该项目可以直接运行看到效果
+
+该项目使用了 Egret 5.2.3 版本,但是您也可以将 `egretProperties.json` 中的 `engineVersion` 和 `compilerVersion` 调整为您的引擎版本,我们支持 5.1 以上的版本。
+
+#### 步骤二:将该项目移植进您的游戏
+
+* 将 scripts/wxgame/subpackage.ts 拷贝进您的项目
+* 修改 config.wxgame.ts,将 ManifestPlugin 替换为 SubPackagePlugin (注意,您需要修改 build 和 publish)
+* 修改 config.wxgame.ts 中的 CleanPlugin,将 subpackage 对应的目录清除
+* 将示例项目的 EgretSubpackageLoading.js 拷贝进您的微信小游戏项目
+* 修改微信小游戏项目的 game.json,参考示例项目,引入 subpackages 属性
+* 修改微信小游戏项目的 game.js,参考示例项目,重点是添加调用 wx.loadSubPackage 的逻辑
+
+#### 步骤三:高级用法
+
+* 您可以通过修改 SubPackagePlugin 的参数和 game.json 的 subpackage 字段配置多个 subpackage
+* 您可以在游戏过程运行中,而不是游戏初始化时加载某个 subpackage,比如您可以在游戏启动时只加载一个登陆页面,在用户登陆之后再加载游戏主逻辑。
+* 每个 subpackage 可以包含多个 js 文件
+
+## 问题反馈
+--------------------------
+
+该功能目前 **尚未在真实项目中得到验证**,如果您希望在您的项目中添加此功能,强烈建议您联系白鹭引擎官方团队,并时刻关注 https://github.com/himuil/subPackageDemo/issues ,我们非常鼓励您在这里提交您的反馈意见。
+
+
diff --git a/Engine2D/minigame/package/pic1.jpg b/Engine2D/minigame/package/pic1.jpg
new file mode 100644
index 0000000..27607d9
Binary files /dev/null and b/Engine2D/minigame/package/pic1.jpg differ
diff --git a/Engine2D/minigame/package/pic2.jpg b/Engine2D/minigame/package/pic2.jpg
new file mode 100644
index 0000000..496c0d1
Binary files /dev/null and b/Engine2D/minigame/package/pic2.jpg differ
diff --git a/Engine2D/minigame/publish/README.md b/Engine2D/minigame/publish/README.md
new file mode 100644
index 0000000..cdbd3a1
--- /dev/null
+++ b/Engine2D/minigame/publish/README.md
@@ -0,0 +1,70 @@
+## 5.1.2 以后的项目
+
+* 使用引擎为 5.1.2 引擎以上(包括 5.1.2)按照文档流程发布即可。
+
+## 5.1.2 以前的项目
+由于目前的 5.0.x 引擎的项目不能直接升级到 5.1.x,需要我们手动建立一个空的 5.1.2 eui 项目,然后将原项目代码复制过去。
+
+* 首先我们使用 launcher 创建一个 5.1.2 新项目。
+* 然后将现有游戏逻辑和资源拷贝至新项目中主要包括 src 目录、resource 目录、修改配置文件 egretProperties 后续无论是 HTML5 版本,iOS / Android 版本还是小程序版本,均使用这个新项目进行后续开发。
+* 全部拷贝以后,先测试下在 H5 中是否正常运行,一定要保证在 H5 中可以正常运行,再进行后续的操作。
+* 还要将 `ThemeAdapter` 类中的 `getTheme` 方法替换如下代码:
+
+~~~javascript
+ public getTheme(url: string, onSuccess: Function, onError: Function, thisObject: any): void {
+ function onResGet(e: string): void {
+ onSuccess.call(thisObject, e);
+ }
+ function onResError(e: RES.ResourceEvent): void {
+ if (e.resItem.url == url) {
+ RES.removeEventListener(RES.ResourceEvent.ITEM_LOAD_ERROR, onResError, null);
+ onError.call(thisObject);
+ }
+ }
+ if (typeof generateEUI !== 'undefined') {
+ egret.callLater(() => {
+ onSuccess.call(thisObject, generateEUI);
+ }, this);
+ }
+ else {
+ RES.addEventListener(RES.ResourceEvent.ITEM_LOAD_ERROR, onResError, null);
+ RES.getResByUrl(url, onResGet, this, RES.ResourceItem.TYPE_TEXT);
+ }
+ }
+~~~
+
+## 注意事项:
+
+* 小程序和小游戏中都移除了动态执行代码的能力,包括以下调用方式:eval 函数、setTimeout、 setInterval 函数第一个参数传入代码字符串执行、使用 Function 传入字符串构造函数、使用 GeneratorFunction 传入字符串构造生成器函数、
+
+* 项目中使用了 egret.getDefinitionByName() 方法,需要将要反射的类挂载到全局 window 对象上,例:window["object1"] = object1 的方式。
+
+* 项目中使用了自定义组件,需要将自定义组件挂载到全局 window 对象上,例:window["CustomCom"] = CustomCom 的方式。
+
+* 检查是否使用了嵌入EXML到代码中,例:
+
+~~~javascript
+ var className = "skins.ButtonSkin";
+ var exmlText = ` ...
+ `;
+~~~
+
+如果有需要改成单独的皮肤文件。
+
+* ts 代码和 eui 是不允许相同的命令空间,例如:
+
+~~~javascript
+
+
+
+`;
+
+
+namespace ui {
+ export class TestNameSpace {
+ public constructor() {
+ egret.log("测试命令空间输出");
+ }
+ }
+}
+~~~
diff --git a/Engine2D/minigame/roadmap/README.md b/Engine2D/minigame/roadmap/README.md
new file mode 100644
index 0000000..04cef99
--- /dev/null
+++ b/Engine2D/minigame/roadmap/README.md
@@ -0,0 +1,5 @@
+微信小游戏上线或将为HTML5行业带来重要利好,为行业带来机遇与挑战,后续发展有待行业从业者共同探索。白鹭科技作为HTML5引擎研发商致力于为开发者提供更为便捷的开发,白鹭引擎后续会与微信团队进行进一步的技术合作,完善使用白鹭引擎开发微信小游戏的开发体验。主要包含:
+
+* 将微信的文件读写 API 与白鹭引擎资源管理器进行更紧密的集成。
+
+* 开发效率与工作流优化。
\ No newline at end of file
diff --git a/Engine2D/minigame/subdomainCourse/README.md b/Engine2D/minigame/subdomainCourse/README.md
new file mode 100644
index 0000000..6530fdb
--- /dev/null
+++ b/Engine2D/minigame/subdomainCourse/README.md
@@ -0,0 +1,70 @@
+
+## egrte 使用项目示例
+
+### 开发环境准备
+
+* Egret Launcher 1.0.32 以上版本(包括 1.0.32)
+* 白鹭引擎 5.1.2 以上版本(包括 5.1.2)
+* 微信小游戏`主域`模版 1.0.9 版本以上(包括 1.0.9)。获取方式
+* 微信小游戏`子域`模版 1.0.9 版本以上(包括 1.0.9)。获取方式
+* 准备最新版微信开发者工具
+* 从微信公众平台获取了小游戏的 appid,如您自己没有可以使用官方默认提供测试的 appid
+
+### 创建小游戏
+
+* 在任意的文件目录建立一个空的目录为 miniGameSubdomain,在这个目录下使用 launcher 新建一个名为 egretMain 的项目,作为我们的主域项目
+
+![img](x01.png)
+
+* 使用 launcher 将这个项目发布成微信小游戏。这时候可以在 miniGameSubdomain 下看到名为 egretMain_wxgame 的微信小游戏项目
+
+![img](x02.png)
+
+* 在我们刚刚新建好的 miniGameSubdomain 目录中使用 launcher 新建一个名为 egretSub 的项目,作为我们的子域项目。
+
+> 注意:由于小游戏对包体的限制,我们在建立子域项目时应该选择`游戏项目`,强烈建议开发者不要使用 `eui项目`。开发者如不使用 `tween动画`,也可以在 egretProperties.json 文件中删掉这个模块。
+
+![img](x03.png)
+
+* 以上创建好后可以在 miniGameSubdomain 目录下看到三个文件夹,分别为 egretMain、egretMain_wxgame、egretSub。如图:
+
+![img](x04.png)
+
+* 打开新建的 egretSub 子域项目,在 script 目录中找到 config.ts 文件,然后找到发布微信平台的相关代码块 `if (target == 'wxgame')` 将输出目录变量 `outputDir` 的值改为 `../egretMain_wxgame/subContext`;备注:这个变量指向的是子域的发布目录,必须要和微信小游戏项目的目录名保持一致,如图:
+
+![img](x05.png)
+
+* 在 egretSub 项目中执行 egret publish --target wxgame,如果成功会在微信小游戏项目中的 subContext 文件夹下看到 js、resource 文件夹和一个 manifest.js 文件,如图:
+
+![img](x06.png)
+
+* 将我们提供好的子域模版解压后复制到 subContext 目录下。注意在子域中有个限制:子域不能访问文件系统,所以不能加载本地的json文件之类的,而图片因为用的是image所以可以加载的。
+
+![img](x07.png)
+
+* 然后在 subContext 中的 sub.js 文件中需要更改配置,注意:`contentWidth、contentHeight、scaleMode、frameRate、orientation、audioType、`这些配置必须要个主域配置保持一致。
+
+* 注意,如果使用子域,一定要在主域的项目的game.json中配置 ` "subContext":"subContext"`字段。
+
+* 然后将代码:
+
+```
+ const bitmapdata = new egret.BitmapData(window["sharedCanvas"]);
+ bitmapdata.$deleteSource = false;
+ const texture = new egret.Texture();
+ texture._setBitmapData(bitmapdata);
+ const bitmap = new egret.Bitmap(texture);
+ bitmap.width = stageW;
+ bitmap.height = stageH;
+ this.addChild(bitmap);
+ bitmap.addEventListener(egret.Event.ENTER_FRAME, function () {
+ egret.WebGLUtils.deleteWebGLTexture(bitmapdata.webGLTexture);
+ bitmapdata.webGLTexture = null;
+ }, this);
+```
+
+复制到 egretMain 的项目中。简单的说下这段代码的原理,基本原理每帧获取离屏的 canvas ,然后根据获取的 canvas 绘制一个 Bitmap。将这个 Bitmap 添加到主域的舞台上,开发者也可以把这个 bitmap 放到任意的先是对象里。原理类似。
+
+* 在 egretMain 项目中执行 egret run --target wxgame 发布项目并调起微信开发者工具,这样我们就以调试了。
+
+> 注意:再次强调为了减少小游戏的体积,在由于创建 egret 项目时,会在项目添加一些模版文件,不需要的可和文件一定要记得删除,例如 resource 文件夹下面的配置文件,图片都是删除的。
\ No newline at end of file
diff --git a/Engine2D/minigame/subdomainCourse/x01.png b/Engine2D/minigame/subdomainCourse/x01.png
new file mode 100644
index 0000000..36dc1c5
Binary files /dev/null and b/Engine2D/minigame/subdomainCourse/x01.png differ
diff --git a/Engine2D/minigame/subdomainCourse/x02.png b/Engine2D/minigame/subdomainCourse/x02.png
new file mode 100644
index 0000000..1c5b066
Binary files /dev/null and b/Engine2D/minigame/subdomainCourse/x02.png differ
diff --git a/Engine2D/minigame/subdomainCourse/x03.png b/Engine2D/minigame/subdomainCourse/x03.png
new file mode 100644
index 0000000..1f1dc29
Binary files /dev/null and b/Engine2D/minigame/subdomainCourse/x03.png differ
diff --git a/Engine2D/minigame/subdomainCourse/x04.png b/Engine2D/minigame/subdomainCourse/x04.png
new file mode 100644
index 0000000..091a894
Binary files /dev/null and b/Engine2D/minigame/subdomainCourse/x04.png differ
diff --git a/Engine2D/minigame/subdomainCourse/x05.png b/Engine2D/minigame/subdomainCourse/x05.png
new file mode 100644
index 0000000..b24918a
Binary files /dev/null and b/Engine2D/minigame/subdomainCourse/x05.png differ
diff --git a/Engine2D/minigame/subdomainCourse/x06.png b/Engine2D/minigame/subdomainCourse/x06.png
new file mode 100644
index 0000000..06bb4d4
Binary files /dev/null and b/Engine2D/minigame/subdomainCourse/x06.png differ
diff --git a/Engine2D/minigame/subdomainCourse/x07.png b/Engine2D/minigame/subdomainCourse/x07.png
new file mode 100644
index 0000000..1e64317
Binary files /dev/null and b/Engine2D/minigame/subdomainCourse/x07.png differ
diff --git a/Engine2D/minigame/subdomainIntroduce/README.md b/Engine2D/minigame/subdomainIntroduce/README.md
new file mode 100644
index 0000000..8507bab
--- /dev/null
+++ b/Engine2D/minigame/subdomainIntroduce/README.md
@@ -0,0 +1,197 @@
+## 小游戏子域与主域简介
+
+### 什么是子域和主域
+
+为了保证关系链数据的安全,我们创建了一个和执行主体逻辑的 `主域` 独立且隔离的 JS 作用域,称之为 `子域`。主域即是入口文件 `game.js` 运行的 JS 域,子域则是另一入口文件 `sub.js` 运行的 JS 域。子域具有以下特点:
+
+- 可以调用获取群成员数据的等开放数据接口。
+- 不能与第三方服务器通信。
+- 不能调用数据缓存接口。
+- 主域可以向子域自由发送数据,但是子域向主域发送数据的能力受到限制。
+- 子域内只提供绘制交互必须的 API,其余 JSAPI 均不支持。
+
+
+### 子域的限制和可以使用的 API
+
+* 主域和子域是同一个线程内的两个隔离的 JS 作用域,相互之间不可访问彼此的变量。因此如果子域也需要引入游戏引擎,那么引擎文件必须和子域入口文件 sub.js 位于同一目录下。
+
+##### Timer 相关
+- requestAnimationFrame
+- cancelAnimationFrame
+- setTimeout
+- clearTime
+- setInterval
+- clearInterval
+
+##### 触摸事件
+- [wx.onTouchStart]()
+- [wx.onTouchMove]()
+- [wx.onTouchEnd]()
+- [wx.onTouchCancel]()
+- [wx.offTouchStart]()
+- [wx.offTouchMove]()
+- [wx.offTouchEnd]()
+- [wx.offTouchCancel]()
+
+##### 创建画布
+- [wx.createCanvas]()
+** 子域的所有画布只支持 `2D` 渲染模式 **
+
+##### 创建图片
+- [wx.createImage]()
+
+##### 开放数据
+- [wx.getGroupUserGameData]()
+
+##### 通信
+- [postMessage]()
+- [onMessage]()
+
+
+### 使用子域所需的配置
+
+开发者需要在 `game.json` 中指定子域目录。子域的入口文件是 sub.js 必须位于该目录中,且该目录下的 js 文件只能 require 该目录下的其他 js 文件。
+
+```json
+{
+ "subContext": "src/SubContext"
+}
+```
+
+### sharedCanvas
+子域和主域可以访问一个全局共享的离屏画布 sharedCanvas。子域可以在获取关系链数据后将排行榜、群成员列表绘制在 sharedCanvas上,然后由主域再将 sharedCanvas 绘制在主屏上。
+
+#### 交互
+
+sharedCanvas 虽然是离屏画布,但是在 adapter([什么是adapter]())中做了处理,将通过 wx.onTouchStart 监听的屏幕触摸事件透传给了 sharedCanvas。需要注意的是,这里的触摸事件是屏幕触摸事件,该触摸点是否落在画布内还需要开发者自行判断。
+
+
+### 数据
+
+每个用户在游戏中的数据分为两部分:
+
+- 微信数据:包括该用户的 openId、昵称、头像
+- 游戏数据:包括该用户在游戏中的段位、战绩、属性、宠物等信息,有着自己的结构。
+微信数据和游戏数据需要一一对应,由于微信数据不能在主域获取且不会暴露到主域,因此需要开发者将需要和微信数据一并展示的游戏数据托管在微信后台。我们提供了以下接口:
+
+| 接口 | 说明 | 域限制 |
+|---------------------------------------------------------|----------------------|------------------|
+| [createUserGameData]() | 创建用户的游戏数据 | 只有主域可调 |
+| [updateUserGameData]() | 更新用户的游戏数据 | 只有主域可调 |
+| [getGroupUserGameData]() | 获取群成员的游戏数据 | 只有子域可调,且必须是在小程序从群分享卡片打开的情况下 |
+
+存储在微信后台的用户数据结构如下:
+
+| 属性 | 类型 | 说明 |
+|-----------|--------|----------------------------------------------------------------------------------------------------------------------------|
+| openId | String | 用户的微信 openId |
+| nickName | String | 用户的微信昵称 |
+| avatarUrl | String | 用户的微信头像 url |
+| buffer | String | 序列化后的用户的游戏数据。每款游戏的游戏数据都有着自己的结构,微信后台不去理解游戏数据的具体结构,只存储序列化后的游戏数据 |
+
+### 通信
+
+小游戏提供了 [postMessage]() 和 [onMessage]()
+
+#### 主域向子域发送消息
+
+主域向子域发送消息的行为不受限制,postMessage 的参数必须是一个 JavaScript 对象。接口用于主域和子域的通信。
+
+** 示例代码 **
+
+主域
+
+```javascript
+wx.postMessage({ data: 1234 })
+```
+
+子域
+
+```javascript
+wx.onMessage((message) => {
+ console.log('收到主域的消息', message)
+})
+```
+
+#### 子域向主域发送消息
+
+子域每次调用 postMessage 只能向主域发送单个用户的数据。postMessage 方法会拉起一个模态对话框,只有在用户点击确认的情况下数据才会发送到主域。子域 postMessage 参数格式如下所示:
+
+| 属性 | 类型 | 说明 |
+|---------|--------|----------------------------------------------|
+| content | String | 模态对话框的内容 |
+| action | String | 用户的自定义数据,只能是预定义的集合中的一个 |
+| openId | String | 单个用户数据的 openId,且必须是通过 wx.getGroupUserGameData 获取到的某个用户的 openId,postMessage 接口内部会将 openId 转换为相应的用户数据发送给主域 |
+
+需要将关系链中的用户信息给到开发者,通常是当前用户与某位用户发生了战斗、邀请等交互的时候。action 用来描述两个用户之间发生的交互,其的合法值需要开发者在 game.json 中提前定义。
+
+```json
+/** game.json **/
+{
+ "actions": ["invite", "fight", "send_gift"]
+}
+```
+
+** 示例代码 **
+
+子域
+
+```javascript
+wx.onShow((options) => {
+ // 1044 带 shareTicket 的小程序卡片
+ if (options.scene === 1044) {
+ wx.getGroupUserGameData({
+ success: (res) => {
+ let openId = res.data[0].openId
+
+ wx.postMessage({
+ content: '确认邀请该玩家吗?',
+ openId: 'openId',
+ action: 'invite'
+ })
+ },
+ fail: (res) => {
+ console.log(res.errMsg)
+ }
+ })
+ }
+})
+```
+
+主域
+
+```javascript
+wx.onMessage((message) => {
+ console.log('主域收到消息', messsage.data, message.action)
+})
+```
+
+#### 时序
+
+如上文所述,主域和子域只是同一个线程的两个隔离的 JS 作用域。所以主域在调用 postMessage 后,会依次发生以下的事情:
+
+1. 子域执行 onMessage 中的代码
+2. 主域接着执行 postMessage 调用之后的代码
+
+
+** 示例代码 **
+
+主域代码
+```javascript
+wx.postMessage({ number: 123 })
+console.log(123)
+```
+
+子域代码
+```javascript
+wx.onMessage((message) => {
+ var n = 456
+ console.log(message.number + n)
+})
+```
+
+输出结果为:
+子域:579
+主域:123
+
+反之子域调用 postMessage 向主域发送消息也如此。
\ No newline at end of file
diff --git a/Engine2D/minigame/tutorial/README.md b/Engine2D/minigame/tutorial/README.md
new file mode 100644
index 0000000..a4a85af
--- /dev/null
+++ b/Engine2D/minigame/tutorial/README.md
@@ -0,0 +1,39 @@
+### 开发环境准备
+
+* Egret Launcher 1.0.32 以上版本(包括 1.0.32)
+* 白鹭引擎 5.1.2 以上版本(包括 5.1.2)
+* 准备最新版微信开发者工具。[下载地址](https://mp.weixin.qq.com/debug/wxagame/dev/devtools/download.html?scene=21#wechat_redirect)
+* 从微信公众平台获取了小游戏的 appid,如您自己没有可以使用官方默认提供测试的 appid
+
+### 创建小游戏
+
+使用最新的 Egret Launcher 创建 5.1.2 以上版本的项目,项目名字叫做 "helloworld"。
+
+然后在 Egret Launcher 您会看到刚刚创建的项目,点击发布设置:
+
+![](x08.png)
+
+会弹出发布设置面板:
+
+![](x13.png)
+
+其中 AppID 白鹭已经填写了一个默认 AppID,仅用于调试项目。
+项目名称填写要发布微信小游戏的名字。
+
+点击确定按钮后,弹出提示面板(注:只有 Egret Launcher 1.0.37 以上版本会显示“使用微信开发者工具打开”按钮):
+
+![](x11.jpg)
+
+点击“使用微信开发者工具打开”按钮,Launcher 会自动打开开发者工具。
+
+在 wing 编辑器中,修改 egretProperties.json 配置文件中的 target 对象的 current 属性为 wxgame,然后点击调试按钮,会自动打开 微信开发者工具。
+
+![](x12.jpg)
+
+
+开发者也可以使用命令行:
+ * 发布小游戏 ```egret publish --target wxgame``` 命令发布。
+ * 用微信开发者工具打开 ```egret run --target wxgame``` 命令。
+ 注:简写 ```egret publish``` 或 ```egret run``` 将读取 egretProperties.json 配置文件中的 target 对象的 current 属性。
+
+现在就可以运行小游戏了,如在开发中遇到任何问题都可到官方论坛提问,官方团队很愿意为您解答
\ No newline at end of file
diff --git a/Engine2D/minigame/tutorial/x01.png b/Engine2D/minigame/tutorial/x01.png
new file mode 100644
index 0000000..040548b
Binary files /dev/null and b/Engine2D/minigame/tutorial/x01.png differ
diff --git a/Engine2D/minigame/tutorial/x02.png b/Engine2D/minigame/tutorial/x02.png
new file mode 100644
index 0000000..f012ffc
Binary files /dev/null and b/Engine2D/minigame/tutorial/x02.png differ
diff --git a/Engine2D/minigame/tutorial/x06.jpg b/Engine2D/minigame/tutorial/x06.jpg
new file mode 100644
index 0000000..22d078d
Binary files /dev/null and b/Engine2D/minigame/tutorial/x06.jpg differ
diff --git a/Engine2D/minigame/tutorial/x07.png b/Engine2D/minigame/tutorial/x07.png
new file mode 100644
index 0000000..4bed929
Binary files /dev/null and b/Engine2D/minigame/tutorial/x07.png differ
diff --git a/Engine2D/minigame/tutorial/x08.png b/Engine2D/minigame/tutorial/x08.png
new file mode 100644
index 0000000..b12b446
Binary files /dev/null and b/Engine2D/minigame/tutorial/x08.png differ
diff --git a/Engine2D/minigame/tutorial/x09.png b/Engine2D/minigame/tutorial/x09.png
new file mode 100644
index 0000000..75c893a
Binary files /dev/null and b/Engine2D/minigame/tutorial/x09.png differ
diff --git a/Engine2D/minigame/tutorial/x11.jpg b/Engine2D/minigame/tutorial/x11.jpg
new file mode 100644
index 0000000..9708ec0
Binary files /dev/null and b/Engine2D/minigame/tutorial/x11.jpg differ
diff --git a/Engine2D/minigame/tutorial/x12.jpg b/Engine2D/minigame/tutorial/x12.jpg
new file mode 100644
index 0000000..0dfc4a7
Binary files /dev/null and b/Engine2D/minigame/tutorial/x12.jpg differ
diff --git a/Engine2D/minigame/tutorial/x13.png b/Engine2D/minigame/tutorial/x13.png
new file mode 100644
index 0000000..d492d3d
Binary files /dev/null and b/Engine2D/minigame/tutorial/x13.png differ
diff --git a/Engine2D/minigame/useWxPlugin/README.md b/Engine2D/minigame/useWxPlugin/README.md
new file mode 100644
index 0000000..74e10b8
--- /dev/null
+++ b/Engine2D/minigame/useWxPlugin/README.md
@@ -0,0 +1,84 @@
+白鹭引擎插件使用说明
+
+
+#### 什么是引擎插件
+我们发布微信小游戏的时候,里面会带有 `egret.min.js` `eui.min.js` 之类的库文件。玩家每次打开一个小游戏,都要重复的下载这些文件。
+
+现在我们把白鹭引擎做成了微信的插件, 5.2.x 系列的所有版本都上传到了微信服务器上。开发者只要在项目里进行了配置,就可以使用远端的插件,不使用本地的引擎文件。
+
+这样的好处是什么呢?如果一个玩家玩了 A 游戏,里面使用了 5.2.20 版本的引擎插件。然后他又玩了 B 游戏,如果 B 游戏的引擎插件版本和 A 游戏一致,那么这个插件就**不需要重新下载**。这样就可以提高游戏的打开速度,获得更好的用户体验。
+
+#### 白鹭引擎插件使用和调试环境
+* 白鹭引擎 5.2.31 版本
+* 使用微信开发者工具的[RC版本](https://developers.weixin.qq.com/miniprogram/dev/devtools/rc.html)(>=1.02.1911181)或[Nightly版本](https://developers.weixin.qq.com/miniprogram/dev/devtools/nightly.html)(>=1.02.1911202) **注意:正式版还不支持插件功能。**
+* 在 Android 微信和 iOS 微信的7.0.7版本(>=7.0.7),可直接体验和测试插件分离功能。使用了插件分离的小游戏,在console日志中会输出:`plugin ***** inject success/fail!`
+
+**注意**
+
+* 由于微信开发者工具的bug,使用测试版的 APPID 在开启插件功能时会报错,必须使用在微信后台注册过的正式版 APPID 才可以。
+* 目前一个APPID,只支持引用一个插件
+* 目前支持整包小游戏使用插件,以及分包小游戏的主包使用插件
+
+
+#### 白鹭引擎插件使用方法
+1. 在 Egret Launcher 里下载引擎 5.2.31 版本,使用该版本创建一个游戏项目
+2. 打开项目中的 `scripts/config.wxgame.ts` 文件,将 `useWxPlugin` 变量改为 `true`
+![](p4.png)
+3. 在发布成微信小游戏 release 版本后(`egret publish --target wxgame`),会开启插件功能。debug 调试版 (`egret build --target wxgame`),不支持该功能。
+
+##### 老项目升级:
+
+在老项目中执行 `egret upgrade --egretversion 5.2.31` 后会把项目升级成支持插件的版本。
+
+##### 使用其他版本的引擎:
+如果您的项目不想使用最新的 5.2.31 版本 ,要使用其他版本,例如 `5.2.16` 之类的引擎,那么可以做如下操作:
+
+1. 使用最新版引擎 5.2.31 创建一个新项目,把这 3 个文件拷贝到老项目里替换原有文件。
+![](p3.png)
+
+*注意:*其中的 `wxgame.ts` 里会对 `js` 文件做一定的修改,一定要使用我们提供的方法,不要对这块做任何的修改。因为微信会对 `js` 文件做 MD5 校验,任何修改都会改变 MD5 值。
+
+
+2. 在老项目根目录的 `egretProperties.json` 里,把 `compilerVersion` 编译器版本改成 5.2.31。比如在本示例中,引擎代码还是 `5.2.16` 的,但是编译脚本使用 `5.2.31`,这样就能支持把游戏发布成开启微信插件的形式了。
+
+![](p2.png)
+
+#### 使用引擎插件的微信小游戏项目结构说明
+![](p1.png)
+
+1. 在之前的微信小游戏项目里,我们会把所有的引擎文件和游戏逻辑文件都放在 `js` 文件夹内。
+
+2. 在新的项目结构里,增加了一个 `egret-library` 文件夹。
+ - `egret-library`: 放的是引擎库文件
+ - `js`: 放的是项目里的其他 `js` 文件,比如游戏逻辑文件 `main.min.js`
+
+3. 微信开发者工具打包上传的时候,会自动生成两个包。
+ - 带 `egret-library` 文件夹的包:不支持插件功能的老版本微信,会调用这个文件夹内的引擎文件。
+ - 不带 `egret-library` 文件夹的包:支持插件功能的新版本微信会读取这个包,直接调用微信服务器上的引擎插件
+
+
+
+#### FAQ
+* 问:引擎插件里都包含哪些库?
+* 答:包含白鹭引擎官方提供的 7 个库,注意:只包含发布版的 `xx.min.js`, 不包含调试版的`xx.js`。具体的文件列表如下:
+
+```
+egret.min.js
+eui.min.js
+assetsmanager.min.js
+dragonBones.min.js
+game.min.js
+socket.min.js
+tween.min.js
+```
+
+-----
+* 问:如果为了让包体小一些,不考虑兼容老版本微信的玩家,只使用远程插件里的引擎。是否可以不在小游戏项目里放一份引擎,这样可以吗?
+* 答:理论上是可以的,但是微信官方不建议这么做。另外如果使用引擎插件功能,包的总大小会算上线上插件里的引擎代码,所以您自己衡量是否值得。
+
+-----
+* 问:我对引擎做了修改,还可以使用远程插件吗
+* 答:不能做任何修改,而且必须用官方提供的编译配置文件 `script/wxgame/wxgame.ts`里的默认参数发布 。因为微信会校验本地和插件里 js 文件的 MD5 值,只要做了任何一点修改, MD5 值就会不一致,那么微信会调用本地的这个 js 版本,不会使用远程插件里的。
+
+-----
+
diff --git a/Engine2D/minigame/useWxPlugin/p1.png b/Engine2D/minigame/useWxPlugin/p1.png
new file mode 100644
index 0000000..0aa9f21
Binary files /dev/null and b/Engine2D/minigame/useWxPlugin/p1.png differ
diff --git a/Engine2D/minigame/useWxPlugin/p2.png b/Engine2D/minigame/useWxPlugin/p2.png
new file mode 100644
index 0000000..6e3440e
Binary files /dev/null and b/Engine2D/minigame/useWxPlugin/p2.png differ
diff --git a/Engine2D/minigame/useWxPlugin/p3.png b/Engine2D/minigame/useWxPlugin/p3.png
new file mode 100644
index 0000000..acc7301
Binary files /dev/null and b/Engine2D/minigame/useWxPlugin/p3.png differ
diff --git a/Engine2D/minigame/useWxPlugin/p4.png b/Engine2D/minigame/useWxPlugin/p4.png
new file mode 100644
index 0000000..0246aa2
Binary files /dev/null and b/Engine2D/minigame/useWxPlugin/p4.png differ
diff --git a/Engine2D/minigame/usingcache/README.md b/Engine2D/minigame/usingcache/README.md
new file mode 100644
index 0000000..bd43053
--- /dev/null
+++ b/Engine2D/minigame/usingcache/README.md
@@ -0,0 +1,97 @@
+
# 使用 AssetsManager 灵活定制微信小游戏的缓存策略
+
+
+---
+
+
+# 背景知识
+
+微信小游戏分为“游戏包”和“本地缓存”两个存储空间,当开发者将微信小游戏在微信开发者工具中发布时,微信开发者工具会将所有微信工程中的源码和资源进行压缩打包,既“游戏包”,该包体积不能超过4M。
+
+高于4M的资源需要通过服务器进行动态下载,白鹭引擎之前已经提供了动态加载机制,将游戏资源放置在一个外部CDN服务器上。但是之前并没有提供文件缓存功能,所以每一次访问时,用户均会重复从网络下载文件,而不是从本地缓存加载。
+
+
+微信小游戏提供了一套本地文件缓存接口,允许每个游戏最多 50M 资源在本地进行缓存。白鹭引擎在最新的 5.2 稳定版本中已经对此进行了适配,本文将为您讲解如何利用微信小游戏的缓存策略改善游戏的加载体验
+
+# 准备工作
+
+在使用这套机制之前,您需要确保以下几点:
+
+* 您的项目使用的资源管理机制是 AssetsManager
+* 您的项目的白鹭引擎版本大于等于 5.1.11,稳妥起见使用 5.2 为佳,更早版本的引擎存在一个BUG,纹理集图片的资源无法本地缓存。
+
+
+# 步骤一:设置资源为外部读取
+
+在进行缓存之前,您需要将您的游戏资源设置为从外部加载,而非从游戏包加载,如果您之前已经做完了这一步,可以忽略这个步骤。
+
+* 修改您的 **script/config.wxgame.ts** 文件,在发布过程中添加 ResSplitPlugin 插件:
+
+ ~~~javascript
+ commands: [
+ new CleanPlugin({ matchers: ["js", "resource"] }),
+ new CompilePlugin({ libraryType: "release", defines: { DEBUG: false, RELEASE: true } }),
+ new ExmlPlugin('commonjs'), // 非 EUI 项目关闭此设置
+ new WxgamePlugin(),
+ new UglifyPlugin([{
+ sources: ["main.js"],
+ target: "main.min.js"
+ },{
+ sources: ["resource/default.thm.js"],
+ target: "default.thm.min.js"
+ }
+ ]),
+ new ResSplitPlugin({
+ matchers:[
+ {from:"resource/**",to:`../${projectName}_wxgame_remote`}
+ ]
+ }),
+ new ManifestPlugin({ output: 'manifest.js' })
+ ~~~
+ 该插件的用意是,在您执行 egret publish 时,将 resource 文件夹的所有内容发布到 projectname_wxgame_remote 文件夹,而非 projectname_wxgame 文件夹中,这样游戏资源就不会被打包进微信项目。
+* 修改您的**Main.ts**中的配置加载代码,修改为 **RES.loadConfig("default.res.json","http://localhost:8080/resource/");**
+* 执行 **egret publish --target wxgame**,游戏的代码会发布到projectname_wxgame 文件夹,游戏资源会发布到 projectname_wxgame_remote 文件夹,发布之后在projectname_wxgame_remote 架设一台端口为 8080 的本地服务器。
+
+
+这一步完成之后,您的项目就已经支持资源从外部读取。
+
+# 步骤二:启动微信小游戏缓存
+
+* 使用 EgretLauncher 重新发布一次微信小游戏,当您看到白鹭引擎的微信小游戏支持库已经升级至 1.1.0 时表示已经成功。
+* 需要注意的是,由于本升级步骤会覆盖您微信项目的代码,请提前注意备份
+* 如果您已经升级到 1.1.0 的微信小游戏支持库,会发现和之前相比多了一个名为library 的文件夹,其中包含 image.js 、 text.js 、 file-util.js 等几个文件,以及 game.js 中引用了这几个文件。
+* 此时您加载的所有远程资源都会缓存至本地,第二次访问时会从本地加载,而非服务器加载
+
+这一步完成之后,您已经初步完成了对缓存的支持,但是后续还有一些工作需要处理
+
+# 步骤三:处理资源更新
+
+* 由于游戏资源可能升级导致本地版本与服务器版本不一致,您需要处理资源升级的情况,您可以参考 image.js 和 text.js 中提供的 fileutil.fs.remove() 方法,当该方法被执行后,本地缓存目录就会清理。
+* 您可以利用微信小游戏的 updateManager 回调函数,在版本更新时删除所有的微信小游戏缓存。
+* 从更严格的角度来讲,应该设计一套更智能的,基于热更新版本 hash 的机制,但是由于一些技术实现上的细节问题,我们会和微信团队一起配合,在未来提供更简单的调用方式。
+
+
+# 步骤四:处理超过50M的情况
+
+部分游戏的资源可能大于 50M,您可以自由修改 image.js 和 text.js 中的 needCache 函数,编写自己的逻辑,将特定资源不存储于本地
+
+
+
+# 总结
+
+通过上述步骤,您就可以解决微信小游戏的本地缓存问题。从整个过程来看,引擎团队的核心设计思路在于:
+
+* 考虑到不同开发团队有不同的定制需求和工作流,引擎不会将资源缓存这个功能直接写死在引擎代码中,而是放置于用户代码中
+* 引擎会提供一个整体的资源加载框架,引擎的上层只关心加载资源的流程,不关心具体的加载细节(譬如是从网络加载还是先检查本地缓存),这些细节可以由开发者根据自己的需求自由扩展。
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Engine2D/minigamebaidu/baidugameFAQ/README.md b/Engine2D/minigamebaidu/baidugameFAQ/README.md
new file mode 100644
index 0000000..7ad578b
--- /dev/null
+++ b/Engine2D/minigamebaidu/baidugameFAQ/README.md
@@ -0,0 +1,88 @@
+首先,再次强调一些百度小游戏的基础技术限制:
+
+* 不允许操作 DOM、BOM、如果必须改成小游戏相应的 API 调用方式,目前引擎会自动引入swan-game-adapter.js 文件做兼容处理。
+
+* 不允许动态执行代码的能力,eval、setTimeout 和 setInterval 函数的第一个参数不能为字符串,Function构造函数的参数不能为字符串。
+
+
+
+接下来向诸位开发者汇总一下这两天开发者普遍遇到的问题以及解决方案:
+
+### 问题
+
+#### 我在使用白鹭引擎 5.0 / 4.x / 3.x 版本,可以直接转换为百度小游戏么?
+
+答:目前我们只支持白鹭引擎 5.2.13 以上的版本发布为百度小游戏。[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+#### 我在使用 egret res 库,5.2.13 创建的新项目使用的是 assetsmanager 库,这两个库有区别么?
+
+答:assetsmanager 是 res 的替代方案,这两者的 API 有 90% 保持一致,但是仍然有一些小区别,主要是在 RES.Analyzer 上,如果您遇到了相关问题,您可以在 egretProperties.json 中修改模块配置,从 assetsmanager 修改回 res 并执行 egret clean ,这样就可以换成 res 资源管理库了。更改如图所示:
+
+![img](x02.png)
+
+
+
+#### 当老项目(5.2.13以前)升到到最新版时,发布小游戏项目报错:
+
+答:升级成功后,请首先保证 HTML5 版本可以正常运行,然后再尝试发布为百度小游戏,目前我们遇到了多位开发者通过创建 5.2.13 新项目后拷贝老项目代码和素材的方式尝试升级,由于忽视了修改 egretProperties.json 中的模块配置,导致运行失败的问题。[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+#### 在游戏使用到 egret.getDefinitionByName() 报错,找不到对应类时:
+
+答:需要将要反射的类挂载到 window 对象下,例如有个 class People{} 类,需要添加代码 window["People"] = People。[示例demo下载](http://developer.egret.com/cn/statics/downs/testglobal.zip)
+
+#### 在 EUI 中使用自定义组件,发布到百度小游戏的 default.thm.js 报错提示找不到自定义组件,错误如图:
+
+![img](x03.png)
+
+答:参考上一条回答,需要将自定义组件暴露到全局作用域。
+
+#### 在小游戏中报错 “Main is not defined” 时,
+
+答:请查看游戏的入口类名是否为 Main,如不是请修改为 Main。
+
+
+#### 小游戏屏幕出现闪烁问题:
+
+答:把开放数据域和主域的帧率都改成 60 帧。
+
+
+#### 使用 eui 皮肤时报错 'parseFromString' of undefined,如何解决。
+
+答:检查是否使用了 嵌入EXML到代码中,例:
+
+```
+ var className = "skins.ButtonSkin";
+ var exmlText = ` ...
+ `;
+```
+
+需要改成单独的皮肤文件。
+
+
+
+#### 为什么引入第三方库报 ``` 第三方库 is not defined``` 错误.
+
+答:
+我们要再次强调小游戏有很多的限制,首先检查我们所使用的第三方库是否符合小游戏的标准,具体可以参考小游戏官方文档,如果不符合规范,我们只能自己来修改这个库以达到标准。后期我们会整理常用的库提供给开发者。
+经检查适合小游戏的标准,但还是会报我们使用的 ```第三放库未定义```,需要我们把第三方库挂在到全局对象 window 上,我们可以在 baidugame.ts 的文件中添加。例如我们加入 zlib 库。如图:
+
+![](x04.png)
+
+#### 在 wing 调用小游戏开发工具,例如使用 run 命令,有如图提示:
+![](x05.png)
+
+答:
+请您直接使用百度开发者工具 打开这个小游戏项目即可。
+
+#### swan.login() 登录失败,是什么原因
+![](x06.jpg)
+
+答:需要在百度小游戏后台,将你的百度账号添加到`项目成员`里,并给予`开发者权限`。
+
+#### WebGLRenderContext 在模拟器里报错
+![](error-5.png)
+
+ window 系统下,部分独立显卡对模拟器的支持有问题,需要切换成集成显卡。
+
+ #### 为什么我动态设置帧频没有效果
+答:小游戏平台只能在 index.html 里设置,不能通过 stage.frameRate 方法动态修改
diff --git a/Engine2D/minigamebaidu/baidugameFAQ/error-5.png b/Engine2D/minigamebaidu/baidugameFAQ/error-5.png
new file mode 100644
index 0000000..8bba5bb
Binary files /dev/null and b/Engine2D/minigamebaidu/baidugameFAQ/error-5.png differ
diff --git a/Engine2D/minigamebaidu/baidugameFAQ/x02.png b/Engine2D/minigamebaidu/baidugameFAQ/x02.png
new file mode 100644
index 0000000..c93aaac
Binary files /dev/null and b/Engine2D/minigamebaidu/baidugameFAQ/x02.png differ
diff --git a/Engine2D/minigamebaidu/baidugameFAQ/x03.png b/Engine2D/minigamebaidu/baidugameFAQ/x03.png
new file mode 100644
index 0000000..8125284
Binary files /dev/null and b/Engine2D/minigamebaidu/baidugameFAQ/x03.png differ
diff --git a/Engine2D/minigamebaidu/baidugameFAQ/x04.png b/Engine2D/minigamebaidu/baidugameFAQ/x04.png
new file mode 100644
index 0000000..44794c8
Binary files /dev/null and b/Engine2D/minigamebaidu/baidugameFAQ/x04.png differ
diff --git a/Engine2D/minigamebaidu/baidugameFAQ/x05.png b/Engine2D/minigamebaidu/baidugameFAQ/x05.png
new file mode 100644
index 0000000..0785a47
Binary files /dev/null and b/Engine2D/minigamebaidu/baidugameFAQ/x05.png differ
diff --git a/Engine2D/minigamebaidu/baidugameFAQ/x06.jpg b/Engine2D/minigamebaidu/baidugameFAQ/x06.jpg
new file mode 100644
index 0000000..78a6b68
Binary files /dev/null and b/Engine2D/minigamebaidu/baidugameFAQ/x06.jpg differ
diff --git a/Engine2D/minigamebaidu/getStart/README.md b/Engine2D/minigamebaidu/getStart/README.md
new file mode 100644
index 0000000..e304c14
--- /dev/null
+++ b/Engine2D/minigamebaidu/getStart/README.md
@@ -0,0 +1,61 @@
+### 一.开发环境准备
+
+* Egret Launcher 1.0.61 以上版本
+* 白鹭引擎 5.2.13 以上版本
+* 百度小游戏官网:[链接地址](https://smartprogram.baidu.com/docs/introduction/register/),注册账号,获取 appid
+* 准备最新版百度开发者工具:[下载地址](https://smartprogram.baidu.com/docs/game/tutorials/howto/dev/)
+
+
+### 二.创建小游戏
+
+使用最新的 Egret Launcher 创建 5.2.13 以上版本的项目,项目名字叫做 `BaiduDemo`。
+
+然后在 Egret Launcher 您会看到刚刚创建的项目,点击发布设置:
+
+![](p1.png)
+
+会弹出发布设置面板,点击`百度小游戏`
+
+![](p2.png)
+
+填写 AppID ,可以在 [百度智能小游戏官网](https://smartprogram.baidu.com/mappconsole/main/login) 申请
+
+点击确定按钮后,弹出提示面板
+
+![](p3.png)
+
+### 三.编译和发布命令
+
+#### 方法1:开发者可以使用命令行来编译和发布百度小游戏:
+
+ * 编译小游戏: ```egret build --target baidugame```。
+ * 发布小游戏: ```egret publish --target baidugame``` 。
+
+#### 方法2:配置 egretProperties.json
+
+![](p4.png)
+
+如上所示,将 `egretProperties.json` 配置文件中的 `target` 对象的 `current` 属性设置为 `baidugame` 时,可以直接使用```egret build```和```egret publish```命令编译和发布百度小游戏。
+
+### 四.模拟器调试
+![](p5.png)
+
+打开百度开发者工具,点击`打开`按钮
+
+![](p6.png)
+
+选择创建好的百度小游戏项目,注意:项目类型要选择为`小游戏`
+
+![](p7.png)
+
+上图为成功打开项目的样子。
+
+* 注意,点击左上角的`登陆`按钮后,才可以在手机上调试。需要使用手机`百度App`扫码登陆。**注意:**在百度小游戏正式对普通用户开放前,需要使用测试版的App才可以打开,请联系百度获取。
+
+![](p8.png)
+
+登陆成功后,会出现`预览`和`发布`两个按钮。
+
+* 点击`预览`,可以使用`百度App`扫码在手机上调试。
+* 点击`发布`,可以上传到百度后台,审核后正式发布。
+
diff --git a/Engine2D/minigamebaidu/getStart/p1.png b/Engine2D/minigamebaidu/getStart/p1.png
new file mode 100644
index 0000000..3a957d1
Binary files /dev/null and b/Engine2D/minigamebaidu/getStart/p1.png differ
diff --git a/Engine2D/minigamebaidu/getStart/p2.png b/Engine2D/minigamebaidu/getStart/p2.png
new file mode 100644
index 0000000..f58e4f1
Binary files /dev/null and b/Engine2D/minigamebaidu/getStart/p2.png differ
diff --git a/Engine2D/minigamebaidu/getStart/p3.png b/Engine2D/minigamebaidu/getStart/p3.png
new file mode 100644
index 0000000..57da6b6
Binary files /dev/null and b/Engine2D/minigamebaidu/getStart/p3.png differ
diff --git a/Engine2D/minigamebaidu/getStart/p4.png b/Engine2D/minigamebaidu/getStart/p4.png
new file mode 100644
index 0000000..e9d1c09
Binary files /dev/null and b/Engine2D/minigamebaidu/getStart/p4.png differ
diff --git a/Engine2D/minigamebaidu/getStart/p5.png b/Engine2D/minigamebaidu/getStart/p5.png
new file mode 100644
index 0000000..7c9c00e
Binary files /dev/null and b/Engine2D/minigamebaidu/getStart/p5.png differ
diff --git a/Engine2D/minigamebaidu/getStart/p6.png b/Engine2D/minigamebaidu/getStart/p6.png
new file mode 100644
index 0000000..bcd169b
Binary files /dev/null and b/Engine2D/minigamebaidu/getStart/p6.png differ
diff --git a/Engine2D/minigamebaidu/getStart/p7.png b/Engine2D/minigamebaidu/getStart/p7.png
new file mode 100644
index 0000000..06cafff
Binary files /dev/null and b/Engine2D/minigamebaidu/getStart/p7.png differ
diff --git a/Engine2D/minigamebaidu/getStart/p8.png b/Engine2D/minigamebaidu/getStart/p8.png
new file mode 100644
index 0000000..089177b
Binary files /dev/null and b/Engine2D/minigamebaidu/getStart/p8.png differ
diff --git a/Engine2D/minigamemy/getStart/README.md b/Engine2D/minigamemy/getStart/README.md
new file mode 100644
index 0000000..7ff7714
--- /dev/null
+++ b/Engine2D/minigamemy/getStart/README.md
@@ -0,0 +1,42 @@
+### 一.开发环境准备
+
+* Egret Launcher 1.1.4 以上版本
+* 白鹭引擎 5.2.33 以上版本
+
+
+### 二.创建小游戏和可视化编译打包小游戏
+
+1. 使用最新的 Egret Launcher 创建一个 Egret 游戏项目,引擎使用 5.2.33 以上版本。
+创建完成后,会在 Egret Launcher 的列表里看到该项目。点击发布设置:
+![](p1.png)
+2. 选择 `支付宝小游戏` 标签,点击`确定`,创建项目
+![](p2.png)
+3. 创建成功后,点击`发布`标签,可以可视化的发布小游戏包
+![](p3.png)
+游戏代码类型:把游戏的代码编译到小游戏的项目里
+ * Debug: 相当于执行命令 `egret build --target mygame`
+ * Release: 相当于执行命令 `egret publish --target mygame`
+
+
+
+### 三.使用命令行把白鹭游戏编译到小游戏项目
+#### 方法1:开发者可以使用命令行来编译和发布到支付宝小游戏项目中:
+
+ * dubug 模式: ```egret build --target mygame```
+ * release 模式: ```egret publish --target mygame```
+
+#### 方法2:配置 egretProperties.json
+
+```
+"engineVersion": "5.2.33",
+"compilerVersion": "5.2.33",
+"template": {},
+"target": {
+ "current": "mygame"
+},
+```
+
+如上所示,将 `egretProperties.json` 配置文件中的 `current` 属性设置为 `mygame` 时,可以直接使用```egret build``` 或者 ```egret publish``` 命令编译和发布支付宝小游戏。
+
+
+
diff --git a/Engine2D/minigamemy/getStart/p1.png b/Engine2D/minigamemy/getStart/p1.png
new file mode 100644
index 0000000..bd8833d
Binary files /dev/null and b/Engine2D/minigamemy/getStart/p1.png differ
diff --git a/Engine2D/minigamemy/getStart/p2.png b/Engine2D/minigamemy/getStart/p2.png
new file mode 100644
index 0000000..a880b6e
Binary files /dev/null and b/Engine2D/minigamemy/getStart/p2.png differ
diff --git a/Engine2D/minigamemy/getStart/p3.png b/Engine2D/minigamemy/getStart/p3.png
new file mode 100644
index 0000000..fb42559
Binary files /dev/null and b/Engine2D/minigamemy/getStart/p3.png differ
diff --git a/Engine2D/minigamemy/getStart/p4.png b/Engine2D/minigamemy/getStart/p4.png
new file mode 100644
index 0000000..ffa4c76
Binary files /dev/null and b/Engine2D/minigamemy/getStart/p4.png differ
diff --git a/Engine2D/minigamemy/mygameFAQ/README.md b/Engine2D/minigamemy/mygameFAQ/README.md
new file mode 100644
index 0000000..ad35961
--- /dev/null
+++ b/Engine2D/minigamemy/mygameFAQ/README.md
@@ -0,0 +1,86 @@
+首先,强调一些支付宝小游戏的基础技术限制:
+
+* 不允许操作 DOM、BOM、如果必须改成块游戏相应的 API 调用方式
+
+* 不允许动态执行代码的能力,eval、setTimeout 和 setInterval 函数的第一个参数不能为字符串,Function构造函数的参数不能为字符串。
+* 同时只能创建6个声音对象,超出的会覆盖掉老的声音对象。
+
+
+接下来汇总一下开发者普遍遇到的问题以及解决方案:
+
+### 问题
+
+#### 我在使用白鹭引擎 5.0 / 4.x / 3.x 版本,可以直接转换为支付宝小游戏游戏么?
+
+答:目前我们只支持白鹭引擎 5.2.19 以上的版本发布为支付宝小游戏。老版本的项目,[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+
+#### 我在使用 egret res 库,5.2.19 创建的新项目使用的是 assetsmanager 库,这两个库有区别么?
+
+答:assetsmanager 是 res 的替代方案,这两者的 API 有 90% 保持一致,但是仍然有一些小区别,主要是在 RES.Analyzer 上,如果您遇到了相关问题,您可以在 egretProperties.json 中修改模块配置,从 assetsmanager 修改回 res 并执行 egret clean ,这样就可以换成 res 资源管理库了。更改如图所示:
+
+![img](x02.png)
+
+
+
+#### 当老项目(5.2.19以前)升到到最新版时,发布小游戏项目报错:
+
+答:升级成功后,请首先保证 HTML5 版本可以正常运行,然后再尝试发布为支付宝小游戏,目前我们遇到了多位开发者通过创建 5.2.19 新项目后拷贝老项目代码和素材的方式尝试升级,由于忽视了修改 egretProperties.json 中的模块配置,导致运行失败的问题。[参考微信小游戏升级指南](../../minigame/publish/README.md)
+#### 在游戏使用到 egret.getDefinitionByName() 报错,找不到对应类时:
+
+答:需要将要反射的类挂载到 window 对象下,例如有个 class People{} 类,需要添加代码 window["People"] = People。[参考微信小游戏示例demo](http://developer.egret.com/cn/statics/downs/testglobal.zip)
+
+#### 在 EUI 中使用自定义组件,发布到支付宝小游戏的 default.thm.js 报错提示找不到自定义组件,错误如图:
+
+![img](x03.png)
+
+答:参考上一条回答,需要将自定义组件暴露到全局作用域。
+
+#### 在小游戏中报错 “Main is not defined” 时,
+
+答:请查看游戏的入口类名是否为 Main,如不是请修改为 Main。
+
+
+
+#### 使用 eui 皮肤时报错 'parseFromString' of undefined,如何解决。
+
+答:检查是否使用了 嵌入EXML到代码中,例:
+
+```
+ var className = "skins.ButtonSkin";
+ var exmlText = ` ...
+ `;
+```
+
+需要改成单独的皮肤文件。
+
+
+
+#### 为什么引入第三方库报 ``` 第三方库 is not defined``` 错误.
+
+答:
+我们要再次强调小游戏有很多的限制,首先检查我们所使用的第三方库是否符合小游戏的标准,具体可以参考小游戏官方文档,如果不符合规范,我们只能自己来修改这个库以达到标准。后期我们会整理常用的库提供给开发者。
+经检查适合小游戏的标准,但还是会报我们使用的 ```第三放库未定义```,需要我们把第三方库挂在到全局对象 window 上,我们可以在 mygame.ts 的文件中添加。例如我们加入 zlib 库。如图:
+
+![](x04.png)
+
+#### 文件加载失败: default.res.json?v=201906191000
+答:去掉`?v=201906191000`
+
+#### 一个 sound 只能创建一个 soundChannel,怎么同时播放同一个声音
+答:创建多个 sound 的方式,分别播放声音。[参考demo](http://tool.egret-labs.org/DocZip/engine/minigame/Sounds.zip)
+
+**注意**:同时只能创建6个声音对象,超出的会覆盖掉老的声音对象。
+
+```
+for (let i = 0; i < 3; i++) {
+ let sd = new egret.Sound()
+ sd.load('resource/assets/se1.mp3')
+ ...
+}
+```
+
+#### 为什么我动态设置帧频没有效果
+答:小游戏平台只能在 index.html 里设置,不能通过 stage.frameRate 方法动态修改
+
+
diff --git a/Engine2D/minigamemy/mygameFAQ/x02.png b/Engine2D/minigamemy/mygameFAQ/x02.png
new file mode 100644
index 0000000..c93aaac
Binary files /dev/null and b/Engine2D/minigamemy/mygameFAQ/x02.png differ
diff --git a/Engine2D/minigamemy/mygameFAQ/x03.png b/Engine2D/minigamemy/mygameFAQ/x03.png
new file mode 100644
index 0000000..8125284
Binary files /dev/null and b/Engine2D/minigamemy/mygameFAQ/x03.png differ
diff --git a/Engine2D/minigamemy/mygameFAQ/x04.png b/Engine2D/minigamemy/mygameFAQ/x04.png
new file mode 100644
index 0000000..1831e41
Binary files /dev/null and b/Engine2D/minigamemy/mygameFAQ/x04.png differ
diff --git a/Engine2D/minigameoppo/getStart/README.md b/Engine2D/minigameoppo/getStart/README.md
new file mode 100644
index 0000000..ca82015
--- /dev/null
+++ b/Engine2D/minigameoppo/getStart/README.md
@@ -0,0 +1,92 @@
+### 一.开发环境准备
+
+* Egret Launcher 1.0.63 以上版本
+* 白鹭引擎 5.2.28 以上版本
+* 在电脑中安装 npm:[下载地址](https://www.npmjs.com/)
+* 在电脑中安装 adb 工具:[下载地址](http://adbshell.com/downloads)
+* 在 OPPO 手机上安装快应用调试器,以及更多小游戏 API 文档,请访问小游戏支持网站:[网站地址](https://cdofs.oppomobile.com/cdo-activity/static/201810/26/quickgame/documentation/games/use.html)
+
+### 二.创建小游戏和可视化编译打包小游戏
+
+1. 使用最新的 Egret Launcher 创建一个 Egret 游戏项目,引擎使用 5.2.19 以上版本。
+创建完成后,会在 Egret Launcher 的列表里看到该项目。点击发布设置:
+![](p1.png)
+2. 选择 `OPPO小游戏` 标签,点击`确定`,创建项目
+![](p2.png)
+3. 创建成功后,点击`发布`标签,可以可视化的发布小游戏包
+![](p3.png)
+ * 编译游戏代码到小游戏:相当于执行命令 `egret build --target oppogame`,把游戏的代码编译到小游戏的项目里
+ * 发布:相当于执行命令 `quickgame pack`,把小游戏工程,编译成 `rpk` 包
+ * 调试:使用 USB 连接手机和电脑后,点击调试,会把 `rpk` 上传到手机中,然后启动一个 `Chrome` 窗口,可以调试手机中运行的小游戏
+ * 分包加载机制,请访问小游戏支持网站:[网站地址](https://cdofs.oppomobile.com/cdo-activity/static/201810/26/quickgame/documentation/subpackage/subpackage.html)
+
+
+
+### 三.使用命令行把白鹭游戏编译到小游戏项目
+#### 方法1:开发者可以使用命令行来编译和发布到OPPO小游戏项目中:
+
+ * dubug 模式: ```egret build --target oppogame```
+ * release 模式: ```egret publish --target oppogame```
+
+#### 方法2:配置 egretProperties.json
+
+~~~ javascript
+"engineVersion": "5.2.28",
+"compilerVersion": "5.2.28",
+"template": {},
+"target": {
+ "current": "oppogame"
+},
+~~~
+
+如上所示,将 `egretProperties.json` 配置文件中的 `current` 属性设置为 `oppogame` 时,可以直接使用```egret build``` 或者 ```egret publish``` 命令编译和发布OPPO小游戏。
+
+### 四.使用命令行打包发布 OPPO 小游戏
+* 进入小游戏项目,在命令行里执行编译命令 `quickgame pack`,成功后会生成一个`dist`文件夹,里面的 `com.application.demo.rpk` 文件就是打包好的小游戏项目,可以在手机上运行调试。
+* 如果执行命令 `quickgame pack release`,则会生成正式发布的小游戏项目。注意,发布正式项目,需要在 `sign/release/private.pem` 路径下自己准备签名文件。
+
+* 项目代码目录的结构如下
+
+![](p4.png)
+
+- 目录结构说明
+ * egret.oppogame.js: 白鹭引擎与小游戏的适配层
+ * js 文件夹:游戏项目的代码
+ * main.js:项目入口文件
+ * manifest.js:用来引用所有的 js 代码
+ * manifest.json:小游戏的相关参数设置
+ * resource 文件夹:游戏资源文件
+ * sign 文件夹:签名文件存放的位置
+
+
+* manifest.json 配置说明
+
+```
+{
+ "package": "com.application.demo",
+ "name": "oppogame",
+ "versionName": "1.0.0",
+ "versionCode": "1",
+ "minPlatformVersion": "1040",
+ "icon": "/icon/logo.png",
+ "orientation": "portrait"
+}
+```
+- 参数说明
+ * package:应用包名
+ * name:应用名称,6 个汉字以内,与应用商店保存的名称一致,用于在桌面图标、弹窗等处显示应用名称
+ * versionName:应用版本名称
+ * versionCode:应用版本号,从1自增,推荐每次重新上传包时versionCode+1
+ * minPlatformVersion:支持的最小平台版本号
+ * icon:应用图标的路径
+ * orientation:支持的屏幕方向。portrait 为竖屏,landscape 为横屏。该参数会自动从白鹭游戏项目的 index.html 里获取。
+
+
+### 四.真机调试调试
+**注意:**一定要使用 OPPO 手机才可以调试
+
+1.在 OPPO 手机上安装 `OPPO 小游戏调试器`
+
+2.使用 USB 线连接手机和电脑,把编译好的 `rpk` 包上传到手机 `games` 文件夹
+
+3.打开小游戏调试器,点击 `OPPO小游戏`标签,在列表中选择刚才上传的 `rpk` 名称,游戏会运行起来
diff --git a/Engine2D/minigameoppo/getStart/p1.png b/Engine2D/minigameoppo/getStart/p1.png
new file mode 100644
index 0000000..f6c4f83
Binary files /dev/null and b/Engine2D/minigameoppo/getStart/p1.png differ
diff --git a/Engine2D/minigameoppo/getStart/p2.png b/Engine2D/minigameoppo/getStart/p2.png
new file mode 100644
index 0000000..b964def
Binary files /dev/null and b/Engine2D/minigameoppo/getStart/p2.png differ
diff --git a/Engine2D/minigameoppo/getStart/p3.png b/Engine2D/minigameoppo/getStart/p3.png
new file mode 100644
index 0000000..6f0aa33
Binary files /dev/null and b/Engine2D/minigameoppo/getStart/p3.png differ
diff --git a/Engine2D/minigameoppo/getStart/p4.png b/Engine2D/minigameoppo/getStart/p4.png
new file mode 100644
index 0000000..ffa4c76
Binary files /dev/null and b/Engine2D/minigameoppo/getStart/p4.png differ
diff --git a/Engine2D/minigameoppo/oppogameFAQ/README.md b/Engine2D/minigameoppo/oppogameFAQ/README.md
new file mode 100644
index 0000000..41f12d6
--- /dev/null
+++ b/Engine2D/minigameoppo/oppogameFAQ/README.md
@@ -0,0 +1,86 @@
+首先,强调一些OPPO小游戏的基础技术限制:
+
+* 不允许操作 DOM、BOM、如果必须改成块游戏相应的 API 调用方式
+
+* 不允许动态执行代码的能力,eval、setTimeout 和 setInterval 函数的第一个参数不能为字符串,Function构造函数的参数不能为字符串。
+
+
+接下来汇总一下开发者普遍遇到的问题以及解决方案:
+
+### 问题
+
+#### 我在使用白鹭引擎 5.0 / 4.x / 3.x 版本,可以直接转换为OPPO小游戏游戏么?
+
+答:目前我们只支持白鹭引擎 5.2.19 以上的版本发布为OPPO小游戏。老版本的项目,[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+
+#### 我在使用 egret res 库,5.2.19 创建的新项目使用的是 assetsmanager 库,这两个库有区别么?
+
+答:assetsmanager 是 res 的替代方案,这两者的 API 有 90% 保持一致,但是仍然有一些小区别,主要是在 RES.Analyzer 上,如果您遇到了相关问题,您可以在 egretProperties.json 中修改模块配置,从 assetsmanager 修改回 res 并执行 egret clean ,这样就可以换成 res 资源管理库了。更改如图所示:
+
+![img](x02.png)
+
+
+
+#### 当老项目(5.2.19以前)升到到最新版时,发布小游戏项目报错:
+
+答:升级成功后,请首先保证 HTML5 版本可以正常运行,然后再尝试发布为OPPO小游戏,目前我们遇到了多位开发者通过创建 5.2.19 新项目后拷贝老项目代码和素材的方式尝试升级,由于忽视了修改 egretProperties.json 中的模块配置,导致运行失败的问题。[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+#### 在游戏使用到 egret.getDefinitionByName() 报错,找不到对应类时:
+
+答:需要将要反射的类挂载到 window 对象下,例如有个 class People{} 类,需要添加代码 window["People"] = People。[参考微信小游戏示例demo](http://developer.egret.com/cn/statics/downs/testglobal.zip)
+
+#### 在 EUI 中使用自定义组件,发布到OPPO小游戏的 default.thm.js 报错提示找不到自定义组件,错误如图:
+
+![img](x03.png)
+
+答:参考上一条回答,需要将自定义组件暴露到全局作用域。
+
+#### 在小游戏中报错 “Main is not defined” 时,
+
+答:请查看游戏的入口类名是否为 Main,如不是请修改为 Main。
+
+
+
+#### 使用 eui 皮肤时报错 'parseFromString' of undefined,如何解决。
+
+答:检查是否使用了 嵌入EXML到代码中,例:
+
+~~~ javascript
+ var className = "skins.ButtonSkin";
+ var exmlText = ` ...
+ `;
+~~~
+
+需要改成单独的皮肤文件。
+
+
+
+#### 为什么引入第三方库报 ``` 第三方库 is not defined``` 错误.
+
+答:
+我们要再次强调小游戏有很多的限制,首先检查我们所使用的第三方库是否符合小游戏的标准,具体可以参考小游戏官方文档,如果不符合规范,我们只能自己来修改这个库以达到标准。后期我们会整理常用的库提供给开发者。
+经检查适合小游戏的标准,但还是会报我们使用的 ```第三放库未定义```,需要我们把第三方库挂在到全局对象 window 上,我们可以在 oppogame.ts 的文件中添加。例如我们加入 zlib 库。如图:
+
+![](x04.png)
+
+#### 文件加载失败: default.res.json?v=201906191000
+答:去掉`?v=201906191000`
+
+#### 一个 sound 只能创建一个 soundChannel,怎么同时播放同一个声音
+答:创建多个 sound 的方式,分别播放声音。[参考demo](http://tool.egret-labs.org/DocZip/engine/minigame/Sounds.zip)
+
+~~~ javascript
+for (let i = 0; i < 3; i++) {
+ let sd = new egret.Sound()
+ sd.load('resource/assets/se1.mp3')
+ ...
+}
+~~~
+
+#### 为什么我动态设置帧频没有效果
+答:小游戏平台只能在 index.html 里设置,不能通过 stage.frameRate 方法动态修改
+
+
+#### 这个报错信息是什么意思?Failed to clone native_handle in hidl_handle: Too many open files
+答:oppo 小游戏对声音播放的数量有限制,不能同时打开太多的声音。具体的数量上限暂时还不清楚。
diff --git a/Engine2D/minigameoppo/oppogameFAQ/x02.png b/Engine2D/minigameoppo/oppogameFAQ/x02.png
new file mode 100644
index 0000000..c93aaac
Binary files /dev/null and b/Engine2D/minigameoppo/oppogameFAQ/x02.png differ
diff --git a/Engine2D/minigameoppo/oppogameFAQ/x03.png b/Engine2D/minigameoppo/oppogameFAQ/x03.png
new file mode 100644
index 0000000..8125284
Binary files /dev/null and b/Engine2D/minigameoppo/oppogameFAQ/x03.png differ
diff --git a/Engine2D/minigameoppo/oppogameFAQ/x04.png b/Engine2D/minigameoppo/oppogameFAQ/x04.png
new file mode 100644
index 0000000..1831e41
Binary files /dev/null and b/Engine2D/minigameoppo/oppogameFAQ/x04.png differ
diff --git a/Engine2D/minigameqq/getStart/README.md b/Engine2D/minigameqq/getStart/README.md
new file mode 100644
index 0000000..34f18e5
--- /dev/null
+++ b/Engine2D/minigameqq/getStart/README.md
@@ -0,0 +1,40 @@
+### 一.开发环境准备
+
+* Egret Launcher 1.0.67 以上版本
+* 白鹭引擎 5.2.25 以上版本
+* 下载安装 QQ 小游戏开发者工具[下载地址](https://q.qq.com/wiki/#_4-%E7%BC%96%E7%A0%81%E5%BC%80%E5%8F%91%E5%B0%8F%E7%A8%8B%E5%BA%8F)
+* 更多 QQ 小游戏 API 文档,请访问小游戏支持网站:[网站地址](https://q.qq.com/wiki/develop/game/API/)
+
+### 二.创建小游戏和可视化编译打包小游戏
+
+1. 使用最新的 Egret Launcher 创建一个 Egret 游戏项目,引擎使用 5.2.25 以上版本。
+创建完成后,会在 Egret Launcher 的列表里看到该项目。点击发布设置:
+![](p1.png)
+2. 选择 `QQ 小游戏` 标签,点击`确定`,创建项目
+![](p2.png)
+3. 创建成功后,点击`发布`标签,可以可视化的发布小游戏包
+![](p3.png)
+ * 编译游戏代码到小游戏:相当于执行命令 `egret build --target qqgame`,把游戏的代码编译到小游戏的项目里
+
+
+
+### 三.使用命令行把白鹭游戏编译到小游戏项目
+#### 方法1:开发者可以使用命令行来编译和发布到 qq 小游戏项目中:
+
+ * dubug 模式: ```egret build --target qqgame```
+ * release 模式: ```egret publish --target qqgame```
+
+#### 方法2:配置 egretProperties.json
+
+```
+"engineVersion": "5.2.25",
+"compilerVersion": "5.2.25",
+"template": {},
+"target": {
+ "current": "qqgame"
+},
+```
+
+如上所示,将 `egretProperties.json` 配置文件中的 `current` 属性设置为 `qqgame` 时,可以直接使用```egret build``` 或者 ```egret publish``` 命令编译和发布 QQ 小游戏。
+
+现在就可以在开发者工具中运行小游戏了,如在开发中遇到任何问题都可到官方论坛提问,官方团队很愿意为您解答
diff --git a/Engine2D/minigameqq/getStart/p1.png b/Engine2D/minigameqq/getStart/p1.png
new file mode 100644
index 0000000..5812261
Binary files /dev/null and b/Engine2D/minigameqq/getStart/p1.png differ
diff --git a/Engine2D/minigameqq/getStart/p2.png b/Engine2D/minigameqq/getStart/p2.png
new file mode 100644
index 0000000..47fa839
Binary files /dev/null and b/Engine2D/minigameqq/getStart/p2.png differ
diff --git a/Engine2D/minigameqq/getStart/p3.png b/Engine2D/minigameqq/getStart/p3.png
new file mode 100644
index 0000000..d1b9f51
Binary files /dev/null and b/Engine2D/minigameqq/getStart/p3.png differ
diff --git a/Engine2D/minigameqq/getStart/p4.png b/Engine2D/minigameqq/getStart/p4.png
new file mode 100644
index 0000000..a83bc6d
Binary files /dev/null and b/Engine2D/minigameqq/getStart/p4.png differ
diff --git a/Engine2D/minigameqq/qqgameFAQ/README.md b/Engine2D/minigameqq/qqgameFAQ/README.md
new file mode 100644
index 0000000..0bef20f
--- /dev/null
+++ b/Engine2D/minigameqq/qqgameFAQ/README.md
@@ -0,0 +1,72 @@
+首先,强调一些 QQ 小游戏的基础技术限制:
+
+* 不允许操作 DOM、BOM、如果必须改成块游戏相应的 API 调用方式
+
+* 不允许动态执行代码的能力,eval、setTimeout 和 setInterval 函数的第一个参数不能为字符串,Function构造函数的参数不能为字符串。
+
+
+接下来汇总一下开发者普遍遇到的问题以及解决方案:
+
+### 问题
+
+#### 我在使用白鹭引擎 5.0 / 4.x / 3.x 版本,可以直接转换为QQ小游戏游戏么?
+
+答:目前我们只支持白鹭引擎 5.2.19 以上的版本发布为QQ小游戏。老版本的项目,[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+
+#### 我在使用 egret res 库,5.2.19 创建的新项目使用的是 assetsmanager 库,这两个库有区别么?
+
+答:assetsmanager 是 res 的替代方案,这两者的 API 有 90% 保持一致,但是仍然有一些小区别,主要是在 RES.Analyzer 上,如果您遇到了相关问题,您可以在 egretProperties.json 中修改模块配置,从 assetsmanager 修改回 res 并执行 egret clean ,这样就可以换成 res 资源管理库了。更改如图所示:
+
+![img](x02.png)
+
+
+
+#### 当老项目(5.2.19以前)升到到最新版时,发布小游戏项目报错:
+
+答:升级成功后,请首先保证 HTML5 版本可以正常运行,然后再尝试发布为QQ小游戏,目前我们遇到了多位开发者通过创建 5.2.19 新项目后拷贝老项目代码和素材的方式尝试升级,由于忽视了修改 egretProperties.json 中的模块配置,导致运行失败的问题。[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+#### 在游戏使用到 egret.getDefinitionByName() 报错,找不到对应类时:
+
+答:需要将要反射的类挂载到 window 对象下,例如有个 class People{} 类,需要添加代码 window["People"] = People。[参考微信小游戏示例demo](http://developer.egret.com/cn/statics/downs/testglobal.zip)
+
+#### 在 EUI 中使用自定义组件,发布到QQ小游戏的 default.thm.js 报错提示找不到自定义组件,错误如图:
+
+![img](x03.png)
+
+答:参考上一条回答,需要将自定义组件暴露到全局作用域。
+
+#### 在小游戏中报错 “Main is not defined” 时,
+
+答:请查看游戏的入口类名是否为 Main,如不是请修改为 Main。
+
+
+
+#### 使用 eui 皮肤时报错 'parseFromString' of undefined,如何解决。
+
+答:检查是否使用了 嵌入EXML到代码中,例:
+
+```
+ var className = "skins.ButtonSkin";
+ var exmlText = ` ...
+ `;
+```
+
+需要改成单独的皮肤文件。
+
+
+
+#### 为什么引入第三方库报 ``` 第三方库 is not defined``` 错误.
+
+答:
+我们要再次强调小游戏有很多的限制,首先检查我们所使用的第三方库是否符合小游戏的标准,具体可以参考小游戏官方文档,如果不符合规范,我们只能自己来修改这个库以达到标准。后期我们会整理常用的库提供给开发者。
+经检查适合小游戏的标准,但还是会报我们使用的 ```第三放库未定义```,需要我们把第三方库挂在到全局对象 window 上,我们可以在 qqgame.ts 的文件中添加。例如我们加入 zlib 库。如图:
+
+![](x04.png)
+
+#### 文件加载失败: default.res.json?v=201906191000
+答:去掉`?v=201906191000`
+
+
+#### 为什么我动态设置帧频没有效果
+答:小游戏平台只能在 index.html 里设置,不能通过 stage.frameRate 方法动态修改
diff --git a/Engine2D/minigameqq/qqgameFAQ/x02.png b/Engine2D/minigameqq/qqgameFAQ/x02.png
new file mode 100644
index 0000000..c93aaac
Binary files /dev/null and b/Engine2D/minigameqq/qqgameFAQ/x02.png differ
diff --git a/Engine2D/minigameqq/qqgameFAQ/x03.png b/Engine2D/minigameqq/qqgameFAQ/x03.png
new file mode 100644
index 0000000..8125284
Binary files /dev/null and b/Engine2D/minigameqq/qqgameFAQ/x03.png differ
diff --git a/Engine2D/minigameqq/qqgameFAQ/x04.png b/Engine2D/minigameqq/qqgameFAQ/x04.png
new file mode 100644
index 0000000..416f09e
Binary files /dev/null and b/Engine2D/minigameqq/qqgameFAQ/x04.png differ
diff --git a/Engine2D/minigameqq/usePlugin/README.md b/Engine2D/minigameqq/usePlugin/README.md
new file mode 100644
index 0000000..3c4ab20
--- /dev/null
+++ b/Engine2D/minigameqq/usePlugin/README.md
@@ -0,0 +1,63 @@
+
+白鹭引擎插件使用说明
+
+
+#### 什么是引擎插件
+我们发布QQ小游戏的时候,里面会带有 `egret.min.js` `eui.min.js` 之类的库文件。玩家每次打开一个小游戏,都要重复的下载这些文件。
+
+现在我们把白鹭引擎做成了插件, 5.2.x 系列的所有版本都上传到了QQ服务器上。开发者只要在项目里进行配置,就可以使用远端的插件,不使用本地的引擎文件。
+
+这样的好处是什么呢?如果一个玩家玩了 A 游戏,里面使用了 5.2.20 版本的引擎插件。然后他又玩了 B 游戏,如果 B 游戏的引擎插件版本和 A 游戏一致,那么这个插件就**不需要重新下载**。这样就可以提高游戏的打开速度,获得更好的用户体验。
+
+#### 白鹭引擎插件使用和调试环境
+* 白鹭引擎 5.2.32 版本
+* 使用QQ开发者工具[Nightly Build版版本](https://q.qq.com/wiki/tools/devtool/#%E7%BC%96%E7%A0%81%E5%92%8C%E5%8F%91%E5%B8%83)(>=Ver 0.1.29-beta.42)
+* 在QQ小游戏管理后台,设置基础库最低版本 1.8.0。使用了插件分离的小游戏,在console日志中会输出:`plugin ***** inject success/fail!`
+![](p0.png)
+
+**注意**
+
+* 目前一个APPID,只支持引用一个插件
+* 目前支持整包小游戏使用插件,以及分包小游戏的主包使用插件
+
+
+#### 白鹭引擎插件使用方法
+1.在 Egret Launcher 里下载引擎 5.2.32 版本,使用该版本创建一个游戏项目
+2.打开项目中的 `scripts/config.qqgame.ts` 文件,将 `useQQPlugin` 变量改为 `true`,在发布成 QQ 小游戏后会开启插件功能。设置为 `false`,将关闭插件功能。
+
+##### 老项目升级:
+
+在老项目中执行 `egret upgrade --egretversion 5.2.32` 后会把项目升级成支持插件的版本。
+
+##### 使用其他版本的引擎:
+如果您的项目不想使用最新的 5.2.32 版本 ,要使用其他版本,例如 `5.2.16` 之类的引擎,那么可以做如下操作:
+
+1.使用最新版引擎 5.2.32 创建一个新项目,把这 3 个文件拷贝到老项目里替换原有文件。
+![](p1.png)
+
+
+2.在老项目根目录的 `egretProperties.json` 里,把 `compilerVersion` 编译器版本改成 5.2.32。比如在本示例中,引擎代码还是 `5.2.16` 的,但是编译脚本使用 `5.2.32`,这样就能支持把游戏发布成开启微信插件的形式了。
+
+![](p2.png)
+
+
+#### FAQ
+* 问:引擎插件里都包含哪些库?
+* 答:包含白鹭引擎官方提供的 7 个库,注意:只包含发布版的 `xx.min.js`, 不包含调试版的`xx.js`。具体的文件列表如下:
+
+```
+egret.min.js
+eui.min.js
+assetsmanager.min.js
+dragonBones.min.js
+game.min.js
+socket.min.js
+tween.min.js
+```
+
+-----
+* 问:我对引擎做了修改,还可以使用远程插件吗
+* 答:远程插件是由白鹭官方上传到QQ后台,您自己在本地的修改不会生效。
+
+-----
+
diff --git a/Engine2D/minigameqq/usePlugin/p0.png b/Engine2D/minigameqq/usePlugin/p0.png
new file mode 100644
index 0000000..7e61e2d
Binary files /dev/null and b/Engine2D/minigameqq/usePlugin/p0.png differ
diff --git a/Engine2D/minigameqq/usePlugin/p1.png b/Engine2D/minigameqq/usePlugin/p1.png
new file mode 100644
index 0000000..42ae551
Binary files /dev/null and b/Engine2D/minigameqq/usePlugin/p1.png differ
diff --git a/Engine2D/minigameqq/usePlugin/p2.png b/Engine2D/minigameqq/usePlugin/p2.png
new file mode 100644
index 0000000..2995f09
Binary files /dev/null and b/Engine2D/minigameqq/usePlugin/p2.png differ
diff --git a/Engine2D/minigamevivo/getStart/README.md b/Engine2D/minigamevivo/getStart/README.md
new file mode 100644
index 0000000..329bff3
--- /dev/null
+++ b/Engine2D/minigamevivo/getStart/README.md
@@ -0,0 +1,114 @@
+### 一.开发环境准备
+
+* Egret Launcher 1.0.65 以上版本
+* 白鹭引擎 5.2.23 以上版本
+* 在电脑中安装 npm:[下载地址](https://www.npmjs.com/)
+* 在电脑中安装 adb 工具:[下载地址](http://adbshell.com/downloads)
+* 最新版本的 vivo 小游戏引擎(平台版本1041+)[下载地址](https://minigame.vivo.com.cn/documents/#/download/engine)
+* 更多 vivo 小游戏 API 文档,请访问小游戏支持网站:[网站地址](https://minigame.vivo.com.cn/documents/#/lesson/base/start)
+
+### 二.创建小游戏和可视化编译打包小游戏
+
+1. 使用最新的 Egret Launcher 创建一个 Egret 游戏项目,引擎使用 5.2.23 以上版本。
+创建完成后,会在 Egret Launcher 的列表里看到该项目。点击发布设置:
+![](p1.png)
+2. 选择 `vivo小游戏` 标签,点击`确定`,创建项目
+![](p2.png)
+3. 创建成功后,点击`发布`标签,可以可视化的发布小游戏包
+![](p3.png)
+ * 编译游戏代码到小游戏:相当于执行命令 `egret build --target vivogame`,把游戏的代码编译到小游戏的项目里
+ * 发布:相当于执行命令 `npm run build`,把小游戏工程,编译成 `rpk` 包
+ * 调试:使用 USB 连接手机和电脑后,点击调试,会把 `rpk` 上传到手机中,然后启动一个 `Chrome` 窗口,可以调试手机中运行的小游戏
+
+
+### 三.使用命令行把白鹭游戏编译到小游戏项目
+#### 方法1:开发者可以使用命令行来编译和发布到 vivo 小游戏项目中:
+
+ * dubug 模式: ```egret build --target vivogame```
+ * release 模式: ```egret publish --target vivogame```
+
+#### 方法2:配置 egretProperties.json
+
+~~~ javascript
+"engineVersion": "5.2.23",
+"compilerVersion": "5.2.23",
+"template": {},
+"target": {
+ "current": "vivogame"
+},
+~~~
+
+如上所示,将 `egretProperties.json` 配置文件中的 `current` 属性设置为 `vivogame` 时,可以直接使用```egret build``` 或者 ```egret publish``` 命令编译和发布 vivo 小游戏。
+
+### 四.使用命令行打包发布 vivo 小游戏
+* 进入小游戏项目,在命令行里执行编译命令 `npm run build`,成功后会生成一个`dist`文件夹,里面的 `com.application.demo.rpk` 文件就是打包好的小游戏项目,可以在手机上运行调试。
+* 如果执行命令 `npm run release`,则会生成正式发布的小游戏项目。注意,发布正式项目,需要在 `sign/release/private.pem` 路径下自己准备签名文件。
+
+* 项目代码目录的结构如下
+
+![](p4.png)
+
+- 目录结构说明
+ * egret.vivogame.js: 白鹭引擎与小游戏的适配层
+ * js 文件夹:游戏项目的代码
+ * game.js:项目入口文件
+ * manifest.js:用来引用所有的 js 代码
+ * manifest.json:小游戏的相关参数设置
+ * resource 文件夹:游戏资源文件
+ * sign 文件夹:签名文件存放的位置
+
+
+* manifest.json 配置说明
+
+~~~ javascript
+{
+ "package": "com.application.demo",
+ "name": "vivogame",
+ "versionName": "1.0.0",
+ "versionCode": "1",
+ "minPlatformVersion": "1030",
+ "icon": "/icon/logo.png",
+ "orientation": "portrait"
+}
+~~~
+- 参数说明
+ * package:应用包名
+ * name:应用名称,6 个汉字以内,与应用商店保存的名称一致,用于在桌面图标、弹窗等处显示应用名称
+ * versionName:应用版本名称
+ * versionCode:应用版本号,从1自增,推荐每次重新上传包时versionCode+1
+ * minPlatformVersion:支持的最小平台版本号
+ * icon:应用图标的路径
+ * orientation:支持的屏幕方向。portrait 为竖屏,landscape 为横屏。该参数会自动从白鹭游戏项目的 index.html 里获取。
+
+
+### 四.真机调试调试
+**注意:**一定要使用 vivo 手机才可以调试
+
+1.在 vivo 手机上安装 [快应用调试器](https://minigame.vivo.com.cn/documents/#/download/engine)
+
+3.打开快游戏调试器,点击 `扫码安装`,扫描 EgretLauncher 发布 vivo 小游戏界面里的二维码。
+
+
+
+### 升级指南
+因为 vivo 小游戏项目结构升级,从白鹭引擎 5.2.28 开始不再支持老版本的结构,需要您升级一下游戏项目。
+
+`注意:如果是老项目 (xxx_vivogame),请删除原来的 vivo 小游戏项目,重新创建项目!!`
+
+**Egret 项目升级方法1**
+
+* 1.使用 EgretLauncher 下载白鹭引擎 5.2.28 版本
+* 2.执行 `egret upgrade --egretversion 5.2.28`
+ * 升级将会把您项目中的 `scripts/config.vivogame.ts ` 和 `scripts/vivogame/vivogame.ts`这两个文件替换掉。如果您修改了这2个文件,请提前做好备份,升级完成以后再进行对应修改。
+
+**Egret 项目升级方法2**
+
+* 1.使用 EgretLauncher 下载白鹭引擎 5.2.28 版本
+* 2.新创建一个游戏项目,将项目中 `scripts/config.vivogame.ts ` 和 `scripts/vivogame/vivogame.ts`这两个文件替换您原来项目里对应的文件
+
+### 常见问题排查
+如果您的 vivo 小游戏项目不能运行,请先检查下面这些流程是否正确
+
+* 使用的是 vivo 手机
+* 手机中安装了 [快应用调试器](https://minigame.vivo.com.cn/documents/#/download/engine)
+* Egret Launcher [是最新版本的](https://egret.com/products/engine.html)
diff --git a/Engine2D/minigamevivo/getStart/p1.png b/Engine2D/minigamevivo/getStart/p1.png
new file mode 100644
index 0000000..f5ed576
Binary files /dev/null and b/Engine2D/minigamevivo/getStart/p1.png differ
diff --git a/Engine2D/minigamevivo/getStart/p2.png b/Engine2D/minigamevivo/getStart/p2.png
new file mode 100644
index 0000000..09265af
Binary files /dev/null and b/Engine2D/minigamevivo/getStart/p2.png differ
diff --git a/Engine2D/minigamevivo/getStart/p3.png b/Engine2D/minigamevivo/getStart/p3.png
new file mode 100644
index 0000000..db03181
Binary files /dev/null and b/Engine2D/minigamevivo/getStart/p3.png differ
diff --git a/Engine2D/minigamevivo/getStart/p4.png b/Engine2D/minigamevivo/getStart/p4.png
new file mode 100644
index 0000000..a83bc6d
Binary files /dev/null and b/Engine2D/minigamevivo/getStart/p4.png differ
diff --git a/Engine2D/minigamevivo/vivogameFAQ/README.md b/Engine2D/minigamevivo/vivogameFAQ/README.md
new file mode 100644
index 0000000..574b727
--- /dev/null
+++ b/Engine2D/minigamevivo/vivogameFAQ/README.md
@@ -0,0 +1,80 @@
+首先,强调一些 vivo 小游戏的基础技术限制:
+
+* 不允许操作 DOM、BOM、如果必须改成块游戏相应的 API 调用方式
+
+* 不允许动态执行代码的能力,eval、setTimeout 和 setInterval 函数的第一个参数不能为字符串,Function构造函数的参数不能为字符串。
+
+
+接下来汇总一下开发者普遍遇到的问题以及解决方案:
+
+### 问题
+
+#### 我在使用白鹭引擎 5.0 / 4.x / 3.x 版本,可以直接转换为vivo小游戏游戏么?
+
+答:目前我们只支持白鹭引擎 5.2.19 以上的版本发布为vivo小游戏。老版本的项目,[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+
+#### 我在使用 egret res 库,5.2.19 创建的新项目使用的是 assetsmanager 库,这两个库有区别么?
+
+答:assetsmanager 是 res 的替代方案,这两者的 API 有 90% 保持一致,但是仍然有一些小区别,主要是在 RES.Analyzer 上,如果您遇到了相关问题,您可以在 egretProperties.json 中修改模块配置,从 assetsmanager 修改回 res 并执行 egret clean ,这样就可以换成 res 资源管理库了。更改如图所示:
+
+![img](x02.png)
+
+
+
+#### 当老项目(5.2.19以前)升到到最新版时,发布小游戏项目报错:
+
+答:升级成功后,请首先保证 HTML5 版本可以正常运行,然后再尝试发布为vivo小游戏,目前我们遇到了多位开发者通过创建 5.2.19 新项目后拷贝老项目代码和素材的方式尝试升级,由于忽视了修改 egretProperties.json 中的模块配置,导致运行失败的问题。[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+#### 在游戏使用到 egret.getDefinitionByName() 报错,找不到对应类时:
+
+答:需要将要反射的类挂载到 window 对象下,例如有个 class People{} 类,需要添加代码 window["People"] = People。[参考微信小游戏示例demo](http://developer.egret.com/cn/statics/downs/testglobal.zip)
+
+#### 在 EUI 中使用自定义组件,发布到vivo小游戏的 default.thm.js 报错提示找不到自定义组件,错误如图:
+
+![img](x03.png)
+
+答:参考上一条回答,需要将自定义组件暴露到全局作用域。
+
+#### 在小游戏中报错 “Main is not defined” 时,
+
+答:请查看游戏的入口类名是否为 Main,如不是请修改为 Main。
+
+
+
+#### 使用 eui 皮肤时报错 'parseFromString' of undefined,如何解决。
+
+答:检查是否使用了 嵌入EXML到代码中,例:
+
+~~~ javascript
+ var className = "skins.ButtonSkin";
+ var exmlText = ` ...
+ `;
+~~~
+
+需要改成单独的皮肤文件。
+
+#### 为什么引入第三方库报 ``` 第三方库 is not defined``` 错误.
+
+答:
+我们要再次强调小游戏有很多的限制,首先检查我们所使用的第三方库是否符合小游戏的标准,具体可以参考小游戏官方文档,如果不符合规范,我们只能自己来修改这个库以达到标准。后期我们会整理常用的库提供给开发者。
+经检查适合小游戏的标准,但还是会报我们使用的 ```第三放库未定义```,需要我们把第三方库挂在到全局对象 window 上,我们可以在 vivogame.ts 的文件中添加。例如我们加入 zlib 库。如图:
+
+![](x04.png)
+
+#### 文件加载失败: default.res.json?v=201906191000
+答:去掉`?v=201906191000`
+
+#### 一个 sound 只能创建一个 soundChannel,怎么同时播放同一个声音
+答:创建多个 sound 的方式,分别播放声音。[参考demo](http://tool.egret-labs.org/DocZip/engine/minigame/Sounds.zip)
+
+~~~ javascript
+for (let i = 0; i < 3; i++) {
+ let sd = new egret.Sound()
+ sd.load('resource/assets/se1.mp3')
+ ...
+}
+~~~
+
+#### 为什么我动态设置帧频没有效果
+答:小游戏平台只能在 index.html 里设置,不能通过 stage.frameRate 方法动态修改
diff --git a/Engine2D/minigamevivo/vivogameFAQ/x02.png b/Engine2D/minigamevivo/vivogameFAQ/x02.png
new file mode 100644
index 0000000..c93aaac
Binary files /dev/null and b/Engine2D/minigamevivo/vivogameFAQ/x02.png differ
diff --git a/Engine2D/minigamevivo/vivogameFAQ/x03.png b/Engine2D/minigamevivo/vivogameFAQ/x03.png
new file mode 100644
index 0000000..8125284
Binary files /dev/null and b/Engine2D/minigamevivo/vivogameFAQ/x03.png differ
diff --git a/Engine2D/minigamevivo/vivogameFAQ/x04.png b/Engine2D/minigamevivo/vivogameFAQ/x04.png
new file mode 100644
index 0000000..416f09e
Binary files /dev/null and b/Engine2D/minigamevivo/vivogameFAQ/x04.png differ
diff --git a/Engine2D/minigamexiaomi/getStart/README.md b/Engine2D/minigamexiaomi/getStart/README.md
new file mode 100644
index 0000000..5491592
--- /dev/null
+++ b/Engine2D/minigamexiaomi/getStart/README.md
@@ -0,0 +1,102 @@
+### 一.开发环境准备
+
+* Egret Launcher 1.0.62 以上版本
+* 白鹭引擎 5.2.28 以上版本
+* 在电脑中安装 npm:[下载地址](https://www.npmjs.com/)
+* 下载安装调试器和运行时,以及更多快游戏 API 文档,请访问:[快游戏开发者接入指南](https://dev.mi.com/console/doc/detail?pId=1779)
+
+
+### 二.创建小游戏
+
+1. 使用最新的 Egret Launcher 创建 5.2.28 以上版本的项目,项目名字叫做 `QGameDemo`。
+然后在 Egret Launcher 您会看到刚刚创建的项目,点击发布设置:
+![](p1.png)
+2. 选择 `小米快游戏` 标签,点击`确定`,创建项目
+![](p2.png)
+3. 创建成功后,点击`发布`标签,可以可视化的发布快游戏包
+![](p3.png)
+ * 编译游戏代码到快游戏:相当于执行命令 `egret build --target qgame`,把游戏的代码编译到快游戏的项目里
+ * 二维码:使用快游戏调试器可以扫码安装 `rpk` 包
+ * 发布:相当于执行命令 `npm run build`,把快游戏工程,编译成 `rpk` 包
+ * 调试:使用 USB 连接手机和电脑后,点击调试,会启动一个 `Chrome` 窗口,可以调试手机中运行的快游戏
+
+
+
+### 三.使用命令行把白鹭游戏编译成快游戏
+#### 方法1:开发者可以使用命令行来编译和发布小米快游戏:
+
+ * dubug 模式: **egret build --target qgame**
+ * release 模式: **egret publish --target qgame**
+
+#### 方法2:配置 egretProperties.json
+
+~~~javascript
+"engineVersion": "5.2.28",
+"compilerVersion": "5.2.28",
+"template": {},
+"target": {
+ "current": "qgame"
+},
+~~~
+
+如上所示,将 `egretProperties.json` 配置文件中的 `current` 属性设置为 `qgame` 时,可以直接使用**egret build** 或者 **egret publish** 命令编译和发布小米快游戏。
+
+### 四.使用命令行打包发布小米快游戏
+* 进入快游戏项目,在命令行里执行编译命令 `npm run build`,成功后会生成一个`dist`文件夹,里面的 `com.application.demo.debug.rpk` 文件就是打包好的快游戏项目,可以在手机上调试。
+* 如果执行命令 `npm run release`,则会生成正式发布的快游戏项目。
+* **注意:发布正式项目,需要正式的签名文件。** 可以通过 openssl 等命令工具生成签名文件 private.pem、certificate.pem,然后把签名文件拷贝到 `sign/release` 目录。示例方法:
+
+~~~
+openssl req -newkey rsa:2048 -nodes -keyout private.pem -x509 -days 3650 -out certificate.pem
+
+~~~
+
+
+* 项目代码目录的结构如下
+
+![](p4.png)
+
+- 目录结构说明
+ * egret.qgame.js: 白鹭引擎与快游戏的适配层
+ * js 文件夹:游戏项目的代码
+ * library:Assetsmanager 模块启动小米快游戏本地缓存的代码,不需要可以删除
+ * main.js:项目入口文件
+ * manifest.js:用来引用所有的 js 代码
+ * manifest.json:快游戏的相关参数设置
+ * resource 文件夹:游戏资源文件
+
+
+* manifest.json 配置说明
+
+~~~javascript
+{
+ "package": "com.application.demo",
+ "name": "quickgame",
+ "versionName": "1.0.0",
+ "versionCode": "1",
+ "minPlatformVersion": "1050",
+ "icon": "/Common/logo.png",
+ "orientation": "portrait"
+}
+~~~
+- 参数说明
+ * package:应用包名
+ * name:应用名称,6 个汉字以内,与应用商店保存的名称一致,用于在桌面图标、弹窗等处显示应用名称
+ * versionName:应用版本名称
+ * versionCode:应用版本号,从1自增,推荐每次重新上传包时versionCode+1
+ * minPlatformVersion:支持的最小平台版本号,兼容性检查,避免上线后在低版本平台运行并导致不兼容;需要填入1050
+ * icon:应用图标的路径,尺寸为 192x192
+ * orientation:支持的屏幕方向。portrait 为竖屏,landscape 为横屏。该参数会自动从白鹭游戏项目的 index.html 里获取。
+
+
+### 四.真机调试
+**注意:**一定要使用小米手机才可以调试
+
+1.在小米手机上安装`小米快应用调试器`和`小米快游戏运行时环境`
+
+2.使用 USB 线连接手机和电脑,把编译好的 `rpk`包上传到手机
+
+3.打开快应用调试器,运行平台选择为 `快应用(com.miui.hybrid)`,然后点击本地安装,选择刚才上传的 `rpk` 包,游戏会运行起来
+
+
+4.在电脑上打开 Chrome,在浏览器里输入`chrome://inspect/#devices`,回车后会在页面里看到 `com.miui.hybrid` 的信息,点击下面的 `inspect`。在弹出的窗口里就可以看到调试信息了。
diff --git a/Engine2D/minigamexiaomi/getStart/p1.png b/Engine2D/minigamexiaomi/getStart/p1.png
new file mode 100644
index 0000000..4d26bc2
Binary files /dev/null and b/Engine2D/minigamexiaomi/getStart/p1.png differ
diff --git a/Engine2D/minigamexiaomi/getStart/p2.png b/Engine2D/minigamexiaomi/getStart/p2.png
new file mode 100644
index 0000000..1890100
Binary files /dev/null and b/Engine2D/minigamexiaomi/getStart/p2.png differ
diff --git a/Engine2D/minigamexiaomi/getStart/p3.png b/Engine2D/minigamexiaomi/getStart/p3.png
new file mode 100644
index 0000000..b9b5204
Binary files /dev/null and b/Engine2D/minigamexiaomi/getStart/p3.png differ
diff --git a/Engine2D/minigamexiaomi/getStart/p4.png b/Engine2D/minigamexiaomi/getStart/p4.png
new file mode 100644
index 0000000..b0f27ac
Binary files /dev/null and b/Engine2D/minigamexiaomi/getStart/p4.png differ
diff --git a/Engine2D/minigamexiaomi/qgameFAQ/README.md b/Engine2D/minigamexiaomi/qgameFAQ/README.md
new file mode 100644
index 0000000..2388ec1
--- /dev/null
+++ b/Engine2D/minigamexiaomi/qgameFAQ/README.md
@@ -0,0 +1,70 @@
+首先,再次强调一些小米快游戏的基础技术限制:
+
+* 不允许操作 DOM、BOM、如果必须改成块游戏相应的 API 调用方式
+
+* 不允许动态执行代码的能力,eval、setTimeout 和 setInterval 函数的第一个参数不能为字符串,Function构造函数的参数不能为字符串。
+
+
+接下来汇总一下开发者普遍遇到的问题以及解决方案:
+
+### 问题
+
+#### 我在使用白鹭引擎 5.0 / 4.x / 3.x 版本,可以直接转换为小米快游戏么?
+
+答:目前我们只支持白鹭引擎 5.2.17 以上的版本发布为小米快游戏。[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+#### 我在使用 egret res 库,5.2.17 创建的新项目使用的是 assetsmanager 库,这两个库有区别么?
+
+答:assetsmanager 是 res 的替代方案,这两者的 API 有 90% 保持一致,但是仍然有一些小区别,主要是在 RES.Analyzer 上,如果您遇到了相关问题,您可以在 egretProperties.json 中修改模块配置,从 assetsmanager 修改回 res 并执行 egret clean ,这样就可以换成 res 资源管理库了。更改如图所示:
+
+![img](x02.png)
+
+
+
+#### 当老项目(5.2.17以前)升到到最新版时,发布块游戏项目报错:
+
+答:升级成功后,请首先保证 HTML5 版本可以正常运行,然后再尝试发布为小米快游戏,目前我们遇到了多位开发者通过创建 5.2.17 新项目后拷贝老项目代码和素材的方式尝试升级,由于忽视了修改 egretProperties.json 中的模块配置,导致运行失败的问题。[参考微信小游戏升级指南](../../minigame/publish/README.md)
+
+#### 在游戏使用到 egret.getDefinitionByName() 报错,找不到对应类时:
+
+答:需要将要反射的类挂载到 window 对象下,例如有个 class People{} 类,需要添加代码 window["People"] = People。[参考微信小游戏示例demo](http://developer.egret.com/cn/statics/downs/testglobal.zip)
+
+#### 在 EUI 中使用自定义组件,发布到小米快游戏的 default.thm.js 报错提示找不到自定义组件,错误如图:
+
+![img](x03.png)
+
+答:参考上一条回答,需要将自定义组件暴露到全局作用域。
+
+#### 在小游戏中报错 “Main is not defined” 时,
+
+答:请查看游戏的入口类名是否为 Main,如不是请修改为 Main。
+
+
+
+#### 使用 eui 皮肤时报错 'parseFromString' of undefined,如何解决。
+
+答:检查是否使用了 嵌入EXML到代码中,例:
+
+```
+ var className = "skins.ButtonSkin";
+ var exmlText = ` ...
+ `;
+```
+
+需要改成单独的皮肤文件。
+
+
+
+#### 为什么引入第三方库报 ``` 第三方库 is not defined``` 错误.
+
+答:
+我们要再次强调小游戏有很多的限制,首先检查我们所使用的第三方库是否符合快游戏的标准,具体可以参考快游戏官方文档,如果不符合规范,我们只能自己来修改这个库以达到标准。后期我们会整理常用的库提供给开发者。
+经检查适合小游戏的标准,但还是会报我们使用的 ```第三放库未定义```,需要我们把第三方库挂在到全局对象 window 上,我们可以在 qgame.ts 的文件中添加。例如我们加入 zlib 库。如图:
+
+![](x04.png)
+
+#### 文件加载失败: default.res.json?v=201906191000
+答:去掉`?v=201906191000`
+
+#### 为什么我动态设置帧频没有效果
+答:小游戏平台只能在 index.html 里设置,不能通过 stage.frameRate 方法动态修改
diff --git a/Engine2D/minigamexiaomi/qgameFAQ/x02.png b/Engine2D/minigamexiaomi/qgameFAQ/x02.png
new file mode 100644
index 0000000..c93aaac
Binary files /dev/null and b/Engine2D/minigamexiaomi/qgameFAQ/x02.png differ
diff --git a/Engine2D/minigamexiaomi/qgameFAQ/x03.png b/Engine2D/minigamexiaomi/qgameFAQ/x03.png
new file mode 100644
index 0000000..8125284
Binary files /dev/null and b/Engine2D/minigamexiaomi/qgameFAQ/x03.png differ
diff --git a/Engine2D/minigamexiaomi/qgameFAQ/x04.png b/Engine2D/minigamexiaomi/qgameFAQ/x04.png
new file mode 100644
index 0000000..ec4b2db
Binary files /dev/null and b/Engine2D/minigamexiaomi/qgameFAQ/x04.png differ
diff --git a/Engine2D/multimedia/audio/README.md b/Engine2D/multimedia/audio/README.md
new file mode 100644
index 0000000..17e61fd
--- /dev/null
+++ b/Engine2D/multimedia/audio/README.md
@@ -0,0 +1,188 @@
+
+## 1.创建Sound
+### 1.1.通过Sound加装音频
+
+* 通过 ```var sound:egret.Sound = new egret.Sound()``` 创建 `Sound` 对象,再通过 ```sound.load(url)```加载,`Sound` 类支持的事件类型有两个:`egret.Event.COMPLETE` 音频加载完成时抛出;`egret.IOErrorEvent.IO_ERROR` 音频加载失败时抛出.
+
+```javascript
+var sound:egret.Sound = new egret.Sound();
+sound.addEventListener(egret.Event.COMPLETE, function loadOver(event:egret.Event) {
+ sound.play();
+}, this);
+sound.addEventListener(egret.IOErrorEvent.IO_ERROR, function loadError(event:egret.IOErrorEvent) {
+ console.log("loaded error!");
+}, this);
+sound.load("resource/sound/sound.mp3");
+```
+
+### 1.2.通过 URLLoader 加装音频。
+
+* 具体调用如下。
+```javascript
+var loader:egret.URLLoader = new egret.URLLoader();
+loader.addEventListener(egret.Event.COMPLETE, function loadOver(event:egret.Event) {
+ var sound:egret.Sound = loader.data;
+ sound.play();
+}, this);
+loader.dataFormat = egret.URLLoaderDataFormat.SOUND;
+loader.load(new egret.URLRequest("resource/sound/sound.mp3"));
+```
+### 1.3.通过 res 加装音频。
+
+* 具体调用如下。
+```javascript
+var sound:egret.Sound = RES.getRes("sound_mp3");
+sound.play();
+```
+## 2.播放Sound
+
+### 2.1.播放方法
+
+* `play()` 方法播放音频,有2个参数。`startTime`:声音开始播放的位置,默认为0。`loops`:声音播放的次数,小于等于0均为无限循环播放,大于0按照对应的值播放次数。
+
+* 运行 `play()` 之后,会返回一个 `SoundChannel` 对象,开发者可以直接对 `SoundChannel` 进行操作,比如设置音量等。
+
+* `SoundChannel` 对象的 `egret.Event.SOUND_COMPLETE` 事件是播放完成事件。
+
+* 根据 `SoundChannel` 返回的 `position` 属性和 `Sound` 的 `play()` 方法可实现暂停和重播功能。
+
+* `stop()` 方法停止播放。
+
+### 2.2.播放类型
+
+目前引擎内提供了4种声音的兼容模式,分别是 Audio、 WebAudio、QQAudio(qzone提供的声音解决方案)、以及 NativeAudio(打包方案Audio)
+
+
+* WebAudio:IOS系统版本大于等于7的所有IOS版本的浏览器,Egret 3.2.0 以后 Android 默认也使用 WebAudio,如果不支持 WebAudio 的 app 则会自动改成 Audio 方式。
+
+* QQAudio:在html页面指定了 “ https://qzonestyle.gtimg.cn/qzone/hybrid/lib/jsbridge.js ” (Qzone使用的js api)并且运行在`qq空间`的 android 机型。
+
+* Audio:除使用 WebAudio 以及 QQAudio 外的其他所有的 Web 浏览器或者平台。可能出现的问题是声音播放有延迟,同一时间只能有一个音频的存在。
+
+* NativeAudio:打包方案使用的audio。
+
+
+设置播放类型在项目根目录下的 index.html 模板文件中进行:
+
+```javascript
+/**
+* {
+* "renderMode":, //引擎渲染模式,"canvas" 或者 "webgl"
+* "audioType": 0 //使用的音频类型,0:默认,1:qq audio,2:web audio,3:audio
+* "antialias": //WebGL模式下是否开启抗锯齿,true:开启,false:关闭,默认为false
+* "retina": //是否基于devicePixelRatio缩放画布
+* }
+**/
+egret.runEgret({renderMode:"webgl", audioType:0});
+```
+
+## 3.音频示例
+
+播放音频的简单示例代码如下 :
+
+```javascript
+class SoundExample extends egret.DisplayObjectContainer {
+ public constructor() {
+ super();
+ this.once(egret.Event.ADDED_TO_STAGE,this.onAddtoStage,this);
+ }
+
+ private onAddtoStage() {
+ this.startLoad();
+ }
+
+ private startLoad():void {
+ //创建 URLLoader 对象
+ var loader:egret.URLLoader = new egret.URLLoader();
+ //设置加载方式为声音
+ loader.dataFormat = egret.URLLoaderDataFormat.SOUND;
+ //添加加载完成侦听
+ loader.addEventListener(egret.Event.COMPLETE, this.onLoadComplete, this);
+ //音频资源放在resource文件夹下
+ var url:string = "resource/soundtest.mp3";
+ var request:egret.URLRequest = new egret.URLRequest(url);
+ //开始加载
+ loader.load(request);
+ }
+
+ private onLoadComplete(event:egret.Event):void {
+ var loader:egret.URLLoader = event.target;
+ //获取加载到的 Sound 对象
+ var sound:egret.Sound = loader.data;
+ this.sound = sound;
+ //一个简单的播放按钮
+ var btn = new egret.Sprite();
+ btn.graphics.beginFill(0x18f7ff);
+ btn.graphics.drawRoundRect(0,0,80,40,5,5);
+ btn.graphics.endFill();
+ btn.touchEnabled = true;
+
+ btn.anchorOffsetX = btn.width / 2;
+ btn.x = this.stage.stageWidth / 2;
+ btn.anchorOffsetY = btn.height / 2;
+ btn.y = this.stage.stageHeight / 2;
+ //监听按钮的触摸事件
+ btn.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onTouch,this);
+
+ this.addChild(btn);
+ }
+ private sound:egret.Sound;
+ private soundChannel:egret.SoundChannel;
+
+ private onTouch(event:egret.Event){
+
+ var sound = this.sound;
+ var channel:egret.SoundChannel = this.soundChannel;
+ if(channel){
+ //调用soundChannel对象的stop方法停止播放音频
+ console.log(channel);
+ channel.stop();
+ this.soundChannel = null;
+ return;
+ }
+ //使用SoundChannel播放音频
+ channel = sound.play(0,-1);
+ //Egret 3.0.4 新增获取音频长度 length 属性。
+ console.log(sound.length);
+ channel.addEventListener(egret.Event.SOUND_COMPLETE, this.onSoundComplete, this);
+ //保存soundChannel对象
+ this.soundChannel = channel;
+ }
+
+ private onSoundComplete(event:egret.Event):void {
+ console.log("onSoundComplete");
+ }
+}
+```
+
+首先使用 `URLLoader` 来载入音频,也可以使用上面的其他两种方式载入音频。监听这个音频的加载完成事件,当加载完成之后获取到音频的数据并新建`sound`对象。
+调用`play()`方法来播放音频,本例中,开始时间的单位为0秒,循环播放。
+这里`play`方法会返回一个`SoundChannel`对象,通过控制`SoundChannel`的`volume`属性来设置音量大小,音量范围从 0(静音)至 1(最大音量)。`SoundChannel`对象的`position`属性可以获取到当前播放的时间,单位为秒。需要注意的是`position`属性是一个只读的属性,不能通过设置`position`来设置当前的播放时间。
+如果需要停止声音,可以调用`SoundChannel`对象的 `stop()` 方法。
+
+
+## 4.注意事项
+
+* 声音资源的格式生成请严格按照此步骤来,不然会影响兼容性。
+
+1. 使用格式工厂。选择 44100Hz,96kbps 转换。
+
+2. 如果还有问题,请再转一次。
+
+3. 如果还有问题,请裁减音频长度再次转换。
+
+4. 如果还有问题,请到论坛联系我们 [开发者论坛](http://bbs.egret.com/portal.php),并提供对应的音频文件。
+
+> 如果有问题,请尝试多转几次。
+
+> 对于更专业的转换工具比如 audition,在测试中发现转换后的文件并不能解决在所有的浏览器中的播放问题,所以不推荐大家使用。
+
+> 在 iOS 系统(所有设备,包括IPAD)中,使用者在可能付费的网络环境中需要等待用户交互操作后才能播放媒体。为了获得在 iOS 系统中最大的兼容性,请避免使用自动播放音频(载入完成即播放),应添加合适的触发条件(比如播放按钮)。
+
+> 如果使用 WebAudio 方式还不能自动播放的话,那么目前来说没有其他方式来解决自动播放的问题。
+
+* iOS 游戏的域名必须要在玩吧指定的域名下才可以使用上面提到的Qzone的js api(jsBridge)。
+
+* 由于一些浏览器不支持直接加载后播放,因此建议先预加载音乐文件,并在点击事件时直接调用 `sound.play()`。
+
+* 非 WebAudio 方式播放的音频,很有可能在浏览器只能同时播放一种声音(这个也是为什么qzone单独提供了声音解决方案)。
diff --git a/Engine2D/multimedia/environment/README.md b/Engine2D/multimedia/environment/README.md
new file mode 100644
index 0000000..925d78a
--- /dev/null
+++ b/Engine2D/multimedia/environment/README.md
@@ -0,0 +1,209 @@
+
+## 1.系统信息
+Egret 项目可以运行在支持HTML5的桌面浏览器和各种移动浏览器中。也可以运行在 Egret Runtime 的加速和原生系统环境中。若要获得不同系统的系统信息可以通过`egret.Capabilities `类来获取。需要注意的是它的值都是静态的,可以读取但是不能更改。
+
+**注意:** 电脑上没有陀螺仪和GPS模块,无法获取相关信息,需要在手机上调试。
+
+### 1.1.系统常量
+
+#### egret.Capabilities.isMobile
+通过`egret.Capabilities.isMobile`可以知道程序是否运行在移动系统中。它的值是一个静态的布尔型值,当获取到的值为`true`时表示在移动系统中。
+
+#### egret.Capabilities.language
+`egret.Capabilities.language`表示运行内容的系统的语言代码。它的值是ISO 639-1中的小写双字母语言代码。可以参考[ISO 639-1](http://baike.baidu.com/link?url=me8UVbWB-oLjVT_fyxTqPwzf4cagZroNFfbiZy0Meo3VnACeZOup5vabLqoRaDwozxGm-dx600XBZRRV34pkca#2)
+
+其中可能遇到的比价特殊是是以下几项:
+
+* 简体中文 zh-CN
+* 繁体中文 zh-TW
+* 英语 en
+* 日语 ja
+* 韩语 ko
+
+#### egret.Capabilities.os
+`egret.Capabilities.os`属性表示当前操作系统,具体可能值如下:
+
+* 苹果手机操作系统 "iOS"
+* 安卓手机操作系统 "Android"
+* 微软手机操作系统 "Windows Phone"
+* 微软桌面操作系统 "Windows PC"
+* 苹果桌面操作系统 "Mac OS"
+* 未知操作系统 "Unknown"
+
+#### egret.Capabilities.runtimeType
+`egret.Capabilities.runtimeType`属性可以获取的项目运行类型。
+
+| 属性值 |对应的常量 |对应的类型 |
+|:-------------|-------------|-------------:|
+|web| egret.RuntimeType.WEB | 运行在浏览器上|
+|native| egret.RuntimeType.NATIVE | 运行在第一代原生项目上|
+|runtime2| egret.RuntimeType.RUNTIME2 | 运行在第二代原生项目上|
+|wxgame| egret.RuntimeType.WXGAME | 运行在微信小游戏上|
+
+
+
+### 1.2.示例
+获得系统信息可以参考下面的代码:
+
+```javascript
+/**
+ * 获取系统信息类
+ */
+class CapabilitiesTest extends egret.Sprite {
+
+ public constructor () {
+
+ super();
+
+ var capabilites:Array = [
+ {text:"移动设备: " + egret.Capabilities.isMobile + "n",style:{size:17,"fontFamily": "楷体"}} ,
+ {text:"语言代码: " + egret.Capabilities.language + "n",style:{size:17,"fontFamily": "楷体"}},
+ {text:"操作系统: " + egret.Capabilities.os + "n",style:{size:17,"fontFamily": "楷体"}},
+ {text:"运行类型: " + egret.Capabilities.runtimeType + "n",style:{size:17,"fontFamily": "楷体"}}
+ ];
+
+ var showCapabilities:egret.TextField = new egret.TextField();
+
+ showCapabilities.textFlow = capabilites;
+
+ this.addChild(showCapabilities);
+
+ }
+}
+```
+
+## 2.陀螺仪
+
+在移动设备中,一般支持获取设备本身的旋转角度。`egret.DeviceOrientation` 可以监听设备方向的变化。
+
+### 2.1.获取设备旋转角度
+
+如下示例演示了如何监听旋转的变化并获得旋转的值:
+
+```javascript
+class DeviceOrientationExample extends egret.DisplayObjectContainer {
+ private label: egret.TextField;
+ public constructor() {
+ super();
+ this.label = new egret.TextField();
+ this.label.y = 50;
+ this.label.x = 50;
+ this.addChild(this.label);
+ //创建 DeviceOrientation 类
+ var orientation = new egret.DeviceOrientation();
+ //添加事件监听器
+ orientation.addEventListener(egret.Event.CHANGE,this.onOrientation,this);
+ //开始监听设备方向变化
+ orientation.start();
+ }
+ private onOrientation(e:egret.OrientationEvent){
+ this.label.text =
+ "方向: nalpha:"+e.alpha
+ +",nbeta:"+e.beta
+ +",ngamma:"+e.gamma;
+ }
+}
+```
+
+上面代码首先创建了`DeviceOrientation`的实例`orientation`。并给他添加了一个事件侦听器,监听它的`CHANGE`事件。然后调用了他的`start()`方法来开始监听设备方向的变化。
+
+当系统监听到了方向的变化后,将回调函数 `onOrientation`。然后通过`egret.OrientationEvent`事件的三个属性来获取设备的方向变化信息。
+
+`OrientationEvent`的三个属性:`alpha`,`beta`和`gamma`。
+
+* `alpha`表示设备绕 Z 轴的角度,单位是 角度 范围是 0 到 360。
+
+* `beta` 表示设备绕 X 轴的角度,单位是 角度 范围是 -180 到 180.这个值表示设备从前向后的旋转状态。
+
+* `gamma` 表示设备绕 Y 轴的角度,单位是 角度 范围是 -90 到 90.这个值表示设备从左到右的旋转状态。
+
+
+## 3.地理位置
+
+很多原生应用和游戏通过移动设备的硬件支持来获取用户的位置信息,Egret 也支持获取位置信息。
+
+通过 Egret 的 `Geolocation`类来获取设备的当前位置。当开始监听位置改变信息时将派发`CHANGE`事件,并将改变的位置信息传递给回调函数。通过`GeolocationEvent`类型的回调参数可以获取到相应的经纬度,速度,海拔等信息。
+
+### 3.1.获取位置信息
+
+示例代码如下:
+
+```javascript
+/**
+ * 获取地理位置信息并显示出来
+ */
+class GeolocationTest extends egret.DisplayObjectContainer {
+ private label: egret.TextField;
+ public constructor() {
+ super();
+ //显示信息的label
+ this.label = new egret.TextField();
+ this.label.x = STAGEWIDTH / 2;
+ this.addChild(this.label);
+ this.label.size = 20;
+ this.label.text = "暂未获取到经纬度信息";
+ this.label.anchorOffsetX = this.label.width / 2;
+
+ var gps = new egret.Geolocation();
+ //监听经纬度变化的事件
+ gps.addEventListener(egret.Event.CHANGE,this.onGotLocation,this);
+ //开始监听变化
+ gps.start();
+ }
+ private onGotLocation(e:egret.GeolocationEvent){
+ this.label.text = "纬度: "+e.latitude.toFixed(4)+
+ " 海拔: "+e.altitude+
+ "n经度:"+e.longitude.toFixed(4)
+ +" 速度: "+e.speed;
+ this.label.anchorOffsetX = this.label.width / 2;
+ }
+}
+```
+
+这里实例化了一个`Geolocation`对象,并给它添加了一个监听器。当`gps`执行`start()`方法后就开始监听位置变化。如果需要关闭监听可以使用它的`stop()`方法。
+如果可以获取到位置信息的改变,将调用`onGotLocation()`。这里通过下面属性来获取位置的具体值。
+
+* latitude 纬度信息
+* longitude 经度信息
+* altitude 海拔信息
+* speed 速度信息
+
+需要注意的是`altitude`和`speed`可能是null
+
+### 3.2.获取信息失败的处理
+
+要获得用户的位置信息时需要用户允许的。如果当用户选择了不共享当前的位置信息,将抛出`GeolocationEvent`的`PERMISSION_DENIED`事件。
+
+在我们上面的构造函数里添加gps的监听:
+```javascript
+//监听用户拒绝事件
+gps.once(egret.GeolocationEvent.PERMISSION_DENIED,this.userDenied,this);
+```
+并给在 `GeolocationTest` 里添加处理函数,将该信息提示给用户:
+
+```javascript
+private userDenied(e:egret.GeolocationEvent){
+ this.label.text = "用户拒绝访问位置信息,获取位置信息失败";
+ this.label.anchorOffsetX = this.label.width / 2;
+}
+```
+
+如果由于其他原因未能获取位置信息,将抛出`GeolocationEvent`的`UNAVAILABLE`事件。这里完善上面的程序,添加不能获取信息时的处理:
+
+```javascript
+//监听失败事件
+gps.addEventListener(egret.GeolocationEvent.UNAVAILABLE,this.unAvailable,this);
+```
+
+在`GeolocationTest` 里添加处理函数,将该信息提示给用户:
+
+```javascript
+private unAvailable (e:egret.GeolocationEvent) {
+ this.label.text = "获取位置信息失败: " + e.errorMessage + "n"
+ + "错误类型: " + e.errorType;
+ this.label.anchorOffsetX = this.label.width / 2;
+}
+```
+
+这里的`errorMessage`表示获取位置信息失败的具体信息,`errorType`表示错误的类型。
+
diff --git a/Engine2D/multimedia/video/561dc2093af5e.png b/Engine2D/multimedia/video/561dc2093af5e.png
new file mode 100644
index 0000000..351899c
Binary files /dev/null and b/Engine2D/multimedia/video/561dc2093af5e.png differ
diff --git a/Engine2D/multimedia/video/561dc219f3902.png b/Engine2D/multimedia/video/561dc219f3902.png
new file mode 100644
index 0000000..0dcc408
Binary files /dev/null and b/Engine2D/multimedia/video/561dc219f3902.png differ
diff --git a/Engine2D/multimedia/video/README.md b/Engine2D/multimedia/video/README.md
new file mode 100644
index 0000000..e0ebbf5
--- /dev/null
+++ b/Engine2D/multimedia/video/README.md
@@ -0,0 +1,233 @@
+在 Egret 中,可通过`egret.Video`来创建和管理视频。
+
+> 需要注意的是,大部分移动设备只支持全屏播放。
+
+## 1.准备工作
+
+W3C 提供了在线地址来测试 HTML5 的视频功能。地址为:`http://media.w3.org/2010/05/sintel/trailer.mp4`。
+
+下面的代码将使用这个视频作为素材。代码中需要一些 UI 的元素,所以使用默认的 EUI 项目。
+
+可以通过:
+
+```
+egret create VideoTest --type eui
+```
+
+来创建默认的 EUI 项目。更多关于使用 EUI 方法参考:[EUI库 快速入门](http://developer.egret.com/cn/github/egret-docs/extension/EUI/getStarted/getStarted/index.html)
+
+## 2.使用方法
+
+### 2.1.创建视频
+创建`Video`的代码如下:
+
+```javascript
+class VideoTest extends egret.DisplayObjectContainer {
+ public constructor() {
+ super();
+ this.video = new egret.Video();
+ this.video.x = 0; //设置视频坐标x
+ this.video.y = 0; //设置视频坐标y
+ this.video.width = 640; //设置视频宽
+ this.video.height = 320; //设置视频高
+ this.video.fullscreen = false; //设置是否全屏(暂不支持移动设备)
+ this.video.poster = "resource/assets/Button/button_up.png"; //设置loding图
+ this.video.load("http://media.w3.org/2010/05/sintel/trailer.mp4");
+ this.addChild(this.video); //将视频添加到舞台
+ //监听视频加载完成
+ this.video.once(egret.Event.COMPLETE,this.onLoad,this);
+ //监听视频加载失败
+ this.video.once(egret.IOErrorEvent.IO_ERROR,this.onLoadErr,this);
+ }
+ private video: egret.Video;
+ private onLoad(e: egret.Event) {
+ var btnPlay: eui.Button = new eui.Button(); //新建播放按钮
+ btnPlay.label = "播放";
+ btnPlay.x = this.video.x + 20;
+ btnPlay.y = this.video.y + this.video.height + 20;
+ this.addChild(btnPlay);
+ //监听按钮行为,当按下时调用播放函数。
+ btnPlay.addEventListener(egret.TouchEvent.TOUCH_TAP,this.play,this);
+ //获取视频长度
+ console.log(this.video.length);
+ }
+ private onLoadErr(e: egret.Event) {
+ console.log("video load error happened");
+ }
+ public play(e: egret.TouchEvent) {
+ this.video.play();
+ }
+}
+```
+
+这里需要注意的是在 EUI 默认项目的入口文件类里面需要实例化上面的`VideoTest`,并删除默认的 UI。代码如下:
+
+```javascript
+class Main extends eui.UILayer {
+
+ protected createChildren(): void {
+ super.createChildren();
+
+ var theme = new eui.Theme("resource/default.thm.json", this.stage);
+ this.addChild(new VideoTest());
+ }
+}
+```
+
+编译并运行我们可以看到如下的效果:
+
+![](561dc2093af5e.png)
+
+> 注意: 在大多数移动设备中,视频是强制全屏播放的。当在手机上点击播放时会弹出全屏的播放器。而上面的代码在PC上将按照我们的设定不会全屏播放。
+
+在上述代码中,首先设置了视频的宽高和位置。 `egret.Video`类同样继承自DisplayObject,所以可以操作其的位置宽高和`touchEnable`属性等。同样也需要加到显示列表当中才能被显示出来。
+
+然后设置了`poster` 属性为本地的一张图片,`poster`表示视频加载前,或者在不支持将 video 画在 canvas 的设备上,想要显示的视频截图地址,也就是下面的截图。
+
+![](561dc219f3902.png)
+
+之后通过`load`方法载入了视频的地址,然后监听加载完成和失败的事件。
+
+> 需要注意的是视频需要加载完成再调用`play()`方法。
+
+这里当视频加载完成之后添加一个播放按键,当点击时播放该视频。
+
+这里视频的`play()`方法有两个参数,为播放的位置和是否循环。默认的从头开始播放,并且不循环。
+
+### 2.2.暂停视频
+
+通过`Video`的`pause()`方法将暂停视频。
+继续完善上面的程序,添加暂停按钮的功能。在`onLoad`函数中,绘制一个暂停的按钮,并监听其行为:
+
+```javascript
+//在onLoad函数中添加暂停按钮
+var btnPause:eui.Button = new eui.Button();
+btnPause.label = "暂停";
+btnPause.x = btnPlay.x + btnPlay.width + 20;
+btnPause.y = btnPlay.y;
+this.addChild(btnPause);
+btnPause.addEventListener(egret.TouchEvent.TOUCH_TAP,this.pause,this);
+```
+
+然后在`VideoTest`类中添加暂停视频函数:
+```javascript
+public pause(e:egret.TouchEvent) {
+ this.video.pause(); //暂停视频
+}
+```
+
+点击该按钮视频将暂停播放,再一次点击播放按钮视频将继续播放。
+
+### 2.3.设置音量
+
+通过设置`Video`的`volume`属性可以设置其音量的大小。其属性值为0到1。
+下面通过 EUI 的水平滑块来控制。同样在`onLoad`函数中添加如下代码:
+
+```javascript
+//设置控制音量的滑块,监听它的CHANGE事件,当滑动滑块时回调 `setVoluem()` 函数。
+var volume:eui.HSlider = new eui.HSlider();
+volume.x = btnPlay.x;
+volume.y = btnPlay.y + btnPlay.height + 20;
+this.addChild(volume);
+volume.value = 100;
+volume.maximum = 100;
+volume.minimum = 0;
+volume.width = 200;
+volume.addEventListener(egret.Event.CHANGE,this.setVoluem,this);
+```
+
+然后在`VideoTest`类中添加设置音量的函数:
+
+```javascript
+public setVoluem(e:egret.Event) {
+ this.video.volume = e.target.value / 100;
+}
+```
+这里滑块设置的最大值和最小值是0和100,由于`volume`的默认值为0到1,所以要除以100.
+
+### 2.4.全屏播放
+
+只有在桌面浏览器上才能控制非全屏的效果。通过设置`fullscreen`属性来控制是否全屏。默认值为`true`,即全屏播放。
+
+同样在`onLoad`函数中添加如下代码:
+
+```javascript
+//设置全屏播放开关按钮
+var screenSwitcher:eui.ToggleSwitch = new eui.ToggleSwitch();
+screenSwitcher.label = "全屏";
+screenSwitcher.x = btnPause.x + btnPause.width + 20;
+screenSwitcher.y = btnPause.y;
+screenSwitcher.addEventListener(egret.Event.CHANGE,this.setFullScreen,this);
+this.addChild(screenSwitcher);
+```
+
+然后在`VideoTest`类中添加设置是否全屏显示的函数:
+
+```javascript
+public setFullScreen(e:egret.Event) {
+ //当开关被选择后。该开关的selected属性将变为true,反之则为false
+ this.video.fullscreen =e.target.selected;
+}
+```
+
+### 2.5.显示播放时间
+
+`Video`的`position`属性表示视频文件中当前播放的位置(以秒为单位)。
+
+同样在`onLoad`函数中添加如下代码,用来显示播放时间。
+
+```javascript
+//使用label标签来显示文字,并监听`ENTER_FRAME`事件来更新显示。
+var position:eui.Label = new eui.Label();
+position.x = btnPlay.x;
+position.y = volume.y + volume.height + 20;
+this.addChild(position);
+position.addEventListener(egret.Event.ENTER_FRAME,this.showPosition,this);
+```
+
+然后在`VideoTest`类中添加显示播放时间的函数:
+
+```javascript
+public showPosition(e:egret.Event) {
+ e.target.text = "播放时间: " + this.video.position;
+}
+```
+
+### 2.6.获取视频的`bitmapData`
+
+通过视频的`bitmapData`属性可以获得其当前帧的纹理信息。可以将它绘制到舞台上。
+
+在`onLoad`函数中添加截图的按钮,点击该按钮将在舞台上添加一张截图:
+
+```javascript
+var btnPrintScreen:eui.Button = new eui.Button();
+btnPrintScreen.label = "截图";
+btnPrintScreen.x = screenSwitcher.x + screenSwitcher.width + 40;
+btnPrintScreen.y = btnPlay.y;
+this.addChild(btnPrintScreen);
+btnPrintScreen.addEventListener(egret.TouchEvent.TOUCH_TAP,this.printScreen,this);
+```
+
+然后在`VideoTest`类中添加截图的函数:
+
+```javascript
+public printScreen(e:egret.Event) {
+ var bitmap:egret.Bitmap = new egret.Bitmap();
+ bitmap.bitmapData = this.video.bitmapData;
+ bitmap.x = this.video.x;
+ bitmap.y = this.video.y + this.video.height + 150;
+ this.addChild(bitmap);
+}
+```
+
+这里创建了一个位图,并将它的`bitmapData`属性设置为视频的`bitmapData`属性。将该位图添加到舞台上面就可以显示截图了。
+
+### 2.7.获取视频长度
+
+`Video`的 `length` 属性可以获得视频的长度。
+
+```javascript
+//获取视频长度
+console.log(this.video.length);
+```
+
diff --git a/Engine2D/net/loadBitmap/README.md b/Engine2D/net/loadBitmap/README.md
new file mode 100644
index 0000000..5779363
--- /dev/null
+++ b/Engine2D/net/loadBitmap/README.md
@@ -0,0 +1,30 @@
+## 1.使用
+Egret 提供了 `ImageLoader` 类,用于加载位图文件。
+
+例如 `ImageLoader` 类通过如下代码加载位于 'resource/egret.png' 的图片:
+
+``` javascript
+var imgLoader:egret.ImageLoader = new egret.ImageLoader;
+imgLoader.once( egret.Event.COMPLETE, this.imgLoadHandler, this );
+imgLoader.load( "resource/egret.png" );
+```
+
+在所定义的回调事件中,可以用下面的方式获取该图片对应的 BitmapData,并以此来创建位图:
+
+``` javascript
+imgLoadHandler( evt:egret.Event ):void{
+ let loader:egret.ImageLoader = evt.currentTarget;
+ let bmd:egret.BitmapData = loader.data;
+ //创建纹理对象
+ let texture = new egret.Texture();
+ texture.bitmapData = bmd;
+ let bmp:egret.Bitmap = new egret.Bitmap(texture);
+ this.addChild(bmp);
+}
+```
+
+## 2.跨域处理
+
+* 服务器设置访问权限。
+* 可以通过尝试修改 `imgLoader.crossOrigin = 'anonymous'` 来以匿名的方式访问。不过在使用 `texture.toDataURL` 时会报跨域问题。
+* Webgl 渲染下,暂不支持跨域图片处理。
diff --git a/Engine2D/net/loadText/README.md b/Engine2D/net/loadText/README.md
new file mode 100644
index 0000000..224bbf8
--- /dev/null
+++ b/Engine2D/net/loadText/README.md
@@ -0,0 +1,74 @@
+Egret 加载资源主要使用 `egret.HttpRequest` 类。该类封装了在异步加载资源和通讯方面作为 H5 标准的 `XMLHttpRequest` 对象。
+
+本节讲解的主要是加载静态文件,分为两种类型:文本和二进制数据。
+加载静态文件的特点是可以进行进度跟踪。
+
+## 1.加载文本
+
+`HttpRequest` 对象最核心的方法就是 `open()` 和 `send()` 。 `open()` 方法接收该请求所要访问的URL。 作为可选项还可以传入加载方式,这个参数通常用 `HttpMethod` 取常量,默认是最常用的 GET 方式。
+在加载完成时,通过 `HttpRequest` 对象的 `response` 属性来获取返回的数据。
+加载文本数据的方法如下:
+
+```javascript
+var url = "resource/config/description.json";
+var request:egret.HttpRequest = new egret.HttpRequest();
+
+var respHandler = function( evt:egret.Event ):void{
+ switch ( evt.type ){
+ case egret.Event.COMPLETE:
+ var request:egret.HttpRequest = evt.currentTarget;
+ console.log( "respHandler:n", request.response );
+ break;
+ case egret.IOErrorEvent.IO_ERROR:
+ console.log( "respHandler io error" );
+ break;
+ }
+}
+
+var progressHandler = function( evt:egret.ProgressEvent ):void{
+ console.log( "progress:", evt.bytesLoaded, evt.bytesTotal );
+}
+
+request.once( egret.Event.COMPLETE, respHandler, null);
+request.once( egret.IOErrorEvent.IO_ERROR, respHandler, null);
+request.once( egret.ProgressEvent.PROGRESS, progressHandler, null);
+request.open( url, egret.HttpMethod.GET );
+request.send( );
+```
+`HttpRequest` 默认的加载类型是 TEXT ,因此不需要专门设定。
+需要侦听的主要事件是 `COMPLETE` ,从这里获取数据。
+要考虑意外的情况,在 IO_ERROR 做这些情况的处理。
+加载进度事件是 `ProgressEvent.PROGRESS` , 在加载内容较大的资源时比较有用。
+
+## 2.加载二进制
+加载二进制数据的方法如下:
+
+```javascript
+var url = "resource/assets/egret_icon.png";
+var request:egret.HttpRequest = new egret.HttpRequest();
+request.responseType = egret.HttpResponseType.ARRAY_BUFFER;
+
+var respHandler = function( evt:egret.Event ):void {
+ switch ( evt.type ){
+ case egret.Event.COMPLETE:
+ var request:egret.HttpRequest = evt.currentTarget;
+ var ab:ArrayBuffer = request.response;
+ console.log( "respHandler:n", ab.byteLength );
+ break;
+ case egret.IOErrorEvent.IO_ERROR:
+ console.log( "respHandler io error" );
+ break;
+ }
+}
+
+request.once( egret.Event.COMPLETE, respHandler, null);
+request.once( egret.IOErrorEvent.IO_ERROR, respHandler, null);
+request.open( url, egret.HttpMethod.GET );
+request.send( );
+```
+加载二进制数据,先设置 `HttpRequest` 的加载类型为 `ARRAY_BUFFER`。
+数据加载完成后可从 `response` 属性取到 `ArrayBuffer` 对象,即可进行进一步读取操作。
+
+>通过 `URLLoader` 构建通信请求请访问:
+[URLLoader网络通讯](../../../extension/game/URLLoaderNetwork/README.md)
+`URLLoader` 类已移动到 game 扩展库中。
diff --git a/Engine2D/net/sendHTTP/README.md b/Engine2D/net/sendHTTP/README.md
new file mode 100644
index 0000000..b5a7e60
--- /dev/null
+++ b/Engine2D/net/sendHTTP/README.md
@@ -0,0 +1,297 @@
+Egret 中封装了 `XMLHttpRequest` 进行异步的数据交互。
+
+## 1.HTTP请求
+
+通过 HTTP 协议可以实现 HTTP 客户端(如web浏览器)向 HTTP 服务端请求信息和服务。目前的 HTTP 1.1 协议是一种无状态协议,也就是说 HTTP 客户端和 HTTP 服务端不能保持持久的链接,使用请求/应答的模式来工作,如果客户端向服务端发送信息,服务端做出应答之后将关闭链接,来形成一套请求和应答。
+
+### 1.1.基本过程
+
+HTTP 通信机制都要经过如下的几个步骤:
+
+1. 建立TCP连接.
+2. Web浏览器向Web服务器发送请求命令.
+3. Web浏览器发送请求头信息
+4. Web服务器应答
+5. Web服务器发送应答头信息
+6. Web服务器向浏览器发送数据
+7. Web服务器关闭TCP连接(如果请求头部设置了`Connection:keep-alive`将保持连接状态仍然打开).
+
+### 1.2.HTTP 请求方法
+
+#### GET 方法
+
+GET 方法是 HTTP 请求的默认方法,数据经过简单的编码发送出去,并作为 URL 的一部分发送到服务器。由于浏览器对 URL 长度的限制,提交的数据长度也有限制。
+
+#### POST 方法
+
+POST 方法克服了 GET 方法的一些缺点,可以发送较大的数据.数据也不再是明文发送的。出于安全的考虑一般选用 POST 方法。 POST 提交的数据也可以从标准输入输出流中获取。
+
+## 2.发送请求
+
+测试发送请求,需要一个稳定的服务端。可以使用[httpbin.org](http://httpbin.org/)提供的`http://httpbin.org/get`和`http://httpbin.org/post`这两个稳定的服务器地址来测试发送请求。其中[get](http://httpbin.org/get)会返回 GET 请求的数据,[post](http://httpbin.org/post)会返回 POST 请求发送的数据。
+
+Egret 使用 `HttpRequest` 类发送 HTTP 请求。可以指定请求的方法为 GET 或者 POST 。可以通过监听加载事件来检测服务器端的响应。使用 `HttpRequest` 来发送请求的过程如下:
+
+1. 实例化一个 `HttpRequest` 对象。
+2. 设置它的响应类型 `responseType`。
+3. 通过 `open` 方法初始化请求一个对象,初始化请求地址和请求类型。
+4. 通过 `setRequestHeader` 设置请求头信息。如果是POST带参数的请求这一步很重要,需要告诉服务端请求的参数格式,而且这一步需要在 `open` 之后执行。
+5. 通过 `send` 方法发送请求,如果是 `post` 方法可以传入参数。
+6. 添加监听,监听服务器端的响应,包括进度事件和请求成功和失败事件。
+
+
+代码如下:
+
+~~~javascript
+var request = new egret.HttpRequest();
+request.responseType = egret.HttpResponseType.TEXT;
+request.open("http://httpbin.org/get",egret.HttpMethod.GET);
+request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+request.send();
+request.addEventListener(egret.Event.COMPLETE,this.onGetComplete,this);
+request.addEventListener(egret.IOErrorEvent.IO_ERROR,this.onGetIOError,this);
+request.addEventListener(egret.ProgressEvent.PROGRESS,this.onGetProgress,this);
+~~~
+
+上面发送了一个 GET 请求到`http://httpbin.org/get`,然后添加回调事件,当请求成功或者失败之后来获取数据。
+
+通过`COMPLETE`事件的`response`属性可获取到返回的信息。通过 `ProgressEvent` 事件的`bytesLoaded`和`bytesTotal`获取可加载进度。回调函数代码如下:
+
+~~~javascript
+private onGetComplete(event:egret.Event):void {
+ var request = event.currentTarget;
+ console.log("get data : ",request.response);
+ var responseLabel = new egret.TextField();
+ responseLabel.size = 18;
+ responseLabel.text = "GET response: \n" + request.response.substring(0, 50) + "...";
+ this.addChild(responseLabel);
+ responseLabel.x = 50;
+ responseLabel.y = 70;
+}
+
+private onGetIOError(event:egret.IOErrorEvent):void {
+ console.log("get error : " + event);
+}
+
+private onGetProgress(event:egret.ProgressEvent):void {
+ console.log("get progress : " + Math.floor(100*event.bytesLoaded/event.bytesTotal) + "%");
+}
+~~~
+
+发送 POST 请求的代码如下:
+
+~~~javascript
+var request = new egret.HttpRequest();
+request.responseType = egret.HttpResponseType.TEXT;
+//设置为 POST 请求
+request.open("http://httpbin.org/post",egret.HttpMethod.POST);
+request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+request.send();
+request.addEventListener(egret.Event.COMPLETE,this.onPostComplete,this);
+request.addEventListener(egret.IOErrorEvent.IO_ERROR,this.onPostIOError,this);
+request.addEventListener(egret.ProgressEvent.PROGRESS,this.onPostProgress,this);
+~~~
+
+添加回调函数:
+
+~~~javascript
+private onPostComplete(event:egret.Event):void {
+ var request = event.currentTarget;
+ console.log("post data : ",request.response);
+ var responseLabel = new egret.TextField();
+ responseLabel.size = 18;
+ responseLabel.text = "POST response:\n" + request.response.substring(0, 50) + "...";
+ this.addChild(responseLabel);
+ responseLabel.x = 300;
+ responseLabel.y = 70;
+}
+
+private onPostIOError(event:egret.IOErrorEvent):void {
+ console.log("post error : " + event);
+}
+
+private onPostProgress(event:egret.ProgressEvent):void {
+ console.log("post progress : " + Math.floor(100*event.bytesLoaded/event.bytesTotal) + "%");
+}
+~~~
+
+## 3.发送带参数的请求
+
+上面我们发送了一段空的请求到服务端,实际使用过程中一般都需要发送带参数的请求到服务端。
+
+发送数据的格式:在 HTTP 客户端发送的数据,一般以`key`和`value`的形式组成,多个数据之间用`&`相连。拼接之后形成如下的形式:
+
+~~~javascript
+key1=value1&key2=valueP2
+~~~
+
+通过 GET 方法发送的参数会加到 URL 的后面拼接起来,并以`?`分隔。POST 方法发送的参数需要先设置 HTTP 请求的头信息,告诉服务端是以什么样的形式来发送的数据。我们最常用的就是`application/x-www-form-urlencoded`,表示我们以`key`和`value`方式来格式化参数。服务端也可以用同样的方法来取到参数。
+
+### 3.1.服务端获取参数配置
+
+下面以 PHP 为例来简要说明发送和或取参数的基本过程。
+
+> PHP 环境配置请自行配置。其他后端语言同理。如果不使用`key`和`value`的方式获取数据,请参考相应语言的标准输入流的方式来获取。
+
+首先建立`get_testphp`文件,在 PHP 中获得 GET 的参数可以通过一个全局数组`$_GET[]`来获取到。下面代码将获取并返回`key`为`p1`和`p2`的参数的值。
+
+~~~javascript
+
+~~~
+
+同理建立`post_test.php`,在 PHP 中通过全局数组`$_POST[]`来获取参数。下面代码将获取并返回`key`为`p1`和`p2`的参数的值。
+~~~javascript
+
+~~~
+
+### 3.2.客户端发送参数
+
+建立好两个 PHP 文件后,向他们发送参数。
+
+首先是 GET 请求,GET 请求需要将参数拼接到 URL 后面实现。其中 URL 和 参数之间需要用 `?` 链接。修改上面 GET 请求相应代码如下:
+
+~~~javascript
+//拼接参数
+var params = "?p1=getP1&p2=getP2";
+var request = new egret.HttpRequest();
+request.responseType = egret.HttpResponseType.TEXT;
+//将参数拼接到url
+request.open("php/get_test.php"+params,egret.HttpMethod.GET);
+request.send();
+~~~
+
+发送 POST 请求. 需要注意的是发送 POST 请求需要将参数放到`send`方法的参数中发送出去。并且要设置其响应头,在我们的例子中使用`key` `value` 的方式来格式化参数,这里需要设置响应头`Content-Type`为`application/x-www-form-urlencoded`。修改上面 POST 请求相应代码如下:
+
+~~~javascript
+//拼接参数
+var params = "p1=postP1&p2=postP2";
+
+var request = new egret.HttpRequest();
+request.responseType = egret.HttpResponseType.TEXT;
+request.open("php/post_test.php",egret.HttpMethod.POST);
+//设置响应头
+request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+//发送参数
+request.send(params);
+~~~
+
+完整代码如下:
+
+~~~javascript
+/**
+ * 下面的示例使用 egret.HttpRequest 类进行网络通信。
+ */
+class Main extends egret.DisplayObjectContainer {
+
+ private statusGetLabel:egret.TextField;
+ private statusPostLabel:egret.TextField;
+
+ public constructor() {
+ super();
+ this.sendGetRequest();
+ this.sendPostRequest();
+ }
+
+ private sendGetRequest():void {
+ var statusGetLabel = new egret.TextField();
+ this.statusGetLabel = statusGetLabel;
+ statusGetLabel.size = 18;
+ statusGetLabel.text = "GET request being sent to httpbin.org";
+ this.addChild(statusGetLabel);
+ statusGetLabel.x = 50;
+ statusGetLabel.y = 40;
+ var params = "?p1=getP1&p2=getP2";
+ var request = new egret.HttpRequest();
+ request.responseType = egret.HttpResponseType.TEXT;
+ request.open("php/get_test.php"+params,egret.HttpMethod.GET);
+ request.send();
+
+ request.addEventListener(egret.Event.COMPLETE,this.onGetComplete,this);
+ request.addEventListener(egret.IOErrorEvent.IO_ERROR,this.onGetIOError,this);
+ request.addEventListener(egret.ProgressEvent.PROGRESS,this.onGetProgress,this);
+ }
+
+ private onGetComplete(event:egret.Event):void {
+ var request = event.currentTarget;
+ console.log("get data : ",request.response);
+ var responseLabel = new egret.TextField();
+ responseLabel.size = 18;
+ responseLabel.text = "GET response: \n" + request.response.substring(0, 50) + "...";
+ this.addChild(responseLabel);
+ responseLabel.x = 50;
+ responseLabel.y = 70;
+ this.statusGetLabel.text = "Get GET response!";
+ }
+
+ private onGetIOError(event:egret.IOErrorEvent):void {
+ console.log("get error : " + event);
+ }
+
+ private onGetProgress(event:egret.ProgressEvent):void {
+ console.log("get progress : " + Math.floor(100*event.bytesLoaded/event.bytesTotal) + "%");
+ }
+
+ private sendPostRequest() {
+ var statusPostLabel = new egret.TextField();
+ this.statusPostLabel = statusPostLabel;
+ this.addChild(statusPostLabel);
+ statusPostLabel.size = 18;
+ statusPostLabel.x = 300;
+ statusPostLabel.y = 40;
+ statusPostLabel.text = "Sending POST request to httpbin.org";
+
+ var params = "p1=postP1&p2=postP2";
+
+ var request = new egret.HttpRequest();
+ request.responseType = egret.HttpResponseType.TEXT;
+ request.open("php/post_test.php",egret.HttpMethod.POST);
+ request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+ request.send(params);
+ request.addEventListener(egret.Event.COMPLETE,this.onPostComplete,this);
+ request.addEventListener(egret.IOErrorEvent.IO_ERROR,this.onPostIOError,this);
+ request.addEventListener(egret.ProgressEvent.PROGRESS,this.onPostProgress,this);
+
+ }
+
+ private onPostComplete(event:egret.Event) {
+ var request = event.currentTarget;
+ console.log("post data : ",request.response);
+ var responseLabel = new egret.TextField();
+ responseLabel.size = 18;
+ responseLabel.text = "POST response:\n" + request.response.substring(0, 50) + "...";
+ this.addChild(responseLabel);
+ responseLabel.x = 300;
+ responseLabel.y = 70;
+ this.statusPostLabel.text = "Get POST response!";
+ }
+
+ private onPostIOError(event:egret.IOErrorEvent):void {
+ console.log("post error : " + event);
+ }
+
+ private onPostProgress(event:egret.ProgressEvent):void {
+ console.log("post progress : " + Math.floor(100*event.bytesLoaded/event.bytesTotal) + "%");
+ }
+}
+~~~
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Engine2D/projectConfig/cmdManual/README.md b/Engine2D/projectConfig/cmdManual/README.md
new file mode 100644
index 0000000..ff3b3b6
--- /dev/null
+++ b/Engine2D/projectConfig/cmdManual/README.md
@@ -0,0 +1,212 @@
+
+# 用法
+`egret [command]`
+### 举例:
+ 1、运行名为【HelloWorld】的一个项目
+ egret run HelloWorld
+ 2、编译名为【HelloWorld】的一个项目
+ egret build HelloWorld
+
+# command列表:
+
+## create
+创建新项目
+
+### 用法:
+
+ egret create project_name [--type core|eui]
+### 参数说明:
+
+| 关键字 | 描述
+| ------------ | ------------
+| `project_name` | 项目名称,按照操作系统的命名规范命名
+| `--type` | 要创建的项目类型 core 或 eui,默认值为core
+
+
+### 举例:
+ 1、创建名为【HelloWorld】的一个空项目
+ egret create HelloWorld
+ 2、创建名为【HelloWorld】的一个eui项目
+ egret create HelloWorld --type eui
+
+
+## create_lib
+创建新第三方库项目
+
+### 用法:
+
+ egret create_lib lib_name
+### 参数说明:
+
+| 关键字 | 描述
+| ------------ | ------------
+| `lib_name` | 第三方库名称,按照操作系统的命名规范命名
+
+
+
+
+## create_app
+从h5游戏生成app
+
+### 用法:
+
+ egret create_app app_name -f h5_game_path -t template_path
+
+### 参数说明:
+
+| 关键字 | 描述
+| ------------ | ------------
+| `app_name` | 移动应用项目名称,按照操作系统的命名规范命名
+| `-f` | app项目所对应h5项目的路径
+| `-t` | 对应 Native Support 路径
+
+如果是在项目文件夹下编译,就不要加项目名称
+注意:路径最好加引号,防止路径中有空格报错
+
+## build
+构建指定项目
+
+### 用法:
+
+ egret build [project_name] [-e] [--target wxgame|bricks|ios|android]
+### 参数说明:
+
+| 关键字 | 描述
+| ------------ | ------------
+| `project_name` | 项目名称,按照操作系统的命名规范命名
+| `-e` | 编译指定项目的同时编译引擎目录
+| `--target` | 编译的目标版本,可选参数有 `wxgame`:微信小游戏;`bricks`:玩一玩;`android`:安卓项目;`iOS`:iOS项目
+
+如果是在项目文件夹下执行命令,可以不加项目名称
+
+
+### 举例:
+
+ 1、编译【HelloWorld】
+ egret build HelloWorld
+ 2、编译【HelloWorld】的同时编译引擎
+ egret build HelloWorld -e
+ 3、编译【HelloWorld】的同时编译微信小游戏项目
+ egret build HelloWorld --target wxgame
+
+## publish
+发布项目
+
+### 用法:
+
+ egret publish [project_name] [--version [version]] [--target wxgame|bricks|ios|android]
+### 参数说明:
+
+| 关键字 | 描述
+| ------------ | ------------
+| `project_name` | 项目名称,按照操作系统的命名规范命名
+| `--version` | 设置发布之后的版本号,可以不设置
+| `--target` | 编译的目标版本,可选参数有 `wxgame`:微信小游戏;`bricks`:玩一玩;`android`:安卓项目;`iOS`:iOS项目
+
+ 如果是在项目文件夹下执行命令,可以不加项目名称
+
+### 举例:
+
+ 发布【HelloWorld】到微信小游戏
+ egret publish HelloWorld --version 0.03 --target wxgame
+
+## run
+启动本地服务器,并在默认浏览器中运行指定项目
+
+### 用法:
+
+ egret run [project_name] [--port 3000]
+### 参数说明:
+
+| 关键字 | 描述
+| ------------ | ------------
+| `project_name` | 项目名称,按照操作系统的命名规范命名
+| `--port` | 指定端口号
+
+
+如果是在项目文件夹下执行命令,可以不加项目名称
+
+### 举例:
+
+ 在指定端口下运行【HelloWorld】项目
+ egret startserver HelloWorld --port 3002
+
+## clean
+重置项目中的引擎代码
+
+### 用法:
+
+ egret clean [project_name]
+### 参数说明:
+
+| 关键字 | 描述
+| ------------ | ------------
+| `project_name` | 项目名称,按照操作系统的命名规范命名
+
+如果是在项目文件夹下执行命令,可以不加项目名称
+
+## upgrade
+升级项目代码
+
+### Egret Launcher v1.0 之后的 upgrade
+
+#### 用法:
+
+ egret upgrade [project_name] --egretversion [target version]
+#### 参数说明:
+
+| 关键字 | 描述
+| ------------ | ------------
+| `project_name` | 项目名称,按照操作系统的命名规范命名
+| `target version` | 要切换的目标版本号
+
+如果是在项目文件夹下执行命令,可以不加项目名称
+
+#### 举例:
+
+ 升级当前目录下项目到 5.1.0
+ egret upgrade --egretversion 5.1.0
+
+### Egret Launcher v1.0之前的 upgrade
+
+#### 用法:
+
+ egret upgrade [project_name]
+#### 参数说明:
+
+| 关键字 | 描述
+| ------------ | ------------
+| `project_name` | 项目名称,按照操作系统的命名规范命名
+
+如果是在项目文件夹下执行命令,可以不加项目名称
+
+#### 举例:
+
+ 升级【HelloWorld】项目
+ egret upgrade HelloWorld
+
+### 关于 Egret Launcher v1.0 中项目降版本的说明
+
+ 1. 修改项目根目录下的配置文件 'egretProperties.json' 中的 'egret_version' 字段下的版本号
+ 2. 执行 egret clean 后项目降到目标版本
+
+## make
+修改引擎源码后,编译引擎源码。如果没有特殊需求,不建议普通用户使用
+
+### 用法:
+ egret make
+
+
+
+## info
+获得Egret信息,如当前Egret版本,以及安装路径
+
+### 用法:
+
+ egret info
+
+## help
+了解各个 command 的细节
+
+### 用法
+ egret help [command]
diff --git a/Engine2D/projectConfig/compileOrder/56e7b0cb40856.png b/Engine2D/projectConfig/compileOrder/56e7b0cb40856.png
new file mode 100644
index 0000000..8b0f883
Binary files /dev/null and b/Engine2D/projectConfig/compileOrder/56e7b0cb40856.png differ
diff --git a/Engine2D/projectConfig/compileOrder/56e7b0cb4fc18.png b/Engine2D/projectConfig/compileOrder/56e7b0cb4fc18.png
new file mode 100644
index 0000000..98bb1c2
Binary files /dev/null and b/Engine2D/projectConfig/compileOrder/56e7b0cb4fc18.png differ
diff --git a/Engine2D/projectConfig/compileOrder/README.md b/Engine2D/projectConfig/compileOrder/README.md
new file mode 100644
index 0000000..9485d50
--- /dev/null
+++ b/Engine2D/projectConfig/compileOrder/README.md
@@ -0,0 +1,68 @@
+在 Egret 中,需使用 TypeScript 编写程序,最终编译成浏览器可读的 JavaScript。
+
+JavaScript 是一种脚本语言,浏览器按脚本的顺序来执行。实际上浏览器会根据 `
+
+