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

这篇博客总结了Cocos2d-x 2.x引擎中的触摸机制,探讨了如何处理用户操作分发,并提及加速度计的委托对象特性。同时,内容还涉及C++11的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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单点触屏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值