Cocos2d-x 3.9教程:10.使用CocosStudio的UI编辑器从UI文件中加载布局和控件

2023-11-18

Cocos2d-x 3.9教程

10. 使用CocosStudioUI编辑器从UI文件中加载布局和控件

1.1. 使用CocosStudio的UI编辑器

1.1.1. 安装和启动

从官网上下载2015年11月18日版本,Cocos studio 2.3.3。

 

安装完毕后,桌面出现两个图标。

Cocos Studio是我们的UI、动画等编辑器。Cocos是项目管理器,且它集成了网络共享资源、素材、开源代码(或付费代码)的store。

启动Cocos,新建一个cocos项目,然后会自动启动Cocos Studio:

 

 

界面的构成和相关基础知识,详见官方在线文档说明:

http://www.cocos.com/doc/article/index?type=Cocos%20Studio&url=/doc/cocos-docs-master//manual/studio/v4/chapter3/Editor/UIOverview/zh.md

1.1.2. 编辑界面

然后我们从左边的“控件”窗口中,拖拽过来一个“图片”ImageView和一个“按钮”Button:

 

然后在加入的ImageView控件上面点击右键,点击“设置图片资源”,按钮控件有3种状态,对应这3种状态也设定3张图片,效果如下:

 

1.1.3. 调整控件的位置、大小布局

首先调整ImageView,点击图片控件,右侧的属性窗口会将其所有配置属性显示出来:

 

名称一项是可以编辑的,其中的名字可以在cocos2d-x中,用Node的getChildByName()方法获取该对象,进行进一步操作。

下面一项一项进行说明:

1.位置与尺寸

位置与尺寸,主要是形容控件相对于其父容器的位置和尺寸。常用于组件在不同规格设备上的布局。

 

在其中可以方便的修改锚点、坐标和尺寸。

需要注意的是,通过UI编辑器,可以设定某个控件的“相对尺寸”和“相对位置”,这个是代码方式所不具备的(代码需要自行根据屏幕尺寸和位置等计算出控件的大小、位置)。

1)更改位置:

 

坐标改为百分比,意味着其坐标相对父容器的位置:

如上图我们改成了x:50%、y:50%,则意味着无论父容器怎么变化,该控件都会位于中心:

 

2)更改尺寸

跟位置类似,我们可以把当前组件的宽、高像素数修改为百分比,修改后理论上组件的大小会保持与其父容器的宽高比不变。但目前实际效果不佳,比如设定为宽100%、高100%,并未实现全部覆盖。效果如下:

设定:

结果:

经过研究发现,在“常规”选项中,缩放属性需设定为宽、高100%,此时再设定“位置”和“尺寸”即可实现全屏覆盖。

 

    

注意,一定不要通过鼠标的拖拽来实现控件的缩放!鼠标拖拽只会改变控件的scale,而不是contentSize!

3)固定和拉伸

首先,还是要确保“常规”中的宽、高缩放都是100%。

固定和拉伸是用图形化的方式,来确定组件对其父容器左右上下边界的相对大小和位置的。

 

打开左边或右边仅一个图钉时,会按照输入的像素距离来进行左右对齐,比如打开左边图钉,并输入50。意味着无论界面怎么变化,当前组件的左边总是离其父容器左边50像素。效果如下:

 

即便修改了组件的尺寸和父容器的尺寸,左边距离依然是50像素。效果如下:

    

方框中的十字箭头,表示是否保持控件的宽、高和其父容器的宽、高比例来拉伸控件。如打开左右拉伸箭头,则无论窗口怎么变化,控件的左右宽度会保持比例不变。

固定左右拉伸:

结果:

4)“位置、尺寸”和“固定、拉伸”选项的冲突。

在设定了“位置、尺寸”的数值时,已经确定了控件的属性,但此时修改“固定与拉伸”必然会有冲突。所以一定要注意,两种控制手段的冲突和配合。

比如比如我们设定了控件的坐标x值为50%(位于中心),但打开了左侧的图钉,固定其左侧与父容器左侧的距离时。坐标的x值就会被变为像素数。

 

再比如我们设定了控件的“尺寸”的X值为75%,但我们打开了左右的固定尺寸箭头来固定控件的宽度和父容器的比例。此时,“尺寸”中的X值会变为像素数!

 

重要总结:

“位置与尺寸”中的“尺寸”指的是Node的contentSize,而“常规”选项中的“缩放”指的是Node的scaleX、scaleY。根据Node的设计,scale的值无论怎么变化,其contentSize的值是不会变的!但是造成的界面效果会产生“大小不对”、“位置不对”,因此一定要注意,一般情况下我们应当保持“缩放”中的X、Y比例为100%!

2.常规

常规选项主要是针对组件自身的一些“表象”属性,比如缩放、旋转、透明度、可见性、交互性等。

 

可见性:即Node的setVisible()方法,设置可见与否。

交互性:即Node的setTouchEnabled()方法,设置是否能够响应触摸事件。

逻辑标签:即Node的tag属性,用于标示一个节点。

缩放:即Node的scaleX和scaleY属性。

旋转:即Node的_rotation属性。

不透明度:即Node的setOpacity()。设置透明性。

颜色:即Node的setColor()。

翻转:把节点进行左右翻转或上下翻转。实际上是通过Widget的setFlippedX和setFlippedY来修改X、Y轴上的翻转。本质上是给Node的scaleX和scaleY各乘了个-1。

3.九宫格

跟前面章节中所说的九宫格一致。即把当前Node的可见部分,进行九宫格处理。

 

比如我们给一个按钮开启了九宫格,那么按钮在尺寸变化后,其四个角的内容能够进行保留:

原始样式:

上下尺寸变大:

4.特性

针对不同的组件,特性页面里的属性不同。

如ImageView的特性页面只有图片资源一项:

 

而Button的特性页面如下:

 

5.高级属性

高级属性主要是在编辑器中设定组件的信息,在cocos2d-x中能够通过代码获得其各种信息(回调、帧事件数据和用户数据)。

 

1)回调方法:

回调方法下拉框中,有3个选项。

 

无表示未设定回调方法名称。

Touch表示设定了Touch事件的回调方法,比如我们自己给回调方法起个名字myOnTouch:

那么,按照官方教程,我们可以在cocos2d-x项目中,新建一个类,该类必须遵循如下要求:

a.继承WidgetCallBackHandlerProtocol和Node(或其他继承自Node的类)

b.重写如下接口:

onLocateTouchCallback

onLocateClickCallback

onLocateEventCallback

详细过程参见官方教程:

http://www.cocos.com/doc/article/index?type=cocostudio&url=/doc/cocos-docs-master//manual/studio/v4/chapter3/Directory/../HowToCode/Directory/../CallBack/zh.md

比如我们上述过程中绑定了Touch事件,并给其回调命名为myOnTouch,那么我们在代码中的关键响应代码为:

Widget::ccWidgetTouchCallback MyClass::onLocateTouchCallback(const string &callBackName)

{

if (callBackName == "myOnTouch")//判断事件名,返回对应的函数。下同

{

return CC_CALLBACK_2(MyClass::myOnTouch, this);

}

return nullptr;

}

void MyClass::myOnTouch(cocos2d::Ref* object, cocos2d::ui::Widget::TouchEventType type)

{

CCLOG("onTouch");

}

Click事件也类似。

2)帧事件:

帧事件为对每个UI编辑器中的组件,可以添加动画,对动画的每一帧(一般我们设定几个关键帧),可以绑定一个数值,然后在代码中响应动画时,在动画播放到关键帧时,可以回调我们的方法并获取在UI编辑器中对该帧绑定的数值。具体过程后续章节再予讨论。帧事件官方手册地址:

http://www.cocos.com/doc/article/index?type=cocostudio&url=/doc/cocos-docs-master//manual/studio/v4/chapter3/Directory/../Editor/UIOverview/../../Animation/AddFrameEvents/zh.md

3)用户数据:

在UI编辑器中给当前组件绑定一个自定义的数据信息。然后在cocos2d-x中,可以通过方法来获取该对象的附加信息。

首先,在UI编辑器中添加用户信息:

 

然后根据官方手册,cocos2d-x3.8之前和3.8之后的版本,各有一种类似的方法来获取用户数据:

Cocos2d-x3.8(不含)之前版本:

#include "cocostudio/CocoStudio.h"

#include "cocostudio/CCObjectExtensionData.h"

//找到UI编辑器中的父容器

Node * fileScene = CSLoader::createNode("res/MainScene.csb");

 

//通过tag找到imageView控件

Node * imageView = fileScene->getChildByTag(11);

 

//获取该组件的ObjectExtensionData

cocostudio::ObjectExtensionData * extnData = (cocostudio::ObjectExtensionData*)(imageView->getUserObject());

 

//通过ObjectExtensionData获取用户数据

auto userData = extnData->getCustomProperty();

 

CCLOG(userData.c_str());

Cocos2d-x3.8及其以后的版本:

//包含头文件

#include "Cocos Studio/CCComExtensionData.h"

.....

//根据控件的Tag获取button控件

auto button = _rootNode->getChildByTag("XXX");

//在代码里面先获取到button,getComponent(),并把获取的对象强转为Cocos Studio::ComExtensionData* 指针,再调用getCustomProperty()

ComExtensionData* data = dynamic_cast<ComExtensionData*>(child->getComponent("ComExtensionData"));

auto userdata = data->getCustomProperty();

CCLOG("%s", userdata.c_str());

调试模式控制台输出结果:

 

1.2. 导出UI文件

本章节内容实在cocos studio2.3.3版下,进行操作的。

首先,编辑完UI界面之后,点击菜单栏的“项目”-》“发布与打包”:

 

选择“设置”,设定发布的UI数据格式和路径:

 

我们根据提示,在cocos2d-x中使用csb文件格式发布,效率高。路径选择到我们在cocos2d-x中建立的项目“abc”的“Resources”文件夹,默认的会在其中再建立一个“res”文件夹,在其中发布UI编辑器生成的资源。

 

文件的组成:我们在UI编辑器中,拖入了一个ImageView和一个Button控件:ImageView绑定的是HelloWorld.png,Button控件绑定的是Button.png。我们在cocos studio中默认的主容器,名叫MainScene.csd,打包生成后变为csb文件。

1.3. 在代码中加载UI文件并获取子对象

在上述打包成功之后,我们在cocos2d-x项目中,很容易用代码加载并使用:

#include "cocostudio/CocoStudio.h"

//找到UI编辑器中的父容器

Node * fileScene = CSLoader::createNode("res/MainScene.csb");

 

//通过tag找到imageView控件

Node * imageView = fileScene->getChildByTag(11);

//通过UI编辑器中的“名称”找到组件

//Button * button = (Button*)fileScene->getChildByName("Button_1");

通过UI编辑器“常规”选项中的“逻辑标签”(也就是Node的tag)找到组件

Button * button = (Button*)fileScene->getChildByTag(4);

button->setPressedActionEnabled(true);

button->addClickEventListener(CC_CALLBACK_1(HelloWorld::onButtonClicked, this));

this->addChild(fileScene);

void HelloWorld::onButtonClicked(Ref* pSender)

{

CCLOG("button clicked!");

}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cocos2d-x 3.9教程:10.使用CocosStudio的UI编辑器从UI文件中加载布局和控件 的相关文章

  • LVGL学习(3):页面切换原理和页面管理实现

    在LVGL中 大多情况下是有多个页面的 一般来说页面的切换有两种情况 删除当前的页面 创建新页面加载 保留当前的页面 创建新页面加载 我们来分析一下这两种情况 比如页面1有一个列表框 有三个选项 每个选项对应进入一个页面 假设此时我们的焦点
  • 序列化 CDT 项目设置时遇到了

    当我构建项目时 我收到此错误 Serializing CDT Project settings has encountered a problem Null Pointer Exception 我正在使用最新的 eclipse 并尝试为 A
  • 【干货】如何实现WinApp的UI自动化测试?

    WinApp WindowsAPP 是运行在Windows操作系统上的应用程序 通常会提供一个可视的界面 用于和用户交互 例如运行在Windows系统上的Microsoft Office PyCharm Visual Studio Code
  • 探索创意无限的Photoshop CC 2020Mac/Win版

    作为一款功能强大的图像处理软件 Photoshop CC 2020 简称PS 2020 在全球范围内备受设计师 摄影师和艺术家的喜爱和推崇 它不仅为用户提供了丰富多样的工具和功能 还不断推出新的创意特效和改进的功能 让用户的创意无限延展 首
  • vscode调试mit6s081Lab

    环境 mit6 s081的实验环境 gdb multiarch 用于gdb调试 vscode调试实质上就是提供个图形化页面 底层还是这个 安装 gdb multiarch sudo apt get install gdb multiarch
  • 基于Selenium和python的UI自动化测试方案

    一 概述 对于比较复杂的系统 每次有小的迭代测试同学不可能会把所有的流程验证一遍 如果开发无意改动影响了某些流程而测试又没测试到 就可能会出现生产问题 因此很有必要通过自动化的测试去确保系统的稳定性 自动化测试可以选择接口自动化测试和UI自
  • UI自动化测试方案

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 3k次 点赞60次 收藏8次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自动
  • vue element-ui el-tooltip组件失效问题

    引用自 https blog csdn net ygrhlh article details 121660806 vue element ui el tooltip组件失效问题 因为公司项目年代久远以及谷歌chrome 80 后的sames
  • app测试必掌握的核心测试:UI、功能测试!

    一 UI测试 UI即User Interface 用户界面 的简称 UI 设计则是指对软件的人机交互 操作逻辑 界面美观的整体设计 好的UI设计不仅是让软件变得有个性有品味 还要让软件的操作变得舒适 简单 自由 充分体现软件的定位和特点 手
  • 导入cocos2d项目后,eclipse引发两个奇怪的错误:“Android Library Update”,“C/C++ Indexer”

    将cocos2d项目导入到eclipse后 会引发两个奇怪的错误 Android 库更新 C C 索引器 Error An internal error occured during C C java lang NullPointerExc
  • Android 游戏的 Cocos2d-x 与 cocos2d-android

    在我的一个项目中使用 cocos2d iphone 后 我试图决定应该在 Android 游戏中使用哪种风格的 Cocos2d 我个人的优点和缺点清单 Cocos2d x pros 稍后将游戏带到 iOS 上应该会更容易 其他平台也可能如此
  • vscode插件离线安装地址

    因内网开发 编辑器不可联网 插件需要离线安装 vscode插件商店 Extensions for Visual Studio family of products Visual Studio Marketplace
  • element ui backTop源码解析-逐行逐析

    backTop 回到顶部 组件简介 基础概念 返回页面顶部的操作按钮 代码
  • Mac版 Photoshop 2021---PS2021

    Adobe Photoshop 2021是一款强大的图像处理软件 它可以帮助用户进行各种图像编辑 修饰和合成工作 这款软件拥有先进的图像处理技术 支持多种图像格式 可以轻松实现各种复杂的图像处理任务 它还提供了丰富的滤镜和工具 使用户可以自
  • HarmonyOS鸿蒙开发指南:容器组建 stepper开发指导

    目录 创建Stepper组件 设置index属性 设置样式 添加事件 场景示例 创建Stepper组件 在pages index目录下的hml文件中创建一个Stepper组件 div class container div
  • Vue + Element-ui组件上传图片报错问题解决方案

    在使用Vue和Element ui组件上传图片时 可能会遇到一些报错问题 以下是一些常见的问题及解决方案 报错 TypeError Cannot read property name of undefined 解决方案 这个错误通常是因为在
  • 提升编程效率,Sublime Text 4 for Mac 让代码编辑更高效!

    作为一名开发人员或程序员 一个高效且功能强大的文本编辑器是必不可少的工具 而 Sublime Text 4 for Mac 正是为满足这一需求而设计的 无论你是初学者还是经验丰富的专业人士 Sublime Text 4 都将成为你编程生涯中
  • UI自动化测试之Jenkins配置

    背景 团队下半年的目标之一是实现自动化测试 这里要吐槽一下 之前开发的测试平台了 最初的目的是用来做接口自动化测试和性能测试 但由于各种原因 接口自动化测试那部分功能整个废弃掉了 其中和易用性有很大关系 另外 也和我们公司的接口业务也有关
  • Cocos2d-x:可以使用HTML(UIWebView)吗?

    我正在尝试cocos2d x现在我可以为 Android 构建 Javascript 示例并在浏览器中运行它们 现在我想创建自己的游戏 但由于有 HTML 背景 我宁愿使用 HTML 标签和 CSS 也不愿使用 Javascript 来设置
  • 安卓后退按钮不起作用

    我正在使用 cocos2dx 制作一个小游戏 在游戏的活动中我提供以下函数来处理后退按钮 Override public boolean onKeyDown int keyCode KeyEvent event return super o

随机推荐

  • 攻防世界 web篇(一)

    攻防世界 web篇 一 inget fileclude easyupload fileinclude very easy sql 攻防世界 是一群信息安全大咖共同研究的答题 竞赛 以游戏方式结合的一款新型学习平台 融入多种场景在线题型 集实
  • 渗透测试——报错注入

    1 报错注入原理 由于后台没有对数据库的信息做过滤 会输出到前台显示 那么我们就可以通过制造报错函数 将查询语句带入到数据库中 以报错信息显示出来 2 报错注入漏洞产生的条件 1 参数用户可控 前端传入的参数内容由用户控制 2 参数带入数据
  • ArcGISMapsSDK for UnrealEngine_Beta2_00

    ArcGISMapsSDK for UnrealEngine Beta2 00 Prepare 1 Esri Community 2 All Communities 3 ArcGIS Maps SDK for Unreal Engine 4
  • Swing可视化设计:在IntelliJ IDEA中安装JFormDesigner教程

    Swing可视化设计 在IntelliJ IDEA中安装JFormDesigner教程 前言 最近课设大多需要gui设计 排除自学的情况 大部分同学都只接触过swing设计gui swing可视化插件将大大提高工作效率 这里提高破解版使用方
  • 数据结构与算法【Java】02---链表

    前言 数据 data 结构 structure 是一门 研究组织数据方式的学科 有了编程语言也就有了数据结构 学好数据结构才可以编写出更加漂亮 更加有效率的代码 要学习好数据结构就要多多考虑如何将生活中遇到的问题 用程序去实现解决 程序 数
  • 微信小程序申请 wx.getLocation 接口 审核一直不通过

    项目需要通过微信的 getLocation 获取本地的位置信息 经纬度 但是提交很多次审核都不通过 最后通过写了个项目里用不到的 导航功能 截图录屏才通过了审核 以下申请文案及配图仅供参考 因当前业务涉及就近医院挂号取号业务 需获取用户地理
  • python 使用pip install 手动安装本地包的方法

    Installing pystan manually fixed the issue otherwise it would just hang forever GitHub git clone https github com facebo
  • 【js中的单元测试】【30秒快速入门】

    什么是单元测试 测试是一种验证我们代码是否可以按预期工作的方法 换种说法就是写些代码来验证一段代码的正确性 被测试的对象可以是样式 功能 流程 组件等 单元测试是对软件中最小可测试单元进行检测和验证 单元测试能有效的提升工作效率 1 能监测
  • 常见swap()函数实现和细节讲解

    前言说明 swap 函数的作用是进行交换传入的两个值 本文都以整形int举例说明 且用C语言描述 常见的swap的实现方式有三种 格外一个空间的临时存放发 无格外空间的位运算异或法 无额外空间的加减法 主程序框架 include
  • 使用HAL库开发STM32:UART进阶使用

    文章目录 目的 发送处理 存在的问题 解决方法 个人常用处理方式 数据接收与解析 数据接收 数据解析 对于HAL库的吐槽 总结 目的 在前面文章 使用HAL库开发STM32 UART基础使用 中介绍的UART的基础使用 基础使用非常简单 不
  • U盘插入电脑后,有提示音,但不能显示出来,如何解决?

    导致此类问题的原因可能是用户的失误操作或者病毒的恶意修改等 1打开我的电脑 U盘没有显示出来 2打开控制面板单击选择设备和打印机 3在设备那一栏里会发现如图中已点击的图标 如果你的U盘没有改名字的话默认就是这个名字 有些品牌点击的U盘显示的
  • daily-timeline.js——打造每日时间轴

    最近因为需要在做会议室预约系统 其中需要用到一个显示当天预约情况的时间轴 去网上找了一下 发现只有和微博类似的历史时间轴 于是便自己动手做了一个当日时间轴控件 daily timeline js 实际使用效果如下 原理是Canvas的绘制
  • c语言中strcat函数的作用

    原型 extern char strcat char dest char src 用法 include
  • 在浏览器地址栏中输入地址后浏览器发生了什么?

    文章目录 前言 一 DNS查询 二 TCP连接 三 发送HTTP请求 四 服务器处理HTTP请求并返回HTTP报文 五 浏览器解析并渲染页面 六 HTTP连接断开 前言 当我们向浏览器的地址栏中输入一个网址并按下enter键之后 便可以跳转
  • MySQL 删除表数据,重置自增 id 为 0 的两个方式

    MySQL 删除表数据 重置自增 id 为 0 的两个方式 1 truncate table table name truncate table user 2 delete 配合 alter 语句 delete from table nam
  • Notepad++编辑过的行颜色设置 LocationNavigate.ini设置 高亮 黄色 绿色 修改的行变为黄色 修改的行高亮显示

    使用NotePad 修改的行会显示为橘黄色 保存之后 则显示为绿色 这两种颜色太亮了 想把色值调低 于是 展开搜索 发现这个功能是插件Location Navigate 带的 之后 找到了配置文件C Users xx AppData Roa
  • 阿里服务器怎么用教程[第一部分]

    第一步 登录我们的阿里云账号 第二步 根据自己的具体情况 选择好服务器的配置 比如你是大型企业 预估网站访问量很大 那么就要选配置较好的服务器 如果是个人网站 预估流量较小 就可以选择配置较低的云服务器 第三步 购买好云服务器后 我们在阿里
  • 使用 Python 实现 Excel 自动化

    使用 Python 实现 Excel 自动化 从 excel 过渡到 python 并提高您的工作效率 此视频教程共8 0小时 中英双语字幕 画质清晰无水印 源码附件全 课程英文名 Excel Automation Using Python
  • Scoop包管理工具

    不同系统下包管理工具 系统 工具 范例 备注 Arch Linux Pacman pacman S pyenv Built in CentOS RHEL yum yum install python wheel Built in Debia
  • Cocos2d-x 3.9教程:10.使用CocosStudio的UI编辑器从UI文件中加载布局和控件

    Cocos2d x 3 9教程 10 使用CocosStudio的UI编辑器从UI文件中加载布局和控件 1 1 使用CocosStudio的UI编辑器 1 1 1 安装和启动 从官网上下载2015年11月18日版本 Cocos studio