Layer类的一个重要作用就是接受输入事件,它封装了触摸输入的处理接口。一般情况下,我们可以通过setTouchEnabled方法来开启或关闭接收触摸输入。事实上并不是只有Layer才支持接收触摸事件,任何一个游戏元素都可以接收事件,只不过Layer提供了现成的支持。

我们只需通过创建一个事件监听器用来实现各种触发后的逻辑,然后添加到事件分发器_eventdispatcher中,所有事件监听器由这个分发器统一管理,即可完成事件响应。

为一个精灵添加触摸事件的四个步骤
1.创建一个精灵
2.创建一个事件监听器(单点触摸或多点触摸)
3.实现各种触发后的逻辑(onTouchBegan,onTouchMoved,onTouchEnded等)
4.将事件监听器添加到事件分发器中

// 1.首先添加一个精灵元素
bool GameScene::init()
{
	sprite = Sprite::create();
	sprite->setPosition(100,100);
	this->addChild(sprite);
}

void GameScene::addTouchEvent()
{
	// 2.创建一个单点触摸监听器
	auto touchListener = EventListenerTouchOneByOne::create();

	// 3.实现触摸后的逻辑处理,使用lambda表达式实现触摸事件处理的回调函数
	// 触摸开始
	touchListener->onTouchBegan = [](Touch *touch,Event *event)
	{
		// 获取点击的openGL坐标
		auto touchPos = touch->getLocation();

		// 获取触摸事件的相关目标,即玩家飞机
		auto target = static_cast<Sprite *>(event->getCurrentTarget());

		// 获取飞机所在区域
		auto playerPos = target->getPosition();
		auto playerSize = target->getContentSize();
		auto rect = Rect(playerPos.x - playerSize.width/2,playerPos.y - playerSize.height/2,playerSize.width,playerSize.height);

		if(rect.containsPoint(touchPos))
		{
			return true;
		}

		// 返回false会导致后面的onTouchMoved和onTouchEnded不会执行
		return false;
	};

	// 滑动
	touchListener->onTouchMoved = [](Touch *touch,Event *event)
	{
		auto touchPos = touch->getLocation();

		auto target = static_cast<Sprite *>(event->getCurrentTarget());

		target->setPosition(touchPos);
	};

	// 触摸结束
	touchListener->onTouchEnded = [](Touch *touch,Event *event)
	{
		log("touch end");
	};

	/*
	  4.最后将事件监听器添加到事件分发器_eventdispatcher中 _eventdispatcher是Node的属性,通过它管理当前节点(场景、层、精灵等)的所有事件的分发。但它本身是一个单例模式值的引用,在Node的构造函数中,通过Director::getInstance()->getEventdispatcher(); 获取,有了这个属性,就能方便的处理事件。
	*/
	// _eventdispatcher = Director::getInstance()->getEventdispatcher();
	_eventdispatcher->addEventListenerWithSceneGraPHPriority(touchListener,sprite);
	// 为第二个精灵添加触摸监听_eventdispatcher->addEventListenerWithSceneGraPHPriority(touchListener->clone(),sprite2);
}
 
 当再次使用touchListener 的时候,需要使用clone()方法创建一个新的克隆,因为在使用addEventListenerWithSceneGraPHPriority或者addEventListenerWithFixedPriority方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraPHPriority listener是跟Node绑定的,在Node的析构函数中会被移除。具体的示例用法可以参考引擎自带的tests。 


我们可以通过以下方法移除一个已经被添加了的监听器。
_eventdispatcher->removeEventListener(touchListener);

也可以使用如下方法,移除当前事件分发器中所有监听器。
_eventdispatcher->removeAllEventListeners();
当使用removeAll的时候,此节点的所有的监听将被移除,推荐使用指定删除的方式。removeAll之后菜单也不能响应。因为它也需要接受触摸事件。

参考
事件分发机制
http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/event-dispatcher/zh.md

cocos2d-x 3.x之触摸事件的更多相关文章

  1. ios – 链接点击监听器上的WKWebView?

    在WKWebView类中是否存在类似onLinkClickListener的东西?我试着谷歌搜索但没有发现任何东西,我也发现了一些关于simillar类型的stackoverflow的未解答的问题.我需要一个linkClickListener的原因是,当我点击链接并且页面尚未加载时,它不会加载网站.当页面加载了监听器时,我也可以创建一个花哨的加载屏幕.解决方法你可以这样做将WKNavigation

  2. 多个监听器用于委托iOS

    我有一个带有代理didSelectString的类搜索栏.我有一个实现委托的A类和一个实现委托的B类.但是只有来自A类的代理才被执行.代表可以有多个监听器吗?并且如何实现这一点解决方法该委托是单一消息传递协议.如果要发送更改的多个对象,则需要使用NSNotifications.您可以使用通知中心传递对象,如下所示:想要收听通知时并设置选择器

  3. swift中提供属性监听器,可以监听属性的改变

  4. [swift]-属性监听器

    1:swift中监听属性的变化是通过属性监听器来监听OC中监听属性变化是通过set方法来监听属性变化2:代码演示意见反馈邮件:1415429879@qq.com欢迎你们的阅读和赞赏、谢谢!

  5. Swift - 属性监听器

    属性监听器介绍:属性监听器,监听属性的值改变,就像按钮的点击事件一样来监听其他的值改变举例:监听scrollView的contentOffset属性的改变

  6. android – 使用回调/监听器链接RxJava observable

    这是我到目前为止:解决方法调整clemp6r的解决方案,这是另一个既不需要主题也不需要嵌套订阅的解决方案:一般来说,我认为总是可以使用Observable.create()在Observable中包装任何基于回调的异步操作.

  7. Android – 可靠地获取当前位置

    错了,因为如果用户的位置已经稳定,那么我的听众永远不会被调用,因为位置没有改变.但GPS将一直运行,直到我的听众被移除,耗尽电池……获取当前位置的正确方法是什么,而不会误认为当前位置的旧位置?我不介意等几分钟.编辑:有可能我错误的是没有被叫的听众,它可能只需要比我想象的要长一点……

  8. android – 如何在片段打开的自定义对话框中保留监听器?

    我遇到了一些障碍.我的场景非常类似于DialogFragment–retaininglistenerafterscreenrotation所描述的场景建议的解决方案适用于作者,因为他的对话框是从活动中调用的.我的情况完全相同,但我的自定义对话框是从片段而不是活动调用的.(IEActivity->Fragment->Dialog)我实现了相同的解决方案(从调用Fragment设置onResume中的

  9. android如何停止gps

    通过以下代码启动监听器后工作正常.一段时间后,我通过以下代码停止监听器但问题是它仍在搜索我的gps任何解决方案???

  10. ViewPager的Android事件监听器数据绑定

    是否可以使用Android绑定功能将setonPagechangelistener的处理程序绑定到XML文件中的ViewPager?演示显示onClick事件,但我很好奇我可以用它实现多少事件功能.关于数据绑定功能的任何链接也都很棒.谢谢.假设的例子:example_activity.xmlHandler.java编译错误是:错误:(62)在’android’包中找不到属性’onPagechang

随机推荐

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

返回
顶部