玩溜Cocos Creator入门学习(二)UI系统介绍 UI的组件(Canvas、Widget、Button)

引言

Cocos Creator是触控科技推出的最新的开发者工具,实现了彻底的脚本化、组件化、以及数据驱动的特点,当然还有一个更加好用的UI系统,

UI系统的基本组成部分和工作流程,所有UI界面的生产都是由最基本的UI元素拼装而成,下面就是UI系统的UI组件的介绍。

通常使用的UI场景

  • 主菜单
  • 导航按钮
  • 伸缩的活动按钮组
  • 顶部的状体栏
  • 计时器的进度条
  • 场景切换
  • 场景切换动画
  • 按钮点击动画
  • 复杂的文字排版
  • 复杂的组件排版
  • 动态生成列表(从服务器获取数据、然后在显示)
  • 。。。。

UI的组件

Canvas(画布)

Canvas(画布)组件能够随时获取设备屏幕的实际分辨率并对场景中所有渲染元素进行适当的缩放,场景中的Canvas同时只能有一个,并且所有UI和可渲染元素都设置为Canvas的子节点。

image

属性选项

选项 说明
Design Resolution 设计分辨率(内容生产者在制作场景时使用的分辨率蓝本)
Fit Height 设计分辨率(内容生产者在制作场景时使用的分辨率蓝本)
Fit Width 适配宽度(设计分辨率的宽度自动撑满屏幕宽度)

Widget 组件

Widget(对齐挂件)是一个很常用的UI布局组件。它能使当前节点自动对齐到父物体的任意位置,或者约束尺寸,让你的游戏可以方便地适配不同的分辨率。

image

对齐挂件的脚本接口请参考 Widget API

属性选项

选项 说明 备注
Top 对齐上边界 选中后,将在旁边显示一个输入框,用于设定当前节点的上边界和父物体的上边界之间的距离。
Bottom 对齐下边界 选中后,将在旁边显示一个输入框,用于设定当前节点的下边界和父物体的下边界之间的距离。
Left 对齐左边界 选中后,将在旁边显示一个输入框,用于设定当前节点的左边界和父物体的左边界之间的距离。
Right 对齐又边界 选中后,将在旁边显示一个输入框,用于设定当前节点的右边界和父物体的右边界之间的距离。
HorizontalCenter 水平方向居中
VerticalCenter 竖直方向居中
Target 对齐目标 指定对齐参照的节点,当这里未指定目标时会使用直接父级节点作为对齐目标
Align Mode 指定 widget 的对齐方式,用于决定运行时 widget 应何时更新 设置为 ON_WINDOWS_RESIZE,仅在初始化和每当窗口大小改变时重新对齐。
设置为 ONCE 时,仅在组件初始化时进行一次对齐。
设置为 ALWAYS 时,每帧都会对当前 Widget 组件执行对齐逻辑。

为了更好的理解 Widget 组件,在 Canvas 下新建一个 sprite ,在 sprite 节点上添加一个 Widget 组件

在 sprite 中就创建一个 Widget 的组件

边界对齐

上对齐,上边距为100px

上对齐、左对齐,上边距为100px、左边距为100px

下对齐、右对齐,上边距为0px、左边距为0px

居中对齐

约束尺寸

跟Xcode中的Xib一样,如果左右同时对齐,或者上下同时对齐,那么在相应方向上的尺寸就会被拉伸,下面创建两个 sprite 一个为白色背景spriteBg,另外一个是这个spriteImg,来验证说明的问题

设置垂直居中、左右边距固定死10px这样会拉伸图片

在 Spritte 中Type 属性可以设置成 Sliced 模式,在这个模式下,保证图片四个角不会拉伸,只有中间会拉伸,这样设计只需要做一套图就能够设配所有的按钮、适用于按钮、进度条类的控件

首先将图片添加到项目中,设置图片的border的边角,就是图片拉伸的时候:拉伸的地方、忽略拉伸的地方

设置Sprite 的Type Sliced 约束上下边距,

这样就达到了我们在一些特殊需求的地方只拉伸中间位置,而不拉伸边角

Button(按钮)组件

Button 组件可以相应用户的点击操作,当用户点击Button 时,Button 自身会有状态变化。另外,Button 还可以让用户在完成点击操作后相应一个自定义的行为。

点击 属性检查器 下面的添加组件按钮,然后从添加 UI 组件中选择Button,即可添加 Button 组件到节点上。

在Cocos Creator 中创建按钮的方式:

第一种方式创建Button

所有的空间都是基于节点Node这个概念,所以创建一个新的节点,自定义button


  • 在空节点上面创建新的sprite
    • 设置SpriteFrame的图片,我的设置是在ps中创建一个像素为2*2的白色的背景图
    • 我尝试在node、sprite、button中设置默认的颜色,都是透明的颜色,所以只能在重新添加一个新的纯色图片 2*2
  • 在向这个空节点添加Button
    • 设置Button 的Transition = COLOR
  • 想这个新的节点添加widget,对齐挂件

这种按钮的创建方式的好处、特点

  • 自定义程度高、灵活
  • 满足一些特殊需求(当我们在特殊需要,让这个按钮不显示,那么使用这种方式在你需要的区域覆盖一层node使用 等等...)

缺点

  • 创建相对麻烦(自己自定义封装一个Button包,以后直接调用这个包,也就不是大的问题)

第二种方式创建Button

大部分按钮都是显式存在的,所以我们只要添加一个Sprite 在这个sprite基础上进行封装也是可以完成我们对于按钮的需求。

在层级管理器中我们要做的事情

  • 添加一个Sprite ,并在这个sprite上面添加一个图
  • 在Sprite 的属性检查器上添加 Button 属性块,设置Button的属性
  • 添加widget 对齐挂件

好了一个新鲜出炉的Button出现。

第三种方式创建Button

这种方式也就是Cocos Creator 中添加的Button,他会在所有常见的Button的属性都会默认自动生成,哥们只要选择需要的内容添加删除

  • 自带Sprite 属性块, 并且属性中有个默认图片,像素为2*2的白色背景图片
  • 自动Label 控件
  • 在Button、Label中添加widget,设置对齐方式

其实还有很多中组合方式来创建Button,不管是什么UI控件只要能够在属性检查器中添加成功Button 这个属性块都可能成为 Button

Button的属性

属性 功能说明
Target Node 类型,当 Button 发生 Transition 的时候,会相应地修改 Target 节点的 SpriteFrame,颜色或者 Scale
interactable 布尔类型,设为 false 时,则 Button 组件进入禁用状态。
enableAutoGrayEffect 布尔类型,当设置为 true 的时候,如果 button 的 interactable 属性为 false,则 button 的 sprite Target 会使用内置 shader 变灰。
Transition 枚举类型,包括 NONE, COLOR,SPRITE 和 SCALE。每种类型对应不同的 Transition 设置。
Click Event 列表类型,默认为空,用户添加的每一个事件由节点引用,组件名称和一个响应函数组成

注意:当 Transition 为 SPRITE 且 disabledSprite 属性有关联一个 spriteFrame 的时候,此时不会使用内置 shader 来变灰

Button Transition

Button 的 Transition 用来指定当用户点击 Button 时的状态表现。目前主要有 NONE,COLOR,SPRITE 和 SCALE。

Color Transition

image
属性 功能说明
Normal Button 在 Normal 状态下的颜色。
Pressed Button 在 Pressed 状态下的颜色。
Hover Button 在 Hover 状态下的颜色。
Disabled Button 在 Disabled 状态下的颜色。
Duration Button 状态切换需要的时间间隔。

Sprite Transition

属性 功能说明
Normal Button 在 Normal 状态下的 SpriteFrame。
Pressed Button 在 Pressed 状态下的 SpriteFrame。
Hover Button 在 Hover 状态下的 SpriteFrame。
Disabled Button 在 Disabled 状态下的 SpriteFrame。

Scale Transition

image
属性 功能
Duration Button 状态切换需要的时间间隔。
ZoomScale 当用户点击按钮后,按钮会缩放到一个值,这个值等于 Button 原始 scale * zoomScale, zoomScale 可以为负数

Button 事件

属性 功能说明
Target 带有脚本组件的节点。
Component 脚本组件名称。
Handler 指定一个回调函数,当用户点击 Button 并释放时会触发此函数。
CustomEventData 用户指定任意的字符串作为事件回调的最后一个参数传入。

详细说明

Button 目前只支持 Click 事件,即当用户点击并释放 Button 时才会触发相应的回调函数。

添加脚本组件

Button的响应事件,在脚本中添加一个方法去响应这个点击事件

  • 资源管理器 中添加一个脚本文件,这个脚本文件只是做一个回调的函数,让按钮的点击事件响应

脚本代码如下

cc.Class({
    extends: cc.Component,

    properties: {
    },
    
    callback: function (event, customEventData) {
        //这里 event 是一个 Touch Event 对象,你可以通过 event.target 取到事件的发送节点
        var node = event.target;
        var button = node.getComponent(cc.Button);
        alert(customEventData);
    }
    
});

  • 在你的Button 节点属性检查器中 点击 添加组件 或将这个脚本文件拖到选中的Button 属性检查器中

通过代码添加回调

方法一

cc.Class({
    extends: cc.Component,
    properties: {

    },
    onLoad () {

        var clickEventHandler = new cc.Component.EventHandler();
        clickEventHandler.target = this.node; //这个 node 节点是你的事件处理代码组件所属的节点
        clickEventHandler.component = "BtnScript";//这个是代码文件名
        clickEventHandler.handler = "callback";
        clickEventHandler.customEventData = "foobar";

        var button = this.node.getComponent(cc.Button);
        button.clickEvents.push(clickEventHandler);


    },

    callback: function (event, customEventData) {
        //这里 event 是一个 Touch Event 对象,你可以通过 event.target 取到事件的发送节点
        var node = event.target;
        var button = node.getComponent(cc.Button);
        //这里的 customEventData 参数就等于你之前设置的 "foobar"
        alert(customEventData);
    }
});

方法二

方法二中有个缺点就是点击的事件获取不到,也就获取不到点击事件所在的坐标点

cc.Class({
    extends: cc.Component,

    properties: {
       button: cc.Button
    },

    onLoad: function () {
       this.button.node.on('click', this.callback, this);
    },

    callback: function (button) {
       //do whatever you want with button
       //另外,注意这种方式注册的事件,也无法传递 customEventData
    }
});

扩展

cocos creator libpng warning: iCCP: known incorrect sRGB profile

需告诉设计师,需要严格的PNG格式的图片

原因:libpng加强了对png格式检测导致
解决方法:
在PS中 编辑->颜色设置 修改一下内容
保存并替换原有图片OK

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容