cocos2d-x 事件分发机制 ——触摸事件监听

cocos2d-x 3.0 出来已经好久了,也已经用3.0写了几个小游戏,感觉3.0的事件触发机制太赞了,随这里总结一下,也算是对知识的一种回忆和加深理解。

3.0的事件分发机制中,需要也仅仅需要通过创建一个事件监听器来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有的事件监听器由这个分发器统一管理,即可完成事件响应。

事件监听器有以下几种:

1、EventListenerTouch(触摸事件)

2、EventListenerKeyboard(键盘响应事件)

3、EventListenerMouse(鼠标响应事件)

4、EventListenerAcceleration(加速记录事件)

5、EventListenerCustom(自定义事件)

_eventDispatcher的工作由三部分组成:

1、事件分发器EventDispatcher

2、事件类型EventTouch,EventKeyboard,等

3、事件监听器(上面列举的五种)

监听器实现各种触发后的逻辑,事件分发器来分发所有注册的事件,然后调用响应的类型监听器来响应事件。

这篇来讲一下游戏中用的最多的触摸事件监听EventListenerTouch

3.0中的触摸监听变得非常简单,只需要注册响应的事件监听器,给事件监听器的各个响应函数赋予响应的回调函数,最后将实现的事件监听器注册到事件分发器_eventDispatcher中,实现各个回调函数的逻辑功能即可。

第一步:穿件事件监听器,并注册到时间分发器中,这一步最好在onEnter()函数中实现。

//触摸响应注册
auto touchListener = EventListenerTouchOneByOne::create();//创建单点触摸事件监听器
touchListener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan,this);//触摸开始
touchListener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved,this);//触摸移动
touchListener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded,this);//触摸结束
_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,this;//注册分发器

第二步:实现上述监听器中的三个回调函数

bool GameLayer::onTouchBegan(Touch* touch, Event* event) {
	//实现自己的逻辑代码
	return true;
}

void GameLayer::onTouchMoved(Touch* touch, Event* event) {
	//实现自己的逻辑代码
}

void GameLayer::onTouchEnded(Touch* touch, Event* event) {
//实现自己的逻辑代码
}

onTouchBegan()函数中返回true,则响应事件不会向下层传递,只会响应本层中的Began、Moved、Ended三个函数,如果返回false,则本层后续的Moved、Ended函数不会被触发,但是事件会向下层传递。

同时可以在注册响应事件时,用

touchListener->setSwallowTouches(true);//不向下传递触摸

来设置是否向下传递触摸事件。

_eventDispatcher是Node的属性,通过它管理当前节点(场景、层、精灵等)的所有事件的分发。它本身是一个单例模式的引用,在Node的构造函数中,通过Director::getInstance()->getEventDispatcher();获取。

当一个事件监听器需要重复利用时,需要用clone()方法创建一个新的克隆,因为在使用addEventListenerWithSceneGraphPriorith或者addEventListenerWithFixedPriority方法进行注册时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。另外,再使用FixedPriority listeners时,添加完之后需要手动remove,SceneGraphyPriority listener和Node绑定,在Node的析构函数中会被移除。

移除一个已注册的监听器用

_eventDispatcher->removeEventListener(listener);

也可以直接调用removeAllListeners函数,但是不建议这么做,这样做之后所有的事件监听器都不再响应。

好了,这篇主要讲了事件触摸机制,在下一篇中讲一下加速计事件。

时间: 2024-10-26 19:55:49

cocos2d-x 事件分发机制 ——触摸事件监听的相关文章

Android事件分发机制——Touch事件

1. 简介 先来看一个表: Touch事件相关方法 功能 Activity ViewGroup View public boolean dispatchTouchEvent(MotionEvent ev) 事件分发 Yes Yes Yes public boolean onInterceptTouchEvent(MotionEvent ev) 事件拦截 No Yes No public boolean onTouchEvent(MotionEvent ev) 事件响应 Yes Yes Yes 从

cocos2d-x 事件分发机制 ——加速计事件监听

加速计事件监听机制 在上一篇中介绍了cocos2d-x中的触摸事件机制,这篇来介绍下游戏中也经常用到的加速计事件,这些都是游戏中的经常要用到的. 移动设备上一个很重要的输入源是设备的方向,大多数设备都配备了加速计,用于测量设备静止或匀速运动时所受到的重力方向. 重力感应来自移动设备的加速计,通常支持X.Y和Z三个方向的加速度感应,又称为三向加速计.实际应用中,可以根据三个方向的力度大小来计算手机倾斜的角度和方向. 3.0机制中,我们只需要创建一个加速计监听器EventListenerAccele

事件分发机制和事件传递机制

1. 触屏事件先传递给父容器的onInterceptTouchEvent方法(注:非容器没有onInterceptTouchEvent方法)return true,事件被消费,此次事件与子控件无关,onInterceptTouchEvent会陆续接收到ACTION_MOVE,ACTION_UP事件return false,事件优先传递给子控件处理 2. 子控件onTouchEvent接收到ACTION_DOWN事件,return true 子控件消费事件,事件不向上回传,onTouchEvent

Cocos2d-X 3.x 事件分发机制详解

事件分发机制 新事件分发机制:在2.x 版本事件处理时,将要触发的事件交给代理(delegate)处理,再通过实现代理里面的onTouchBegan等方法接收事件,最后完成事件的响应.而在新的事件分发机制中,只需通过创建一个事件监听器-用来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有事件监听器由这个分发器统一管理,即可完成事件响应.请参考更多3.0资料... 事件监听器有以下几种: 触摸事件 (EventListenerTouch) 键盘响应事件 (Event

【转】事件分发机制

事件分发机制 新事件分发机制:在2.x 版本事件处理时,将要触发的事件交给代理(delegate)处理,再通过实现代理里面的onTouchBegan等方法接收事件,最后完成事件的响应.而在新的事件分发机制中,只需通过创建一个事件监听器-用来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理,即可完成事件响应. 事件监听器有以下几种: 触摸事件 (EventListenerTouch) 键盘响应事件 (EventListenerKeybo

Cocos2d-X研究之v3.x 事件分发机制详解

事件分发机制 新事件分发机制:在2.x 版本事件处理时,将要触发的事件交给代理(delegate)处理,再通过实现代理里面的onTouchBegan等方法接收事件,最后完成事件的响应.而在新的事件分发机制中,只需通过创建一个事件监听器-用来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有事件监听器由这个分发器统一管理,即可完成事件响应.请参考更多3.0资料... 事件监听器有以下几种: 触摸事件 (EventListenerTouch) 键盘响应事件 (Event

【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是吃鸡,唉!真是罪过罪过.希望能从这篇博客开始有些改善吧,尽量少玩耍,还是多学习吧~ 好了扯得有点远了,来说说我们今天博客的主题——“用C#和Lua实现Unity中的事件分发机制”,事件分发机制或者叫事件监听派发系统,在每个游戏框架中都是不可或缺的一个模块.我们可以用它来解耦,监听网络消息,或者做一些

浅谈Android 事件分发机制(一)

在上一篇文章中,浅谈Android 事件分发机制(一),简要分析了一下事件分发机制的原理,总结一下就是事件层层传递,直到被消费,原理看似简单,但是在实际使用过程中,场景各不相同,复杂程度也就因产品而异,这篇文章就通过给view加移动来模拟事件分发. 触摸事件 这里涉及到几个与手指触摸相关的常见事件: 坐标系对于单指触控移动来说,一次简单的交互流程是这样的:手指落下(ACTION_DOWN) -> 移动(ACTION_MOVE) -> 离开(ACTION_UP) 坐标系 Android坐标系以手

Android6.0触摸事件分发机制解读

本篇博文是Android触摸事件分发机制系列博文的第一篇,带领大家从全局掌握Android触摸事件分发机制.特别声明的是,本源码解读是基于最新的Android6.0版本. (一)Android6.0源码解读之View点击事件分发机制 (二)Android6.0源码解读之ViewGroup点击事件分发机制 (三)Android6.0源码解读之Activity点击事件分发机制 为什么要解读触摸事件分发机制 1.掌握View事件分发机制 2.为解决View滑动冲突提供理论支持 3.了解Android最