uikiller使用手册(一)

Wesley13
• 阅读 698

一、前言

uikiller是使用名命规则来控制UI节点、组件和触摸事件,减少UI相关的代码与编辑器设置,实现原理是提前对UI树的遍历。

在CocosCreator中UI编程基于组件模式,我根据自己的项目经验,将组件分为两类:法宝型结界型

法宝型组件

法宝型组件:以装饰宿主节点为己任,从不控制其它节点。

特点:通用性强,可挂载任意节点,Creator内置的组件绝大多数属于这类。
举例:Sprite、Label、Button、Widget等。

结界型组件

结界型组件:管理和控制其它节点及节点上的组件,通常会根据上层业务要求,调用其它节点的属性方法完成任务。

特点:业务逻辑性强,通用性差。
举例:完成具体业务功能的自定义组件。

关于法宝型和结界型组件的探索可以参考我的另一篇文章《CocosCreator组件化编程的探索》

有了上面的了解,我将uikiller定位为结界的管理者,下面介绍一下uikiller的基本用法。

一、Thor组件

Thor组件继承自cc.Component,它封装了uikiller的组件绑定机制,提供了当前UI树直接访问控制能力。

//导入Thor组件
let Thor = require('Thor');
cc.Class({
    extends: Thor,  //继承Thor组件
    onLoad() {
    }
});

使用uikiller提供的Thor组件做为自定组件的基类,并挂载到场景或预制体的根节点上,该组件脚本即可拥有控制UI树的两大能力:节点访问触摸事件监听

二、节点访问

将Thor子类组件脚本挂接到Canvas节点上,可实现当前编辑的整个UI树的管理。

uikiller使用手册(一)

在Thor子类脚本中,可直访问整个UI树中以下划线“_”开头命名的节点。

let Thor = require('Thor');
cc.Class({
    extends: Thor,
    onLoad() {
        //直接访问当前组件节点下的子节点
        cc.log(this._image.name);
        cc.log(this._label.name);
        cc.log(this._button.name);
    },
});

三、组件访问

在node节点访问的基础上,使用“$” + “组件名”访问节点上挂载的组件对象。

let Thor = require('Thor');
cc.Class({
    extends: Thor,
    onLoad() {
        //在节点上使用“$组件名”访问组件
        this._label.$Label.string = 'hello world';

        //注意继承了Thor的子类,onLoad函数在编辑器状态就会被执行        //可以根据具体业务使用CC_EDITOR变量逻辑判定是否要在编辑状态时间
        if (!CC_EDITOR) {
            //禁用按钮
            this._disableBtn.$Button.interactable = false;
        }
    },
});

三、触摸事件监听

下划线“_”开头的节点可以自动关联其触摸事件。

目前支持五个触摸事件:

TouchStart、TouchMove、TouchEnd、TouchCancel、TouchLong

命名规则

_on + 控件名(去下划线,首字母大写) + 触摸事件

例如节点名为_label,事件函数为:_onLabelTouchEnd
为什么定义这样的命名规则呢?首先“___”开头表示私有,on表示事件,后面形成形成驼峰命名,以Creator内置的触摸事件为后缀。

1. 监听节点事件

let Thor = require('Thor');
cc.Class({
    extends: Thor,
    /*
    *sender 响应事件的节点
    *event  事件对象,可以从中获取触摸坐标点等信息
    */
    _onLabelTouchEnd(sender, event) {
        cc.assert(sender === this._label);
        sender.$Label.string = '你抚摸了我';    
    }

2. 节点触摸事件监听

上面讲的都是子节点的触摸事件监听,要监听当前组件节点this.node的事件也可以的,而且方方更简单。

命名规则

_on +  触摸事件(首字母大写,形成驼峰命名)

同样支持五个事件:TouchStart、TouchMove、TouchEnd、TouchCancel、TouchLong

let Thor = require('Thor');
cc.Class({
    extends: Thor,

    //监听当前节点的触摸事件
    _onTouchStart(sender) {
        cc.assert(this.node === sender);
    }
})

3. 长按事件监听

长按事件是uikill扩展的触摸事件类型,可以给节点设置touchLongTime属性控制长按触发时间,默认是1秒,注意以毫秒为单位。

let Thor = require('Thor');

cc.Class({
    extends: Thor,

    properties: {
    },

    onLoad() {        //可以给节点一个touchLongTime的属性,设置长按触发时间
        this._label.touchLongTime = 500;
    },        //监听长按事件
    _onLabelTouchLong(sender) {
        cc.assert(sender === this._label);
    },});

结束

以上介绍了uikiller的基础功能,它可以帮助你编写更为精简的代码,让ui开发更简单,如果有兴趣可以访问github仓库获取(https://github.com/ShawnZhang2015/uikiller)进行体验。

本文分享自微信公众号 - Creator星球游戏开发社区(creator-star)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
徐小夕 徐小夕
4年前
《精通react/vue组件设计》之5分钟教你实现一个极具创意的加载(Loading)组件
前言本文是笔者写组件设计的第八篇文章,今天带大家用5分钟实现一个极具创意的加载(loading)组件.涉及的核心知识点主要是css3相关特性,如果大家非常熟悉,可直接跳过介绍直接看正文.时刻问自己:是否具备创造力?笔记前端组件的一般分类:通用型组件:比如Button,Icon等.布局型组件:比如Grid,Layout布
Easter79 Easter79
3年前
Storybook for vue
一、简介  Storybook是一款开源的组件开发工具,它可以运行在主程序之外,因此开发者可以用它来独立开发UI组件,或者用它来快速构建ui组件文档。  目前Storybook支持的框架有:ReactReactNative VueAngularMarionette.jsMith
Stella981 Stella981
3年前
Cocos Creator基础教程(13)—组件与节点的秘密
公众号上我们已经学习了有段时间的CocosCreator组件开发了,组件化开发到底有是什么?Shawn这阵子思绪不断,同时将自己的理解应用于实际项目中,颇有心得,在这里做一个分享。1\.节点与组件的关系有经验的同学,一上手CocosCreator就能想到「装饰模式」,我们看下定义:装饰模式(Deco
Stella981 Stella981
3年前
React Hooks的999999个好处
最近前几个月开始,新项目都开始完全使用typescripthooks,先不说typescript吧,hooks是真的香🤣1.更好的分离页面和逻辑,重用逻辑的方法现在前端项目的组件化,一般都是基于最基础的UI组件库(里面也有组件的功能逻辑),加上业务逻辑,封装一个个component,container。组件是UI逻辑的复用,
Stella981 Stella981
3年前
Agile Lite默认控制器CSS扩展实现H5组件动画切换
AgileLite中提供了很多控制器和组件的交互,但是实际开发过程中还会遇到很多种场景无法满足。这里介绍一下如何使用AgileLite的默认控制器和组件的UI渲染来满足不同的场景需要默认控制器的扩展默认控制器的扩展是指通过CSS样式对控制器进行UI渲染,使得默认控制器的使用场景更丰富。扩展默认控制器的方法
Easter79 Easter79
3年前
SwiftUI 跨组件数据传递
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言众所周知,SwiftUI的开发模式与React、Flutter非常相似,即都是声明式UI,由数据驱动(产生)视图,视图也会与数据自动保持同步,框架层会帮你处理“绑定”的问题。在声明式UI中不存在命令式地让一个视图变成xxx
Stella981 Stella981
3年前
CocosCreator 代码组件(创建销毁节点、访问节点和组件) (第四篇)
前言:在游戏开发中,我么都是通过代码来控制场景中的节点,下面讲解怎么用代码,创建节点、销毁节点、访问节点、访问组件。一、创建和销毁节点1\.创建新节点除了通过场景编辑器创建节点外,我们也可以在脚本中动态创建节点。通过newcc.Node()并将它加
taskbuilder taskbuilder
1个月前
TaskBuilder功能特性
1、基础功能组件化TaskBuilder将常用的功能封装成了组件,包括前端UI组件、后台业务操作等,开发业务功能时,可以像搭积木一样,通过鼠标拖拽就能快速实现前端界面设计和后台功能开发。tfp前端UI组件组件整体结构2功能设计可视化使用TaskBuilde