Cocos2d-x学习之路(个人总结)
http://www.docin.com/p-1489599279.html

四、触摸篇
1、传统的单点触摸(针对scene的触屏事件)
1.1单点触摸的声明
1.2单点监听器的创建
1.3具体方法的实现
2、针对node的单点触摸(兰布达表达式)【此即第4种点击——3.0之后的Listener消息响应方式】
2.1这种触摸方式并不需声明
2.2单点监听器的创建和方法实现
auto listener=EventListenerTouchOneByOne::create();
listener->onTouchBegan=[=](Touch *touch,Event *event)
{

};
listener->onTouchMoved=[](Touch *touch,Event *event)
{

};
listener->onTouchEnded=[=](Touch *touch,Event *event)
{

};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,hello);//node类型
注意:兰布达表达式[](){}
其中[&]任何被使用的外部变量皆隐式地以参考方式加以引用。全局对象消失之后不能使用。
[=]任何被使用的外部变量皆隐式地以传值方式加以引用。全局变量一直可以使用。
接着()中是传入参数,{}里面是方法体。
2.3兰布达表达式
3、触摸穿透(吞没)
4、多指触摸

chap6 Cocos2d-x 3.x的事件处理机制【3.x新的事件分发机制:所有事件都由EventDispatcher分发。】
6.1事件处理机制
6.1.1接收数据Touch
6.1.2分发事件EventDispatcher
6.1.3处理响应EventListener
6.2触摸事件
6.3加速度计事件
6.4按键事件
6.5鼠标事件
6.6自定义事件
6.7本章小结

chap8 Cocos2d-x 3.x中的事件机制
包括触摸事件EventTouch、鼠标事件EventMouse、键盘事件EventKeyboard、Acceleration(重力感应)事件EventAcceleration和自定义事件

Cocos2d-x 3.0之前是使用NotificationCenter来实现事件通知的,Cocos2d-x 3.0之后使用了EventDispatcher来实现。
16.1事件通知
最简单的一种方法是直接通知。
还有另外一种方法是轮询通知。
还有一种称之为消息队列的通知机制。
最后来看看观察者模式。
16.2 NotificationCenter和EventDispatcher
NotificationCenter是3.0之前的消息通知机制,因为功能比较简单,并且效率低下所以没有被广泛使用,最终从3.0开始被废弃了。
16.2.4 使用NotificationCenter
第一步是注册监听,但在这里并不需要创建一个listener。任何继承于Ref的对象都可以是NotificationCenter的listener,只需要将对象的指针和回调传入NotificationCenter即可,回调的原型是void callback(Ref*);
调用NotificationCenter::getInstance()->addObserver可以添加一个观察者,其会自动创建一个NotificationObserver对象并放到NotificationCenter中进行管理。
//NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(HotUpdateLayer::getClientVersion),MSG_UI_ANS_GETCLIENTVERSION,NULL);
//NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(HotUpdateLayer::checkUpdate),MSG_UI_ANS_CHECKUPDATE,NULL);
//NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(HotUpdateLayer::updateDownLoad),MSG_UI_ANS_UPDATEDOWNLOAD,NULL);
第二步是发送消息,调用postNotification方法可以发送指定的消息,这个方法有一个重载函数,接受一个Ref*对象。
NotificationCenter::sharedNotificationCenter()->postNotification(MSG_UI_ANS_GAMELINK,Integer::create(1));
第三步是注销,将添加的对象和监听的消息传入,并移除该观察者。
//NotificationCenter::getInstance()->removeObserver(this,MSG_UI_ANS_GETCLIENTVERSION);
//NotificationCenter::getInstance()->removeObserver(this,MSG_UI_ANS_CHECKUPDATE);
//NotificationCenter::getInstance()->removeObserver(this,MSG_UI_ANS_UPDATEDOWNLOAD);
18.1如何监听触摸消息
18.1.1监听触摸消息
使用触摸监听者处理触屏事件,需要有以下两个步骤:
1、创建监听者并实现监听回调。
2、注册监听者等待事件触发。
Cocos2d-x 3.0之后改继承为组合,结合C++ 11的fuction对象,很好地简化了类之间的继承关系。原来希望监听一个消息时,自身必须成为一个监听者,而现在可以很方便地创建一个监听者,由这个监听者专门监听消息。
18.1.2触摸监听者
EventListenerTouchOneByOne/EventListenerTouchAllAtOnce分别对应Cocos2d-x 3.0之前的CCTargetedTouchDelegate/CCStandardTouchDelegate,前者的命名更为直观。
Target监听者的例子:
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);//点击吞噬的选项,独占这个点击事件,其他的Target监听者不会接收到这个点击事件了
listener->onTouchBegan = CC_CALLBACK_2(LotteryKindScrollView::onTouchBegan, this); 
listener->onTouchEnded = CC_CALLBACK_2(LotteryKindScrollView::onTouchEnded, this);
listener->onTouchMoved = CC_CALLBACK_2(LotteryKindScrollView::onTouchMoved, this);
listener->onTouchCancelled = CC_CALLBACK_2(LotteryKindScrollView::onTouchCancelled, this);
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
在多点触摸时,OneByOne会将触摸点一个一个地回调,回调函数的参数为Touch *, Event *。每次回调只传入一个触摸对象。
bool LotteryKindScrollView::onTouchBegan(Touch *pTouch, Event *pEvent)
{
    if(pTouch->getLocation().y > 150 + 604 || pTouch->getLocation().y < 150) return false; 
    start_pos = pTouch->getLocation();
    return true;
}
void LotteryKindScrollView::onTouchMoved(Touch *pTouch, Event *pEvent)
{
   
}
void LotteryKindScrollView::onTouchEnded(Touch *pTouch, Event *pEvent)
{
   
}

第7章 3.x事件处理
Cocos2d-x 3.0采用了全新的事件处理方式,由原来的代理模式,改为了现在的事件监听器模式。每一个事件都由三部分组成,事件源(也就
是发出事件的游戏对象)、事件本身(如触屏事件)和事件监听器Listener,事件源和监听器要绑定起来才能起作用。
7.1单点触屏事件
//2.x单点触屏事件的回调函数
virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
//3.x单点触屏事件的回调函数
virtual bool onTouchBegan(Touch *pTouch,Event *pEvent);
virtual void onTouchMoved(Touch *pTouch,Event *pEvent);
virtual void onTouchEnded(Touch *pTouch,Event *pEvent);
virtual void onTouchCancelled(Touch *pTouch,Event *pEvent);
7.2多点触屏事件
//2.x多点触屏事件的回调函数
virtual void ccTouchesBegan(CCSet* touches, CCEvent* event);
virtual void ccTouchesMoved(CCSet* touches, CCEvent* event);
//void ccMousesMoved(CCSet *touches, CCEvent *pEvent);
virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);
//3.x多点触屏事件的回调函数
virtual void onTouchesBegan(const std::vector<Touch*>& touches,Event* event);
virtual void onTouchesMoved(const std::vector<Touch*>& touches,Event* event);
virtual void onTouchesEnded(const std::vector<Touch*>& touches,Event* event);
virtual void onTouchesCancelled(const std::vector<Touch*>& touches,Event* event);

2.x中的触摸输入:
7.1触摸输入
鼠标可以实现悬停效果,触摸屏不可以;鼠标只有一个焦点,而触摸屏大多数支持多个触摸点;鼠标通常包含两个功能键从而区分左右键,而触摸屏只能实现一种点按操作。
7.1.1使用CCLayer响应触摸事件【此即第2种点击——3.0之前的Layer的touch消息响应】
/// 玩家
class Player : public CCLayer

public:
 Player(int iPosition, bool bMySelf=false);
 ~Player(void);
// ccTouchesXXX在CCLayer中都声明为虚函数,这4个函数来自于CCStandardTouchDelegate接口
// 传入参数pTouches是一个CCTouch对象(表示一个触摸点)的集合,其中包含当前触摸事件中的所有触摸点。
// 传入参数pEvent是由Cocos2d-iPhone引擎遗留下来的形式参数,在Cocos2d-x当前版本中没有意义。
// 当玩家的触摸动作完成时(例如抬手和手指离开屏幕等),会引起触摸结束事件。
// 而触摸取消的情况较少,仅当触摸过程中程序被调入后台时才会出现。
        // 触摸开始
 void ccTouchesBegan(CCSet* touches, CCEvent* event);
        // 触摸移动
 void ccTouchesMoved(CCSet* touches, CCEvent* event);
 void ccMousesMoved(CCSet *touches, CCEvent *pEvent);
 CC_SYNTHESIZE_READONLY(bool, m_MySelf, MySelf);    /// 设置自己
};
Player::Player(int iPosition, bool bMySelf/*=false*/) : m_PlayerPT( iPosition )
 , m_iGunType( 1 )
 , m_pGunAnimation( NULL )
 , m_MySelf( bMySelf )
{
 
// 一般情况下,我们可以通过TouchEnable属性来开启或关闭接收触摸输入。
// 开启层的触摸输入支持
setTouchEnabled( bMySelf ? true : false );
}
Player::~Player(void)
{
}
void Player::ccTouchesBegan(CCSet* touches, CCEvent* event)
{
 if ( !m_MySelf )
  return;
 CCSetIterator iter = touches->begin();
 for(; iter != touches->end(); iter++)
 {
  CCTouch* pTouch = (CCTouch*)*iter;
  EmitGun(CCDirector::sharedDirector()->convertToGL( pTouch->getLocationInView() ));
 }
}
void Player::ccTouchesMoved(CCSet* touches, CCEvent* event)
{
// 判断触摸点的数目
if(touches->count()==1){
// 取出该触摸点
CCTouch* pTouch = dynamic_cast<CCTouch*>(touches->anyObject());
// 获取游戏画面中的点位置
CCPoint position=pTouch->getLocationInView();
// 把屏幕坐标转换为游戏坐标
position=CCDirector::sharedDirector()->convertToGL(position);
// 在此处理触摸事件
}
else
{
// 如果不止一个触摸点,则在此处理多点触摸事件
}
}
void Player::ccMousesMoved(CCSet *touches, CCEvent *pEvent)
{
 CCSetIterator iter = touches->begin();
 for(; iter != touches->end(); iter++)
 {
  CCTouch* pTouch = (CCTouch*)*iter;
  whirlGun(CCDirector::sharedDirector()->convertToGL( pTouch->getLocationInView() ));
 }
}
7.1.2两种Cocos2d-x 2.x触摸事件
标准触摸事件的特点是任何层都会平等地接收全部触摸事件。
带目标的触摸事件的特点是接收者并不平等,较早处理事件的接收者有权停止事件的分发,使它不再继续传递给其他接收者。
1、标准触摸事件
利用CCLayer可以方便地启用层上的标准触摸事件。
2、带目标的触摸事件
我们可以为任意对象添加标准触摸事件。

Cocos2d-x 2.0中常用的isTouchEnabled()、setTouchEnabled(bool value)、isAccelerometerEnabled()及setAccelerometerEnabled(bool value)4个启用或禁用触摸事件和加速度计事件的函数已经不建议使用了,从Cocos2d-x 3.0开始建议使用监听器来监听回调触摸事件和加速度计事件。
chap6 Cocos2D-x 2.x中的事件处理机制
在智能手机中,主要的输入操作是通过触摸屏幕,重力感应等方式实现的,而输入文字主要通过虚拟键盘等实现的。
6.1触屏事件
在Cocos2D-x 2.x中,继承自触屏代理协议CCTouchDelegate的布景层类CCLayer可以检测触屏事件并调用回调函数。首先来看CCTouchDelegate类的继承关系。
CCTouchDelegate的子类中,CCStandardTouchDelegate协议是标准的获得多点触摸点的范例,CCTargetedTouchDelegate不用处理触摸点的集合,它是返回单点的。
此外,我们常用的类是布景层类CCLayer,也就是说,在布景层类中可以重写ccTouchesBegan等函数获得触屏的信息。
6.1.1触点类CCTouch
一般把触摸点的信息放入触点类CCTouch中。CCTouch类的公共函数见表6-1。
函数名,返回类型,描述
locationInView,坐标点,获得点在画布中的位置
previousLocationInView,坐标点,之前在画布中的位置
setTouchInfo(ID号,x坐标,y坐标),空,设置信息
getID,整形,获得ID号

chap5 2.x用户交互
5.1概述
5.2玩家交互信息
5.3 2.x触摸操作的代理处理机制
以iOS为例,引擎使用了EAGLView来处理画面显示与用户交互。而根据iOS SDK的设计,它为开发者提供了四个用于响应用户操作的函数。
上面代码,来自于引擎目录当中的\cocos2dx\platform\ios\EAGLView.mm。
它的功能是将iOS平台中的用户操作信息传递到了引擎当中。然后,让引擎的用户操作机制来处理。
进入到引擎源代码中的platform\目录,就会看到针对不同平台而编写的CCEGLView文件。
在引擎当中,用户操作将会经过接收、分发、处理三个步骤。
5.4接收操作
引擎开发者设计了一个专门存储用户操作的类CCTouch。
每个类CCTouch的对象都包含了一个用户操作信息。其属性当中存储了id标识、x坐标、y坐标。这就是类CCTouch的作用。它能够将采集自不同平台的触摸信息,保存为统一的格式。
5.5分发机制
代码是来自于CCEGLViewProtoco.cpp文件的代码片段。函数handleTouchesBegin就是将各个平台的用户操作数据转化为引擎所用的用户操作数据。
在代码中,读者可以看到新创建的CCTouch对象。它们作为用户操作信息,被传递了一个m_pDelegate对象。这是一个用户操作的分发对象。
引擎专门提供了一个负责分发用户操作信息的类。类CCTouchDispatcher的作用就是响应对象分发用户操作信息,即类CCTouch对象。
所谓分发,就是类CCTouchDispatcher不仅仅只发送一次。它会向所有需要响应的对象发送用户操作信息。
类CCTouchDispatcher被一个单例对象持有成为了一个成员变量。
类CCTouchDelegate就是分发器发送用户操作信息的目标对象。我们姑且将此类型的对象称为用户操作委托对象吧!
类CCTouchDelegate具有三个子类:CCLayer、CCStandardTouchDelegate、CCTargetTouchDelegate。
5.6处理响应
类CCLayer是一个标准的委托对象。
作为目标委托对象,其响应函数所传递的参数都为单一的用户操作信息。而标准委托对象,其响应函数所传递的参数则是一个用户信息的集合。说的明白一点,目标委托对象是用来响应单点触摸的,而标准委托对象是用来响应多点触摸的。
说明:多点触碰是可以包含单点触碰的,因此标准委托对象可以替代目标委托对象的功能。
单点触摸却无法实现如捏合、分离的用户操作。
函数ccTouchBegan是唯一一个具有返回值的。如果返回值为真值,则分发器将会停止此次事件的分发。换句话说,在分发器中后续的委托对象将不能再接收到此次用户操作数据。
5.7多点触碰
5.8加速计的响应函数

在Cocos2d-x 2.x引擎当中,使用了类CCAccelerometer来存储加速度计的信息。类CCAccelerometer的作用与用户操作的分发器类似。区别在于用户操作的分发器可以拥有很多的委托对象。而加速度计只存在一个委托对象。

类CCAccelerometerDelegate就是加速度计的委托对象。开发者同样需要采用注册的方式来使用它。
5.9本章小结

//VC2013控制台例子

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;

// new callbacks based on C++11
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

class A
{
public:
int add2(int a, int b)
{
return a+b;
}

int add3(int a, int b, int c)
{
return a+b+c;
}

int fun()
{
//用CC_CALLBACK_2占上前2个参数,给后面0个参数绑定
std::function<int(int,int)>p = CC_CALLBACK_2(A::add2,this);
int ret=p(1,2);
//用CC_CALLBACK_2占上前2个参数,给后面1个参数绑定
std::function<int(int,int)>p1 = CC_CALLBACK_2(A::add3,this,10);
int ret1 = p1(1,2);
//用CC_CALLBACK_1占上前1个参数,给后面1个参数绑定
std::function<int(int)>p2 = CC_CALLBACK_1(A::add2,this,2);
int ret2 = p2(1);
return ret2;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
A a;
int ret = a.fun();
cout << ret << endl;

#if 0
int test_data[] = { 1, 5, 9, 7, 3, 19, 13, 17 };
int border = 8;
auto f3 = [border](const int &i){ if (i > border) cout << i << '\t'; };
for_each(begin(test_data), end(test_data), f3);
cout << endl;

auto f4 = [&border](const int &i){ if (i > border) cout << i << '\t'; };
border = 6;
for_each(begin(test_data), end(test_data), f4);
cout << endl;

char space = ' ';
auto f5 = [=](const int &i){ if (i > border) cout << i << '\t'; };
auto f6 = [&](const int &i){ if (i > border) cout << i << '\t'; };
auto f7 = [&, space](const int &i){ if (i > border) cout << i << space; };
border = 0;
for_each(begin(test_data), end(test_data), f5);
cout << endl;
for_each(begin(test_data), end(test_data), f6);
cout << endl;
for_each(begin(test_data), end(test_data), f7);
cout << endl;

auto f8 = [&, space](const int &i) mutable { if (i > border) { cout << i << space; space = '\t'; } };
for_each(begin(test_data), end(test_data), f8);
cout << endl;
cout << 1 << space << 2 << endl;

auto f9 = [](const int i){if (i % 3) return i * 3; else return i; };
transform(begin(test_data), end(test_data), begin(test_data), f9);
border = 0;
for_each(begin(test_data), end(test_data), f6);
cout << endl;

auto f10 = [](const int i) -> double
{if (i % 5) return i * 5.0; else return i; };
transform(begin(test_data), end(test_data), begin(test_data), f10);
for_each(begin(test_data), end(test_data), f6);
cout << endl;
#endif

system("pause");
return 0;
}

20180225添加:
3.0中的4种点击
1、3.0之前的点击函数回调
auto menuItem=MenuItemImage::create("tuoguan_mask.png", "tuoguan_mask.png", [&](Ref* ref){
_player->doMandate( false );
        
});

auto menuItem = MenuItemImage::create("tuoguan_mask.png", "tuoguan_mask.png", CC_CALLBACK_1(PlayerLayer::menuCallBack, this));
void PlayerLayer::menuCallBack(Ref* ref)

{
//MenuItemImage* pB = static_cast<MenuItemImage*>(ref);

//MenuItemImage* pB = dynamic_cast<MenuItemImage*>(ref);

_player->doMandate(false);

}
其中CC_CALLBACK_1宏是将函数与对象绑定在一起,1表示这个函数有一个参数。当点击这个按钮时,会调用这个回调函数。
除了基于C++ 11的这个形式的改变,使用方法与先前相同。
此种方式已经被舍弃,可以使用第4种方法做替代。

无回调参数版本
auto menuItem=MenuItemImage::create("mandate.png", "mandate.png");

2、3.0之前的Layer的touch消息响应
虽然3.0采用了新的事件分发机制,不再局限于Layer,但对这层的使用影响并不大。我们同样需要重写:
//单点响应  
virtual bool onTouchBegan(Touch* touch, Event  *event) override;  
virtual void onTouchMoved(Touch* touch, Event  *event) override;  
virtual void onTouchEnded(Touch* touch, Event  *event) override;  
virtual void onTouchCancelled(Touch *touch, Event *event) override;  
  
//多点响应  
virtual bool onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event) override;  
virtual void onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event) override;  
virtual void onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event) override;  
virtual void onTouchesCancelled(const std::vector<Touch*>& touches, Event *unused_event) override;

setTouchEnabled(true);//已经不建议使用
//设置为单点响应  
setTouchMode(Touch::DispatchMode::ONE_BY_ONE);  
//设置为多点响应(默认)  
setTouchMode(Touch::DispatchMode::ALL_AT_ONCE);

3、3.0之后的TouchEvent响应
这是新加入的响应方式。它主要是使用在Widget上的。可以将TouchEvent回调看做是函数回调的一个扩展,为更多的响应处理提供可能。使用方法大致是:
// 响应Button点击事件
//btn_exchange->addClickEventListener(CC_CALLBACK_1(uiMallzs::onClickedBuyVip, this, idx));
btn_exchange->addTouchEventListener(CC_CALLBACK_2(uiMallzs::onClickedBuyVipEx, this, idx));
void uiMallzs::onClickedBuyVipEx(Ref* ref, cocos2d::ui::Widget::TouchEventType type, int ikey)
{
//Node* sender = ((Node *)(ref));
// 在进行下行转换(把基类指针或引用转换成子类表示)时,dynamic_cast具有类型检查的功能,比static_cast更安全
Node* sender = dynamic_cast<Node*>(ref);
if (sender == nullptr)
return;
if (type == ui::Widget::TouchEventType::BEGAN)
{
uiUtils::PlayClickBtn(sender);
}
else if (type == ui::Widget::TouchEventType::ENDED)
{
onClickedBuyVip(sender, ikey);
uiUtils::PlayResetBtn(sender);
}
else if (type == ui::Widget::TouchEventType::CANCELED)
{
uiUtils::PlayResetBtn(sender);
}
}
通常作为UI的Widget都会在最上层,所以可以“基本上”认为这种使用方式会优先于其他方式处理点击消息。

4、3.0之后的Listener消息响应方式
这种实现也是新加入的。它更像是点击的一个层次过滤器。点击时,在listener队里中进行过滤。每一个listener检查自己保存的touch消息响应是否会被触发。一层一层过滤,最后在到Layer的touch消息响应。
它被设计成一个全局点击响应控制。具体的用法大致是这样:
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
//不向下传递触摸,模态框就是这样实现的
listener->onTouchBegan = CC_CALLBACK_2(BaseGameMenuLayer::onTouchBegan, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);//优先级是0,添加完后不需要手动remove,因为是跟node绑定的,在node的析构函数中会被移除。

/*
单点触摸
onTouchBegan:如果返回true:本层的后续Touch事件可以被触发,并阻挡向后层传递
如果返回false,本层的后续Touch事件不能被触发,并向后传递
*/
bool BaseGameMenuLayer::onTouchBegan(Touch *touch, Event *event)
{
setSubMenuVisible(false);
return false;
}

浅析C++11新特性的Lambda表达式
http://www.jb51.net/article/89624.htm

例1:A类调用B类
B类
typedef std::function<void(int)> CallBack;
void setCallBack(CallBack callBack);
void GameShare::setCallBack(CallBack callBack)
{
_callBack = callBack;
}
CallBack_callBack;

std::function<void(int)> select_cb

A类
//showType: 左右显示,或者上下显示(参考GameShare::ShowType),bShareImage false:邀请,true:图片分享
void ShowSelectShare(cocos2d::Ref * pSender, int showType, std::function<void(int)> select_cb);
game_share->setCallBack([&](int shareType){
if (shareType == 0)//分享到微信
{
select_cb(0);
}
else if (shareType == 1)//分享到钉钉
{
select_cb(1);
}
else if (shareType == 2)//分享到支付宝
{
select_cb(2);
}
});

//外层调用的地方
ShowSelectShare(pSender, GameShare::ShowType::kShowTypeUpDown, [&](int shareType){
...
});

例2:键盘释放事件监听
#ifdef WIN32
// 监听按键
auto listener_back = EventListenerKeyboard::create();//键盘响应事件
listener_back->onKeyReleased = CC_CALLBACK_2(uiPlaza::onKeyReleased, this);
/*listener_back->onKeyReleased = [=](EventKeyboard::KeyCode keycode, Event *event){
if (keycode == EventKeyboard::KeyCode::KEY_F1)
{
ADD_SCENE_NODE_DEFAULT(this, SCENE_QUIT);
return;
}
if (keycode == EventKeyboard::KeyCode::KEY_F2)
{
ADD_SCENE_NODE_DEFAULT(this, SCENE_PERSONAL_ROOM);
return;
}
};*/
//Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener_back, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener_back,this);//将键盘响应事件交分发器来管理
#endif

void uiPlaza::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event)
{
if (keyCode == EventKeyboard::KeyCode::KEY_F1)
{
ADD_SCENE_NODE_DEFAULT(this, SCENE_QUIT);
return;
}
if (keyCode == EventKeyboard::KeyCode::KEY_F2)
{
ADD_SCENE_NODE_DEFAULT(this, SCENE_PERSONAL_ROOM);
return;
}
}

// 需要在init中调用setKeyboardEnabled(true);或setKeypadEnabled(true);,这个回调才回执行
virtual void onKeyReleased(EventKeyboard::KeyCode keycode, Event *event) override;

Cocos中的触摸机制总结(附相关C++11基础)相关推荐

  1. 万字长文解读计算机视觉中的注意力机制(附论文和代码链接)

    文中论文和代码已经整理,如果需要,点击下方公号关注,领取,持续传达瓜货 所向披靡的张大刀 注意力机制是机器学习中嵌入的一个网络结构,主要用来学习输入数据对输出数据贡献:注意力机制在NLP和CV中均有使 ...

  2. 安卓辅助编程Android中系统触摸相关辅助类总结

    Android中系统触摸相关辅助类总结 如何自学 Android 编程 Android开发最佳学习路线图

  3. Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.单点触摸 dispatchTouchEvent onInterceptTouchEvent onTouchEvent三个方法的输入参数都是手势 ...

  4. 解析广泛应用于NLP的自注意力机制(附论文、源码)

    来源:PaperWeekly 作者:罗凌 本文共3200字,建议阅读9分钟. 本文基于深度学习的注意力(Attention)机制与你分享一些学习总结. 近年来,注意力(Attention)机制被广泛应 ...

  5. BCB中的RTTI机制

    BCB中的RTTI机制 RTTI在BCB中其实有两个意义.首先,针对一般标准的C++中所定义的,RTTI是所谓的Run-Time Type Identification的缩写.传统的程序语言中,所谓的 ...

  6. 循环神经网络RNN 2—— attention注意力机制(附代码)

    attention方法是一种注意力机制,很明显,是为了模仿人的观察和思维方式,将注意力集中到关键信息上,虽然还没有像人一样,完全忽略到不重要的信息,但是其效果毋庸置疑,本篇我们来总结注意力机制的不同方 ...

  7. 综述:计算机视觉中的注意力机制

    作者|xys430381_1 https://blog.csdn.net/xys430381_1/article/details/89323444 本文仅作学术分享,著作权归作者所有,如有侵权,请联系 ...

  8. SpringMVC框架中的异常处理机制

    目录 1. 什么是异常处理? 2. SpringMVC框架中的异常处理机制是什么? 3. SpringMVC框架汇中实现异常处理的实现步骤  4. SpringMVC框架出现异常时候的处理过程  5. ...

  9. 论文--计算机视觉中的注意力机制

    目录 引言 2022-04-09 update 2022-02-02 update 2021-12-15 update CV注意力机制资源汇总 Attention Mechanisms in Comp ...

最新文章

  1. GPU版TensorFlow怎么指定让CPU运行
  2. 附下载|Python带你实践机器学习圣经PRML
  3. 别怀疑,换了位置就该换你的脑袋(转)
  4. 最新最全的用户画像系统详解,还可免费试用哦!
  5. SSIS数据转换组件_复制转换、数据转换、行计数
  6. iframe打印excel bold_搭载君正X1000E芯片 中盈SP7080激光打印机现已开售!
  7. StatusCodeError: 400 - “{\“code\“:40000,\“error\“:\“错误 Error: 登录用户不是该小程序的开发者
  8. rhel5 下cacti安装日志
  9. VS2010大左括号置新行及代码批量格式化
  10. “强化学习说白了,是建立分布到分布之间的映射”?数学角度谈谈个人观点
  11. mysql 碎片率_为什么所有MySQL InnoDB表都碎片化了?
  12. 毕设——社区志愿者信息管理系统
  13. photoshop实现图片更换背景
  14. 数据科学分布——泊松分布
  15. 计算机错误代码0x 00000006,什么原因造成了蓝屏 电脑蓝屏错误代码介绍
  16. 为什么大龄程序员不选择自己创业?
  17. 判断样本均值:单样本T检验,双T检验(T-T检验),配对样本T检验(P-T检验)
  18. 用k-mer分析进行基因组调查:(六)用KmerGenie一步实现
  19. nginx php多域名配置文件,配置文件,nginx_nginx多站点配置,无法通过域名访问,使用ip访问会跳转到其中一个站点,配置文件,nginx - phpStudy...
  20. 写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!

热门文章

  1. BEGAN实现不同人脸的生成(tensorflow实现)
  2. 09.BEGAN(Boundary Equilibrium Generative Adversarial Networks)
  3. B-1.23 协议分析--I2C串联保护电阻和上拉电阻的选择
  4. 二叉排序树和AVL树
  5. Dubbo接口级服务发现-数据结构
  6. uNo面板L灯一直闪_鲁公讲家装:三联开关控制三个灯怎么接线,基本知识要知道...
  7. linux系统下串口设备和串口号绑定
  8. 范伟身患癌症 崔永元亲赴鞍山探望捐赠巨款
  9. 这次是真的被优化了。
  10. PIC单片机应用开发实践教程(六): 代码配置器(MCC)