写在前面
Egret, 白鹭, H5 引擎, 二维, 使用 TS 开发, BSD 开源.
功能:
- Egret 继承了 Flash 的优点,同时更加针对游戏开发,主要包括如下功能:
- 显示列表:清晰、稳健、高效的视觉抽象结构
- 精灵:一种轻量级显示容器
- 事件机制:提供了一套生成和处理事件消息的标准方法
- 纹理集合:将大量图片汇集为一张纹理图进行处理
- 矢量绘图:封装了方便简单的矢量绘图功能
- 网络加载:封装了常用的网络通讯协议
- 位图字体:可通过位图字体方式显示文本
- 性能监控:可在游戏中快速开启性能监控面板
- 反射:对 TypeScript 增加了反射机制,方便模块化开发
- XML 处理:提供标准的 XML 格式解析生成功能
- 骨骼动画:支持业内最优骨骼动画解决方案 DragonBones
- 资源加载:提供了整套资源加载方案,优化网络加载功能
- GUI:提供大量组件,可快速开发游戏中的 UI 控件
安装部署:
下载地址: http://www.egret.com/downloads
安装后内部 Tools 丰富, 含有附加 Resource, 可以直接检测版本更新
命令行使用 egret –help 检测是否安装成功
注意: 需要先更新引擎, 再在项目执行
egret update {project_name}
egret build {project_name} -e
完成项目中引擎的更新
命令行简介
按需:
egret info
egret upgrade {your_project}
egret create_manifest [project_name] -all
每天常用:
egret create [project_name] [--type core|gui] [--runtime html5|native]
egret build [project_name] [-e] [--runtime html5|native] [-quick/-q]
egret startserver [project_name] [--port 3000] [-ip] [-serveronly]
项目完成:
egret publish [project_name] -compile [--runtime html5|native] [--version v0.0.1]
egret create_app [app_name] -f [h5_game_path] -t [template_path]
项目结构
HelloWorld // 游戏项目
|-- src // 游戏代码目录,源代码均存放在此目录中,其文件后缀名为`.ts`。
|-- resources // 游戏资源目录,存放着游戏使用的资源,包括图片文件,音频文件以及资源配置文件等。
|-- launcher // 游戏入口,所有的可运行查看游戏效果的网页文件均存放在这个文件夹中。
|-- index.html //启动文件
|-- libs //egret引擎库文件
|-- bin-debug // 编译后的代码目录,存放当前debug模式的代码,这个文件夹中绝大部分代码为`.js`文件。
|-- egretProperties.json //Egret项目编译参数
配置文件 egretProperties.json
document_class 标识代码的入口类名。
modules 项目所使用的第三方库。
name 名称
path 第三方模块需要提供路径
release: "../release" 版本位置
native: native模式需要的参数
path_ignore: [], 忽略列表, 支持*号
android_path: "../AndroidProj"
ios_path: "../IOSProj"
egret_version: 当前引擎版本, 自动生成
扩展知识
默认文档类, src/Main.ts, 在配置文件中指定的 document_class
class Main extends egret.DisplayObjectContainer{
public constructor() {
super();
this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
}
private onAddToStage(evt:egret.Event) {
egret.Profiler.getInstance().run();
console.log("Print Hello World On Console");
RES.addEventListener(RES.ResourceEvent.CONFIG_COMPLETE, this.onConfigComplete, this);
RES.loadConfig("resource/resource.json", "resource/");
}
private onConfigComplete(evt:egret.Evnet) {
RES.removeEventListener(RES.ResourceEvent.CONFIG_COMPLETE, this.onConfigComplete, this);
RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onResourceLoadComplete, this);
RES.addEventListener(RES.ResourceEvent.GROUPLOADERROR, this.onResourceLoadError, this);
RES.addEventListener(RES.ResourceEvent.GROUP_PROGRESS, this.onResourceProgress, this);
RES.loadGroup("heroes");
}
private onResourceLoadComplete(evt:egret.Event) {
var bg:egret.Bitmap = new egret.Bitmap(RES.getRes("bgImage"));
this.addChild(bg);
}
}
- draw:这里参数描述了当前画面渲染时候 drawcall 的次数
- cost:包含四个参数,这四个参数分别为,EnterFrame 阶段的开销,引擎 updateTransform 开销,引擎 draw 开销和 HTML5 中 canvas.draw 的开销。
- FPS:当前画面的帧频。
快速上手
舞台 this.stage
图形(圆,矩形等)绘制
var shape:egret.Shape = new Shape();
shape.beginFill(0xff0000);
shape.drawRect(0,0,this.stage.stageWidth,this.stage.stageHeight);
shape.drawCircle(30,this.stage.stageWidth/2,this.stage.stageHeight/2);
shape.endFill();
this.addChild(shape); // super.addChild(shape);
适配模式: egret_loader.js 中 NO_SCALE, SHOW_ALL(占满屏幕)
var scaleMode = egret.StageScaleMode.SHOW_ALL;
文本框:
var tx:egret.TextField = new egret.TextField;
tx.text = "I'm Jack, I will use Egret create a fantasy mobile game!";
tx.size = 32;
tx.x = 20;
tx.y = 20;
tx.width = this.stage.stageWidth - 40;
super.addChild( tx );
响应事件:
tx.touchEnabled = true;
tx.addEventListener( egret.TouchEvent.TOUCH_TAP, function( evt:egret.TouchEvent ):void{
tx.textColor = 0x00ff00;
}, this );
// touchHandler 为自定义方法
tx.addEventListener( egret.TouchEvent.TOUCH_TAP, this.touchHandler, this );
private touchHandler(evt:egret.Event) {
var tx = evt.currentTarget;
tx.textColor = 0x00ff00;
}
资源加载
name: 资源唯一标识
type: image text json
url: 通常我们约定配置类型的资源(json,xml..)置于 config 子目录下;其他类型置(img,mp3…)于 assets 子目录下
name: 群组唯一标识
keys: resources 里面的 name,使用逗号间隔
{"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"}
]}
资源使用需要在事件 egret.Event.ADDED_TO_STAGE 触发之后, 以保证资源以及读取到内存之中.
加载配置文件: RES.loadConfig(“resource/resource.json”, “resource/“);
加载资源组: RES.loadGroup(“preload”);
读取资源: RES.getRes(“bgImage”);
深度控制: 先添加的在后面显示
深度是连续唯一的链表?数组?方式存储的, 会根据已有空格子自动进行排序
获取深度 super.getChildIndex( bg )
修改深度 super.setChildIndex( batman, 3 );
Tween 动画效果
锚点 (默认左上角)
像素设置: anchorOffsetX 和 anchorOffsetY
百分比设置: anchorX 和 anchorY
宽高 (像素值) x 和 y
移动位置
egret.Tween.get( batman )
.to( { x:superman.x }, 300, egret.Ease.circIn )
.to( { y:superman.y }, 300, egret.Ease.circIn );
设置透明度
egret.Tween.get( captain )
.to( { alpha:.3 }, 300, egret.Ease.circIn )
.to( { alpha:1 }, 300, egret.Ease.circIn );
声音
var sound:egret.Sound = RES.getRes( "bonus.mp3" );
sound.play();
sound.pause();
sound.stop();
网络
HTTP
var urlloader = new egret.URLLoader();
var urlreq:egret.URLRequest = new egret.URLRequest();
urlloader.addEventListener(egret.Event.COMPLETE, function (event:egret.Event):void {
console.log(urlloader.data, event.target.data);
}, this);
urlreq.url = "http://192.168.1.136:3001/getTime";
urlreq.method = egret.URLRequestMethod.GET;
urlloader.load(urlreq);
Note: Http 网络测试需要打包成 Android, 否则提示跨域请求~
WebSocket
egretProperties.json 的 modules 中增加 {“name”: “socket”}, 编译 egret build -e
创建对象:
private webSocket:egret.WebSocket;
private createGameScene():void {
this.webSocket = new egret.WebSocket();
this.webSocket.addEventListener(egret.ProgressEvent.SOCKET_DATA, this.onReceiveMessage, this);
this.webSocket.addEventListener(egret.Event.CONNECT, this.onSocketOpen, this);
this.webSocket.connect("echo.websocket.org", 80);
}
private onSocketOpen(evt:egret.Event):void {
var cmd = "Hello Egret WebSocket";
console.log("The connection is successful, send data: " + cmd);
this.webSocket.writeUTF(cmd);
}
private onReceiveMessage(evt:egret.Event):void {
var msg = this.webSocket.readUTF();
console.log("Receive data:" + msg);
}
Note: 使用 NodeJS 的 WebSocket 时 var connection=request.accept(“”, request.origin);, 第一参数要为””.