cocos基础教程(12)点击交互的三种处理

1、概述

游戏也好,程序也好,只有能与用户交互才有意义。手机上的交互大致可以分为两部分:点击和输入。其中点击更为重要,几乎是游戏中全部的交互。在Cocos2d-x 3.0中,更改了dispatch机制。同时加入了两种新的交互形式:listener 和touchEvent回调。加上先前版本中的点击函数回调,与重写layer层的touch消息响应,构成了一个相对完整的交互模式。

2、三种点击

1、函数回调

函数回调是最简单的响应形式,一直以来被用于MenuItem中的点击处理。在新版本中,此处发生了些小改变。我们可以看到在生成的程序中相关代码是这样的:

// a selector callback
void menuCloseCallback(Object* pSender);  

auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",
                        CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));  

void HelloWorld::menuCloseCallback(Object* pSender)
{
    Director::getInstance()->end();  

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}  

其中CC_CALLBACK_1宏是将函数与对象绑定在一起,1表示这个函数有一个参数。当点击这个按钮时,会调用这个回调函数。

除了基于c++11的这个形式的改变,使用方法与先前相同

2、TouchEvent响应

这是新加入的响应方式。它主要是使用在Widget上的。可以将其看做是函数回调的一个扩展,为更多的响应处理提供可能。使用方法大致是:

//声明
void touchButton(Object* object,TouchEventType type);  

//挂接到控件上
uiButton->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));  

//实现
void HelloWorld::touchButton(Object* object,TouchEventType type)
{
    LabelTTF* label;
    switch (type)
    {
    case TouchEventType::TOUCH_EVENT_BEGAN:
        label = static_cast<LabelTTF*>(getChildByTag(11));
        label->setString("按下按钮");
        break;
    case TouchEventType::TOUCH_EVENT_MOVED:
        label = static_cast<LabelTTF*>(getChildByTag(11));
        label->setString("按下按钮移动");
        break;
    case TouchEventType::TOUCH_EVENT_ENDED:
        label = static_cast<LabelTTF*>(getChildByTag(11));
        label->setString("放开按钮");
        break;
    case TouchEventType::TOUCH_EVENT_CANCELED:
        label = static_cast<LabelTTF*>(getChildByTag(11));
        label->setString("取消点击");
        break;
    default:
        break;
    }
} 

通常作为UI的Widget都会在最上层,所以可以“基本上”认为这种使用方式会优先于其他方式处理点击消息。因为UILayer也会有层级的改变,比如它和MenuItem之间的关系。所以说“基本上”。

3、Listener消息响应方式

这种实现也是新加入的。它更像是点击的一个层次过滤器。点击时,在listener队里中进行过滤。每一个listener检查自己保存的touch消息响应是否会被触发。一层一层过滤,最后在到Layer的touch消息响应。

它被设计成一个全局点击响应控制。具体的用法大致是这样:

auto dispatcher = Director::getInstance()->getEventDispatcher();
auto myListener = EventListenerTouchOneByOne::create();  

//如果不加入此句消息依旧会向下传递
myListener->setSwallowTouches(true);  

myListener->onTouchBegan = [=](Touch* touch,Event* event)
{
    //some check
    if (pass)
    {
        return true;
    }
    return false;
};  

myListener->onTouchMoved = [=](Touch* touch,Event* event)
{
    //do something
};  

myListener->onTouchEnded = [=](Touch* touch,Event* event)
{
    //do something
};  

dispatcher->addEventListenerWithSceneGraphPriority(myListener,mySprite1);
dispatcher->addEventListenerWithSceneGraphPriority(myListener,mySprite2);  

其原理是在dispatcher中检查listener列表,例如myListener或加进来的其他listener。然后每个listener检查自己中的Item看能否达到检查条件,例如:mySprite1,mySprite2。然后执行相应的操作。但这样的话,当控件很多的时候,每一次事件都进行这种双链表的检查操作不知会不会影响些性能?

时间: 2024-11-05 23:19:46

cocos基础教程(12)点击交互的三种处理的相关文章

Cocos2d-x 3.0 点击交互的四种处理

1.概述 游戏也好,程序也好,只有能与用户交互才有意义.手机上的交互大致可以分为两部分:点击和输入.其中点击更为重要,几乎是游戏中全部的交互.在Cocos2d-x 3.0中,更改了dispatch机制.同时加入了两种新的交互形式:listener 和touchEvent回调.加上先前版本中的点击函数回调,与重写layer层的touch消息响应,构成了一个相对完整的交互模式.先上一张Demo的图: 2.四种点击 1.函数回调 函数回调是最简单的响应形式,一直以来被用于MenuItem中的点击处理.

Android中WebView的JavaScript代码和本地代码交互的三种方式

一.Android中WebView的漏洞分析 最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视,关于这个漏洞,这里就不多做解释了,可能有的同学早就了解了,本来想写一篇文章详细介绍一下,但是网上的知识太多了,而且都很详细,就没弄了,这里大致简单明了的说几句: 第一.漏洞产生的原因 这个漏洞导致的原因主要是因为Android中WebView中的JS访问本地方法的方式存在缺陷,我们做过交互的都知

监听按钮点击事件的三种方式实现及调试信息输出的三种方式实现

监听按钮点击事件的三种方式实现: 1.匿名内部类 2.外部独立类 3.接口实现 package com.example.button; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View;

Unity NGUI监听按钮点击事件的三种方法

NGUI版本:3.6.5 1.直接实现OnClick方法: 创建一个脚本,在脚本中实现OnClick()方法,绑定该脚本到按钮上,点击时就会实现OnClick函数内容: 2.使用SendMessage: 选择按钮后,打开Component——NGUI——Interaction,选择Button Message,为按钮添加一个UIButton Message组件: 然后设置UIButton Message中的参数即可: Target:接收按钮消息的游戏对象: Function Name:接收按钮消

GStreamer基础教程12 - 常用命令工具

摘要 GStreamer提供了不同的命令行工具用于快速的查看信息以及验证Pipeline的是否能够正确运行,在平时的开发过程中,我们也优先使用GStreamer的命令行工具验证,再将Pipeline集成到应用中.本文将介绍gst-inspect-1.0,gst-discoverer-1.0,gst-launch-1.0命令行工具的使用. gst-inspect-1.0 此命令有3种工作模式,实际中我们常用第一种和第三种方式: 一.不带任何参数.这样会列出当前系统中支持的所有Element,这些E

cocos基础教程(8)粒子效果

简介 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象.物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸.烟花.水流)提供了方便. 粒子属性 一个强大的粒子系统它必然具备了多种多样的属性,这样才能配置出多样的粒子.下面就来看看粒子系统的主要属性吧. 主要属性: _duration 发射器生存时间,即它可以发射粒子的时间,注意这个时间和粒子生存时间不同.单位秒,-1表示永远:粒子发射结束后可点击工具栏的播放按钮再次发射 _emissionRa

cocos基础教程(1)Mac环境下搭建

下面主要介绍cocos2d-x环境的设置以及android的环境搭建 1.下载cocos2d-x 3.0正式版      http://www.cocos2d-x.org/download 2.下载android的sdk以及ndk     http://developer.android.com/sdk/index.html 3.下载ant     http://ant.apache.org (注:cocos2d-x的环境变量配置需要用到ant,主要是android需要使用到它) 4.下载pyt

cocos基础教程(11)事件分发机制

cocos3.0的事件分发机制: 创建一个事件监听器-用来实现各种触发后的逻辑. 事件监听器添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理. 事件监听器有以下几种: 触摸事件 (EventListenerTouch) 键盘响应事件 (EventListenerKeyboard) 鼠标响应事件 (EventListenerMouse) 自定义事件 (EventListenerCustom) 加速记录事件 (EventListenerAcceleration)

cocos基础教程(10)纹理缓存技术

Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理. 当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法的时候,cocos2dx将使用纹理缓存来创建一个CCSprite.所以你可以预先将纹理加载到缓存中,这样你在场景中使用的时候就非常方便了.怎么样加载这些纹理就看你自己的想法.例如,你可以选择异步加载方式,这样你就可以为loading场景增加一个进度条. 当你创建一个精灵,你一般会使用CCSprite