egret入门,这一篇应该够了

简介: egret入门,这一篇应该够了

下载安装:

1、EgretLauncher

传送门:https://egret.com/downloads/engine.html

下载完成按照要求一步步安装就可以了。

引擎管理工具,包括版本管理,项目打包,项目创建,其他工具下载安装等。

2、Egret Wing

打开EgretLauncher引擎管理工具,下载安装egret wing,(这里需要账号密码登录,如果没有就去注册一个吧!

egret wing支持可视化创建、编辑和管理项目 EUI,以及 TS 代码编写和断点调试。

3、更多工具

egret的工具非常多,上述安装的wing是最主要的开发工具,其余的安装方法也差不多,简单用法介绍可以参考官网的介绍,这里不赘述。

传送门:https://www.egret.com/products/

项目创建

1、项目类型

打开EgretLauncher,选中项目,点击创建项目:

创建项目有两个选项,游戏项目和EUI项目,主要是勾选的拓展库不同,建议创建时不管是哪种,都将eui 和game两个库都勾选上。

除了默认勾选的,其他按需求勾选。

舞台尺寸一般按照美术出图设置。

2、缩放模式

有很多种,具体介绍可以看官网介绍,可以说非常详细了

传送门 http://developer.egret.com/cn/github/egret-docs/Engine2D/screenAdaptation/zoomMode/index.html

旋转方式一般就横屏竖屏或者自动模式,最后创建项目。

目录结构

打开创建的项目:

.wing文件夹 存放使用wing打开的配置文件

bin-debug文件夹 存放调试时将ts转为js文件

bin-release文件夹 存放打包输出文件(打包后才会出现)

libs文件夹 存放引擎源码以及三方库文件

resources文件夹 存放资源文件包括图片、json、动画、exml等文件

scripts文件夹 存放一些配置文件,比如android ios wxgame的配置脚本文件

src文件夹 存放开发源码

template文件夹 存放模板文件

egretProperties.json文件 三方库的配置文件

其他的可以不用管了,如果还需要详细了解的:

传送门:http://developer.egret.com/cn/github/egret-docs/Engine2D/getStarted/helloWorld/index.html

项目入口

打开项目进入src文件目录

以下是我修改添加注释后的源码(Main.ts)

class Main extends eui.UILayer {
    protected createChildren(): void {
        super.createChildren();
        egret.lifecycle.addLifecycleListener((context) => {
            // custom lifecycle plugin
        })
        //inject the custom material parser
        //注入自定义的素材解析器
        let assetAdapter = new AssetAdapter();
        egret.registerImplementation("eui.IAssetAdapter", assetAdapter);
        egret.registerImplementation("eui.IThemeAdapter", new ThemeAdapter());
        this.runGame().catch(e => {
            console.log(e);
        })
    }
    private async runGame() {
        await this.loadResource()
        //this.createGameScene();
        const result = await RES.getResAsync("description_json")
        const gameui:GameUi = new GameUi();
        this.stage.addChild(gameui)
    }
    //资源加载函数,
    private async loadResource() {
        try {
            //加载页面添加到舞台
            const loadingView = new LoadingUI();
            this.stage.addChild(loadingView);
            //加载默认资源,json文件,里面记录着所有的图片数据
            await RES.loadConfig("resource/default.res.json", "resource/");
            //加载皮肤文件
            await this.loadTheme();
            //加载资源组
            await RES.loadGroup("preload", 0, loadingView);
            //加载完成后将加载页面从舞台移除
            this.stage.removeChild(loadingView);
            console.log('资源加载完成')
        }
        catch (e) {
            console.error(e);
        }
    }
    private loadTheme() {
        return new Promise((resolve, reject) => {
            //加载皮肤主题配置文件,可以手动修改这个文件。替换默认皮肤。
            let theme = new eui.Theme("resource/default.thm.json", this.stage);
            theme.addEventListener(eui.UIEvent.COMPLETE, () => {
                resolve();
            }, this);
        })
    }
    private textfield: egret.TextField;
    /**
     * 创建游戏场景
     * Create a game scene
     */
    private createGameScene() {
        let sky = this.createBitmapByName("dabg@3x_png");
        this.addChild(sky);
        let stageW = this.stage.stageWidth;
        let stageH = this.stage.stageHeight;
        sky.width = stageW;
        sky.height = stageH;
    }
    /**
     * 根据name关键字创建一个Bitmap对象。name属性请参考resources/resource.json配置文件的内容。
     * Create a Bitmap object according to name keyword.As for the property of name please refer to the configuration file of resources/resource.json.
     */
    private createBitmapByName(name: string) {
        let result = new egret.Bitmap();
        let texture: egret.Texture = RES.getRes(name);
        result.texture = texture;
        return result;
    }
    /**
     * 描述文件加载成功,开始播放动画
     * Description file loading is successful, start to play the animation
     */
    private startAnimation(result: string[]) {
        let parser = new egret.HtmlTextParser();
        let textflowArr = result.map(text => parser.parse(text));
        let textfield = this.textfield;
        let count = -1;
        let change = () => {
            count++;
            if (count >= textflowArr.length) {
                count = 0;
            }
            let textFlow = textflowArr[count];
            // 切换描述内容
            // Switch to described content
            textfield.textFlow = textFlow;
            let tw = egret.Tween.get(textfield);
            tw.to({ "alpha": 1 }, 200);
            tw.wait(2000);
            tw.to({ "alpha": 0 }, 200);
            tw.call(change, this);
        };
        change();
    }
}

资源适配器(AssetAdapter .ts)

class AssetAdapter implements eui.IAssetAdapter {
    /**
     * @language zh_CN
     * 解析素材
     * @param source 待解析的新素材标识符
     * @param compFunc 解析完成回调函数,示例:callBack(content:any,source:string):void;
     * @param thisObject callBack的 this 引用
     */
    public getAsset(source: string, compFunc:Function, thisObject: any): void {
        function onGetRes(data: any): void {
            compFunc.call(thisObject, data, source);
        }
        if (RES.hasRes(source)) {
            let data = RES.getRes(source);
            if (data) {
                onGetRes(data);
            }
            else {
                RES.getResAsync(source, onGetRes, this);
            }
        }
        else {
            RES.getResByUrl(source, onGetRes, this, RES.ResourceItem.TYPE_IMAGE);
        }
    }
}

主题适配器(ThemeAdapter.ts)

class ThemeAdapter implements eui.IThemeAdapter {
    /**
     * 解析主题
     * @param url 待解析的主题url
     * @param onSuccess 解析完成回调函数,示例:compFunc(e:egret.Event):void;
     * @param onError 解析失败回调函数,示例:errorFunc():void;
     * @param thisObject 回调的this引用
     */
    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);
        }
    }
}
declare var generateEUI: { paths: string[], skins: any }

关于js的异步,依然使用了es7的async与await,用法自行脑补

关于三方库引入

打开egretProperties.json

按照已有的格式以相同的写法将你的三方库路径添加上去,然后在终端执行egret build -e命令

以引入socket.io为例:

开发根目录:D:\dev\live-psz

socket.io目录:D:\dev\socket-libsrc

{
      "name": "socket.io",
      "path": "../socket-libsrc/bin/socket.io"
    }

关于exml主题UI布局

在resource目录下新建eui_skins文件夹,在下面新建**.exml文件,然后进行布局,

在default.thm.json确保引入

{
  "skins": {},
  "autoGenerateExmlsList": true,
  "exmls": [
    "resource/eui_skins/Animation.exml",
    "resource/eui_skins/AniShowCName.exml",
    "resource/eui_skins/GameUi.exml",
    "resource/eui_skins/RoleDetailUi.exml",
    "resource/eui_skins/RoleUi.exml",
    "resource/eui_skins/test.exml"
  ],
  "path": "resource/default.thm.json"
}

在src下面新建对应的ts文件

class GameUi extends eui.Component
constructor() {
    super();
    this.skinName = "resource/eui_skins/GameUi.exml";
}

如果在布局里面命名了相对应的Id,那么

public gold_group_btn :eui.Group;
public roleContainer: eui.Group;

如何引用

const gameui:GameUi = new GameUi();
this.stage.addChild(gameui)

最后

其他涉及到的API可以查看官网文档,如有错误,望斧正,如有疑问,请留言,我会及时回复。

目录
相关文章
VScode修改打开默认编码及自动匹配文件编码格式
VScode修改打开默认编码及自动匹配文件编码格式
4515 0
VScode修改打开默认编码及自动匹配文件编码格式
|
Windows
【Windows 逆向】OD 调试器工具 ( 推荐汉化版的 OD 调试工具 | 吾爱破解专用版Ollydbg | 备选工具 )
【Windows 逆向】OD 调试器工具 ( 推荐汉化版的 OD 调试工具 | 吾爱破解专用版Ollydbg | 备选工具 )
10828 0
【Windows 逆向】OD 调试器工具 ( 推荐汉化版的 OD 调试工具 | 吾爱破解专用版Ollydbg | 备选工具 )
|
3月前
|
缓存 开发工具 开发者
鸿蒙开发:了解构建工具hvigorw
hvigorw作为Hvigor的wrapper包装工具,它的主要作用是,支持自动安装Hvigor构建工具和相关插件依赖,以及执行Hvigor构建命令
110 0
鸿蒙开发:了解构建工具hvigorw
|
11月前
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
4767 2
WebAssembly:让前端性能突破极限的秘密武器
|
11月前
|
IDE 开发工具
IDEA如何快速定位到当前打开文件所在的目录
【10月更文挑战第7天】在 IntelliJ IDEA 中,要快速定位当前文件的目录,可通过侧边栏或快捷键实现。在侧边栏的项目结构中,文件以层级结构显示,便于浏览;使用 `Alt + F1` 快捷键,选择 “Select in”-> “Project View”,即可迅速定位文件所在目录,方便管理和导航。
4246 3
|
Web App开发 编解码 网络协议
WebRTC SDP 详解和剖析
WebRTC 技术体系中,SDP 是看起来简单却坑非常多的点,就像直播中的时间戳几乎占据了 80% 的问题,SDP 也是问题频发的点。这篇文章详细分享了 SDP 的关键点,容易出问题的点,是非常实用的满满的干货。
WebRTC SDP 详解和剖析
成功解决:Failed to load resource: net::ERR_FILE_NOT_FOUND
这篇文章提供了解决"Failed to load resource: net::ERR_FILE_NOT_FOUND"错误的步骤,通过修改配置文件中的资源路径设置为相对路径"./"来成功运行打包后的项目。
成功解决:Failed to load resource: net::ERR_FILE_NOT_FOUND
|
弹性计算 监控 数据可视化
快速部署 Grafana 社区版
Grafana是一个开源数据可视化和监控平台,为实时监控、数据分析和可视化提供强大的仪表板和图表功能。本文介绍用计算巢快速部署Grafana社区版。
快速部署 Grafana 社区版
|
12月前
|
JavaScript 前端开发 开发者
Layui layer 弹出层的使用【笔记】
本文介绍了Layui的layer弹出层组件的使用方法,包括如何通过在线CDN引入Layui的CSS和JS文件,以及如何使用layer.open(options)开启弹出层和layer.close(index)关闭弹出层。文章详细说明了弹出层类型的分类、options选项的参数配置,以及回调函数的使用。通过示例代码,展示了如何创建不同类型的弹出层,包括对话信息框、页面层、内联框架层、加载层和tips层。
|
存储 安全 算法
Linux命令sha1sum的详细解析
`sha1sum`是Linux下的命令行工具,用于计算文件的SHA-1哈希值,用于验证文件完整性和安全性。SHA-1算法将数据转化为160位的哈希值,具有唯一性、固定长度和单向性。命令支持二进制或文本模式,可检查校验文件、保存哈希值、验证文件完整性。尽管由于安全问题不推荐用于高安全场景,但在一些场景下仍用于文件校验。最佳实践包括定期验证、保存校验文件和与其他命令结合使用。