奎特尔星球上有一件绝世神兵,就像是一把雷神之锤,在它的号令之下指挥着节点、组件和触摸事件,从而大量减少冗余代码与编辑器上的设置,他就是uikiller。uikiller指挥着英雄与魔灵杀敌无数,他的前身曾经在cocos2d-js星球上服役,名为UILoader。经过我潜心的改进,来到了奎特尔星球。

一、雷神之锤


uikiller只有一行需要要被主动调用的函数:uikiller.bindComponent,他就像一把雷神之锤,为组件下所有的节点和组件注入了魔力。

cc.Class({
    ...
    onLoad() {
        /*绑定当前组件节点以及基下所有以“_”开头的节点*/
        uikiller.bindComponent(this); 
    }
});

二、 杀、杀、杀—体验UI编程的快感

节点killer

在编辑器中以下划线“_”开头的节点,在雷神之锤的作用下,将会被自动绑定成当前组件实例的属性。

例如节点名:_labelName、_buttonOk

uikiller.bindComponent(this);  //使用bindComponent后即可访问子节点
this._labelName.active = true; //隐藏控件
this._buttonOk. x += 10; //设置 x 坐标

有没有一种很爽快的感觉,省去了定义和设置节点属性的动作,就上面三行代码来说,据我目测至少可以为你减少20个字节、两次的节点拖拽、30~60秒工作时间。

组件killer

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

例如节点名:_labelName 、_buttonOk

...
this._labelName.$Label.string = 'xxx'; //设置 Label的文本
this._buttonOk.$Button.interactable = false; //禁用按钮

访问组件属性同样很轻松,原来使用的getComponent(cc.Label)$Label所取代,再次为你省去5秒钟时间,代码量减少22个字节。

触摸事件killer

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

目前支持五个触摸事件:

TouchStart、TouchMove、TouchEnd、TouchCancel、TouchLong

命名规则

_on + 节点名(去下划线,首字母大写) + 触摸事件名
例如节点:_labelName
事件函数:_on***LabelName***TouchEnd

cc.Class({
    ...
    _onLabelNametouchStart(sender,eventTouch) {
       //sender 参数为发出事件的节点对象 
       cc.asset(this._labelName === sender); 
    },_onButtonOkTouchEnd(sender,eventTouch) {
        //eventTouch 参数为触摸事件,可获取触摸坐标位置
        let location = eventTouch.getLocation(); 
    },});

无需在编辑器上拖拽配置事件函数,也无需在代码中使用node.on注册事件监听。不论节点挂载的是Button还是Label或者其它组件,只要是节点使用上述方法都可以监听其触摸事件。

附赠很多人心仪以久的,触摸长按事件的支持

onLoad() {
        ...
        //控制长按触摸触发时间0.5秒,不要这句代码,默认1秒触发
        this._buttonOk.touchLongTime = 0.5; 
  }

  _onButtonOkTouchLong(sender) {
        //在此响应长按事件
    }

如果同时监听了TouchEnd事件, 长按事件发生后,手指抬起,不会再触发TouchEnd事件。

轻轻睁开你的眼睛,看着自己书写的代码像一篇散文或似一首诗歌,闭上双眼,它又像一清新婀娜的少女,这时你就和你的作品恋爱了。

三、割草般的编程体验—无双乱舞

1. 三国无双

不知道大家玩过《三国无双》没有,相信很多人会说《三国无双》就是一个割草游戏。敌人像一片片的杂草数量众多,蜂拥而来,你一阵潇洒的连招下去杀死一大片,此刻无双能量暴满,一阵让自己都会陶醉的无双乱舞,只听见敌军一阵狼嚎,像爆米花一样在天空上起起落落,我想大多数人还是会很享受这种一骑当千的快感。

2. uikiller无双技

// use this for initialization
    onLoad: function () {
        uikiller.bindComponent(this);

        //8连击,还带for循环的哦
        for(let i = 1; i <= 8; i++) {
            //节点名为"_image1~_image8"
            let name = '_image' + i; 
            let node = this[name];

            /*节点下的num是一个Label用Name就可以直接访问*/
            /*但是Label没“_”开头,不能用$访问节点下的组件*/
            node.num.getComponent(cc.Label).string = i;
        }
    },/** *触发无双技能 *_image1~_image8的事件响应函数,都会来这里 *通过sender.$可以获取在编辑上的$后的字符串 **/
    _onImagetouchEnd(sender) {
        cc.log(`你点击了${sender.$},他的节点名字为"${sender.name}"`);
    },

用上面的列子为你详解一下无双技要点:
1. 在节点名字中使用 符号之前为事件名:_image
182.访+this.image1this.image83.node.
this._image1.$ === ‘1’,注意他是字符串哦!
4. 事件函数:_on + 事件名 + 触摸事件名
_onImagetouchStart
_onImagetouchMove
_onImagetouchEnd
_onImagetouchLong

3. 连锁闪电

细心的朋友可能已经发现,上面一阵无双乱舞中出现一行怪招

node.num.getComponent(cc.Label).string = i;

其中的num节点没有“_”开头,怎么也能直接访问呢?这里我是不小心触发了uikiller雷神之锤的连锁闪电的魔力,所有被雷神之锤(bindComponent)绑定后的UI节点,被闪电链接在了一起,节点下的节点可以像使用路径一样访问。
1. a节点下有个b节点,b节点下有个c节点,a、b、c节点都不带下划线
2. _a节点下有个b节点,b节点下有个c节点,b、c节点都不带下划线

发动连锁闪电
this.node.a.b.c.name //注意a节点没有"_"开头,从node上开始闪电
  this._a.b.c.name //直接从"_"开头的节点开始闪电

连锁闪电是以节点路径方式传导,可以访问任意子节点,且节点不需要用“_”开头。

想像一下,每个人都手持雷神之锤,一起释放无双乱舞是何等的体验,让你在代码编写过程中也能体验到以一当千的快感,而且这不是在做梦!其实uikille早已是奎特尔星上人人必备的装备(回顾一下四周,囧,貌似奎特尔星球上目前还没几个居民),不然如何能坚持到现在,还在这里写教程。

四、写在最后

按一般常理来说从感受快感体验高潮,接下来多半会一泄千里,洗洗睡了,但在奎特尔星球上这想那是非常不正确的,好的体验不仅仅只是在文字上,更重要的是在体验本身,在此奉献上源码供大家把玩。

github: https://github.com/ShawnZhang2015/uikiller

下一次再跟大家分享奎特尔星球上的故事 - uikiller—乾坤大挪移功法

奎特尔星球|雷神之锤(上)的更多相关文章

  1. 移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. ios – 在applicationWillEnterForeground触发时更改UIView

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. UILabel导致应用程序在添加到视图时崩溃(仅限Xcode 6和iOS 8)

    我已将我的项目转换为Xcode6,以便为iOS8构建.但是,特定的UILabel会导致应用程序在添加到视图层次结构时崩溃.这是我收到的唯一错误日志:我无法在项目中的任何位置找到contentInsetsFromFonts方法.此外,我甚至无法在网上任何地方找到它的参考,包括Apple的文档.我没有为这个UIViewController使用NIB,因此UI是在loadView方法中构建的:该应用程序

  4. iOS 7通知中心与标签一样

    您可以试试,也许在将模糊应用到标签之前为模糊添加一点白色.

  5. iOS safari输入插入颜色

    我在iPhone设备上有一个小的CSS问题.我的搜索输入为蓝色,当用户关注它时,插入符号几乎不可见:在所有桌面浏览器中,即使在桌面Safari上,它也具有正确的颜色(白色).知道如何修复此问题并更改iOS设备上的插入颜色吗?

  6. 如何计算iOS 7中的实际字体大小(不是边框)?

    编辑:链接的“重复”问题仅涉及计算文本矩形.我需要在标签缩放之后计算实际字体大小,而不是字符串大小.此方法现已弃用:如何在iOS7中计算UILabel的字体大小,以缩小文字大小以适应?

  7. ios – 为什么在presentmodalviewcontroller调用时,navigationItem.titleView会左对齐?

    我正在使用UILabel作为导航栏的titleView.它工作正常,除了当我呈现模态视图控制器时,titleView从导航栏的中心移动到最左边.我在3.0及以上测试过.这是相关代码:截图:知道为什么会这样吗?

  8. ios – 在XCode中的UI测试期间无法访问自定义视图

    我们必须执行一些时髦的动画,这是我们最好的布局).问题是我无法访问此视图以模拟其上的点击.我可以使用app.staticText[“输入名称…”]访问标签,但是如果我点击它.记录我点击标签的会话将产生app.staticText[“输入名称…”

  9. ios – UITableView以编程方式调用滑动操作

    我有一个UITableView,用户可以向左滑动以显示动作.这一切都按预期工作.当用户点击单元格的某个部分时,我想触发这个.如何以编程方式调用此幻灯片动作?

  10. ios – 在SpriteKit中创建按钮:Swift

    我想在SpriteKit或SKScene中创建一个按钮,将视图发送到另一个视图控制器.我尝试使用“performSeguewithidentifier”,但显然SKScene不支持此功能.如何使用SpriteKit创建一个将视图发送到另一个视图的按钮?这是我尝试用来执行此操作的代码.带有“HomeButton.prepareForSegueWithIdentifier()”的行只是一个例子.它实际

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部