cocos Creator + fairyGUI 快速入门
版本 Creator 3.8.x,FairyGUI 2022
大部分内容来自 https://en.fairygui.com/docs/sdk/creator
1.新建cocos项目,根目录运行 npm install --save fairygui-cc 引入 fairyGUI库
2.assets目录之外新建fairyGUI项目
3.fairyGUI中编辑UI 完成后发布到Creator的assets/resources目录或者其子目录下。注意,图片设置为RAW格式即可,不需要设置为Sprite。因为FairyGUI会自己分析Sprite。
4.加载。一种是你负责把文件加载,第二种是让FairyGUI自己去加载。第一种方式是方便你做一个混杂了其它资源的总体的加载,或者显示进度的需求等:
//这里填写的是相对于resources里的路径let res = [ "UI/Bag", //描述文件"UI/Bag_atlas0" //纹理集];cc.loader.loadResArray(res, function(err, assets) {//都加载完毕后再调用addPackagefgui.UIPackage.addPackage("UI/Bag"); //下面就可以开始创建包里的界面了。});//这里填写的是相对于resources里的路径fgui.UIPackage.loadPackage("UI/Bag", function(err) {//这里不需要再调用addPackage了,直接可以开始创建界面了});
5.卸载。当一个包不再使用时,可以将其卸载。
//这里可以使用包的id,包的名称,包的路径,均可以
fgui.UIPackage.removePackage("Bag");
包卸载后,所有包里包含的贴图等资源均会被卸载,由包里创建出来的组件也无法显示正常(虽然不会报错),所以这些组件应该(或已经)被销毁。
一般不建议包进行频繁装载卸载,因为每次装载卸载必然是要消耗CPU时间(意味着耗电)和产生大量GC的。UI系统占用的内存是可以精确估算的,你可以按照包的使用频率设定哪些包是常驻内存的(建议尽量多)。
5.创建ui
每个场景 都需要有一个GRoot,这是UI的根节点。场景载入后,需要手动创建GRoot。
调用 fgui.GRoot.create();public static create(): GRoot {GRoot._inst = new GRoot();director.getScene().getChildByName('Canvas').addChild(GRoot._inst.node);GRoot._inst.onWinResize();return GRoot._inst;
}
创建FGUI对象。
let view:fgui.GComponent = fgui.UIPackage.createObject(“包名”, “组件名”).asCom;//以下几种方式都可以将view显示出来://1,直接加到GRoot显示出来fgui.GRoot.inst.addChild(view);//2,使用窗口方式显示aWindow.contentPane = view;aWindow.show();//3,加到其他组件里aComponnent.addChild(view);
如果界面内容过多,创建时可能引起卡顿,FairyGUI提供了异步创建UI的方式,异步创建方式下,每帧消耗的CPU资源将受到控制,但创建时间也会比同步创建稍久一点。例如:
let handler = new AsyncOperation();
handler.createObject("包名","组件名", myCreateObjectCallback);void myCreateObjectCallback(obj:fgui.Gobject)
{
}
关闭界面一般用隐藏即可,即:
//如果是加在GRoot或者其他父节点的
view.removeFromParent();//如果是窗口
view.hide();
如果界面不再使用了,可以销毁它:
view.Dispose();
场景切换时,所有界面都会被销毁。如果不想被销毁,需要创建出界面后,把根节点设置为常驻,并且切换场景前,确保关闭界面。
cc.game.addPersistNode(view.node);
6.事件系统
FairyGUI直接使用了Creator的事件系统,所以GObject.on/off其实是通过GObject.node.on/off实现的,也就是可以通过GObject.node进行任何事件的操作,包括自定义的事件。在事件回调中,cc.Event中的currentTarget反映的是这个事件是由哪个node派发的,如果要获得这个node对应哪个GObject,可以用这样的方法:
aObject.on(someEventName, this.onHandle, this);onHandle(evt:cc.Event) {cc.log(evt.currentTarget); //node对象cc.log(fgui.GObject.cast(evt.currentTarget)); //gobject对象
}
7.鼠标/触摸类事件
对于鼠标事件和触摸事件,FairyGUI里都使用自定义的事件,常量定义在fgui.Event里,这和Creator自身的cc.Node.EventType.TOUCH_BEGIN是不一样的,要注意区别。因为Creator自己的触摸逻辑很难处理穿透/不穿透,以及自定义区域点击这些情况。
鼠标/触摸事件回调函数有一个参数:evt:fgui.Event,fgui.Event继承于cc.Event。
TOUCH_BEGIN
鼠标按键按下(左、中、右键),或者手指按下。鼠标按钮可以从evt.button获得,0-左键,1-中键,2-右键。如果是触摸事件,可以从evt.touchId获得手指ID;如果是鼠标事件,evt.touchId恒定为0。TOUCH_MOVE
鼠标指针移动或者手指在屏幕上移动。这个事件只有两种情况会触发,1、在TOUCH_BEGIN里调用了evt.captureTouch(),那么后续的移动事件都会在这个对象上触发(无论手指或指针位置是不是在该对象上方)。2、GRoot上的TOUCH_MOVE始终会触发,不需要使用captureTouch捕获。TOUCH_END
鼠标按键释放或者手指从屏幕上离开。如果鼠标或者触摸位置已经不在GObject范围内了,那么组件的TouchEnd事件是不会触发的,如果确实需要,可以在TOUCH_BEGIN里调用evt.captureTouch()请求捕获。CLICK
点击事件。可以从evt.isDoubleClick判断是单击还是双击。侦听点击事件有个快捷方式:GObject.onClick(callback,…),比GObject.on(fgui.Event.CLICK,…)简洁点。ROLL_OVER 鼠标指针或者手指移入显示对象区域时触发。
ROLL_OUT 鼠标指针或者手指移出显示对象区域时触发。
MOUSE_WHEEL 鼠标滚动事件。
如果不在事件回调流程中,需要获得当前鼠标或者手指的位置,可以用:
//touchId是手指id,如果你不关心这个,不传入即可
let pos1:cc.Vec2 = fgui.GRoot.inst.getTouchPosition(touchId);
在任何时候,如果需要获得当前点击的对象,或者鼠标下的对象,都可以通过以下的方式获得:
let obj:fgui.GObject = fgui.GRoot.inst.touchTarget;//判断是不是在某个Fgui组件内
cc.Log(testComponent.isAncestorOf(obj));
8.字体
如果要使用ttf字体,需要这些步骤:
1、首先需要得到cc.Font对象,这个对象你是从loadRes获得,还是直接在场景中通过脚本的变量获得,可按照项目需求。
2、使用fgui.UIConfig.registerFont给这个cc.Font注册一个FairyGUI里使用的字体名称,假定aFont就是cc.Font对象:
fgui.UIConfig.registerFont('myfont', aFont);
3、如果这个是全局字体:
fgui.UIConfig.defaultFont = 'myFont';
4、如果这个是某个文字单独指定的字体,例如:
这里用到了"黑体"这个名字的字体,这是与UIConfig.defaultFont不同的字体,那么我们需要注册这种字体。即:
fgui.UIConfig.registerFont('黑体', aFont);
cocos 组件的声明周期接口:

注意事项:
1.fgui坐标系是以左上角为原点的。cocos则是左下角
相关文章:
cocos Creator + fairyGUI 快速入门
版本 Creator 3.8.x,FairyGUI 2022 大部分内容来自 https://en.fairygui.com/docs/sdk/creator 1.新建cocos项目,根目录运行 npm install --save fairygui-cc 引入 fairyGUI库 2.assets目录之外新建fairyGUI项目 3.fairyGUI中编辑UI 完成后发布到Creato…...
UICollectionView 的UICollectionReusableView复用 IOS18报错问题记录
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 方法复用报错 报错详情: Terminating app due to uncaught exception NSInternal…...
Ansible Roles与优化
Ansible Roles与优化 Ansible作为一款自动化运维工具,凭借其简洁的语法、强大的功能以及良好的扩展性,在IT运维领域得到了广泛应用。Ansible Roles作为Ansible的核心特性之一,为自动化部署和管理提供了极大的便利。本文将深入探讨Ansible Ro…...
Ubuntu 22.04上安装Miniconda
在Ubuntu 22.04上安装Miniconda,可以按照以下步骤进行: 步骤1:更新系统 首先,更新您的系统软件包: sudo apt update sudo apt upgrade -y步骤2:下载Miniconda安装脚本 访问Miniconda的官方网站或使用以下…...
【MySQL】入门篇—SQL基础:数据定义语言(DDL)
数据定义语言(DDL,Data Definition Language)是SQL(结构化查询语言)的一部分,主要用于定义和管理数据库的结构。 DDL允许用户创建、修改和删除数据库及其对象(如表、索引、视图等)。…...
电影评论网站开发:Spring Boot技术详解
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了电影评论网站的开发全过程。通过分析电影评论网站管理的不足,创建了一个计算机管理电影评论网站的方案。文章介绍了电影评论网站的系统分析部分&…...
20240817 全志 笔试
文章目录 1、选择题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.202、填空题2.12.23、问答题3.14、编程题4.14.2岗位:NO2510 嵌入式软件设计工程师(珠海/广州/西安/深圳) 题型:20 道选择题,2 道填空题,1 道问答题,2 道编程题 1、选择题 1.…...
laravel 查询数据库
数据库准备 插入 三行 不同的数据 自行搭建 laravel 工程 参考 工程创建点击此处 laravel 配置 数据库信息 DB_CONNECTIONmysql #连接什么数据库 DB_HOST127.0.0.1 # 连接 哪个电脑的 ip (决定 电脑 本机) DB_PORT3306 # 端口 DB_DATABASEyanyu…...
【Codeforces】CF 2009 F
Firefly’s Queries #前缀和 #数据结构 #数学 题目描述 Firefly is given an array a a a of length n n n. Let c i c_i ci denote the i i i’th cyclic shift ∗ ^{\text{∗}} ∗ of a a a. She creates a new array b b b such that b c 1 c 2 ⋯ c n b c…...
GTP4聊天记录中letax保存为word
别的不说,GPT4用来看代码很是很爽的,可以让他直接恢复出函数中的数学公式,有的时候为了做笔记,GPT4回复的答案,复制出来使markdown、letax等格式,为了更好的记笔记,可以使用下面的工具将复制…...
vscode调试编译找不到gcc,只有cl,但是检查cmd是对的,控制面板的路径也更改了
🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…...
空间解析几何5-空间圆到平面的距离【附MATLAB代码】
目录 理论公式 matlab代码 理论公式 matlab代码 function [dis,P,Q,L]Circle2PlaneDistance(T,R,n,Pn) % output % dis 为最短距离,P为距离最短时圆上的点 Q为P对应的投影点 L为最小值有几个 % input % T为园心到基坐标系的变换矩阵 R为圆半径 n为平面的单位法向…...
[已解决] pycharm添加本地conda虚拟环境 + 配置解释器 - pycharm找不到conda可执行文件
目录 问题: 方法: 补充:创建conda虚拟环境 参考文档:pycharm找不到conda可执行文件怎么办?-CSDN 问题: 1.显示:未为项目配置 Python 解释器 2.想在pycharm中使用本地创建的虚拟环境 方法&a…...
SENT - Single Edge Nibble Transmission for Automotive
SENT 总线的特征和优势 SENT 总线是一种数字信号传输协议,具有更高的传输精度和速度;SENT 总线是单线传输数据,减少信号线,降低成本。加上电源和地线,总共 3 线;SENT 总线具有更强大的诊断功能;…...
2024年软件设计师中级(软考中级)详细笔记【7】面向对象技术(下)23种设计模式(分值10+)
目录 前言阅读前必看 第七章 面向对象技术(下)7.3 设计模式(固定4分)7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.2.1 Abstract Factory(抽象工厂)7.3.2.2 Builder(生成器)7.3.2.3…...
未来人工智能的发展对就业市场的影响 人工智能在生活中的相关
人工智能(Artificial Intelligence),英文缩写为AI.是新一轮科技革命和产业变革的重要驱动力量, 是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学. 人工智能的发展对就业市场的影响主要…...
Oracle EBS 中财务模块
Oracle E-Business Suite (EBS) 提供了全面的财务管理解决方案,涵盖了企业财务活动的各个方面。以下是EBS中主要的财务模块及其功能概述: 总账(General Ledger, GL):Oracle EBS 中 GL 模块的财务流程概览-CSDN博客 总账…...
基于SSM公廉租房维保系统的设计
管理员账户功能包括:系统首页,个人中心,业主管理,维修单位管理,房屋信息管理,维修申报管理,维修完成,房屋维护管理 业主账号功能包括:系统首页,个人中心&…...
【AI大模型】深入Transformer架构:解码器部分的实现与解析
目录 🍔 解码器介绍 🍔 解码器层 2.1 解码器层的作用 2.2 解码器层的代码实现 2.3 解码器层总结 🍔 解码器 3.1 解码器的作用 3.2 解码器的代码分析 3.3 解码器总结 学习目标 🍀 了解解码器中各个组成部分的作用. &#…...
前端html js css 基础巩固3
一个这样的首页 滑动显示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&l…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
