COCOS2DX事件交互处理

一、单点触摸

关于单点触摸事件的创建和监听有以下几个步骤:

1,创建一个空间如labelTTF,并且初始化,添加控件进层

2、设置一个事件监听器,并且定义和实现他的回调函数。

3、最后让导演将前面定义的监听器按照监听器和监听事件对应的方式添加进来。

<span style="font-size:18px;"> Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
	auto label = LabelTTF::create("click me", "宋体", 36);
	addChild(label);
	label->setPosition(visibleSize.width/2, visibleSize.height/2);
	auto *listener = EventListenerTouchOneByOne::create();
	listener->onTouchBegan = [](Touch* t, Event* e){

		log("ontouchbegan");
		return false;
	};
	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);</span>

二、触摸目标的判断

在实现触摸事件的时候,我们常常会要求只有点击到特定的区域才会出现相应。这就需要你再代码 中进行判断,你触摸的那一点是不是在触摸目标的范围内。

在触摸事件中,监听器Lintener给label事件指定了一个触摸后的回调函数,这个回调函数里面有一个参数是e,类型是event,利用e->getcurrenttarget()函数就可以获取到我们的触摸目标,就是label,之后通过getBoundingBox()方法获取这个触摸目标的边界。最后判断一下它是否包含我们的触摸点。

containsPoint(t->getLocation())

t->getLocation()显示的就是获取我们触摸点的位置。而且,要注意的一件事就是,如果你是用labelttf来创建的label空间,那么获取的点的左边很可能是错误的。所以用label::create();这个函数来创建。这时cocos的一个Bug把。

<span style="font-size:18px;">auto label = Label::create("click me", "宋体", 36);
	addChild(label);
	label->setPosition(visibleSize.width/2, visibleSize.height/2);
	auto *listener = EventListenerTouchOneByOne::create();
	listener->onTouchBegan = [](Touch* t, Event* e){

		if(e->getCurrentTarget()->getBoundingBox().containsPoint(t->getLocation()))
		{
			log("ontouchbegan");
		}
		return false;
	};</span>

三、事件传递

事件的传递机制说白了,就是你在游戏中触发的事件是由顺序的。

一般来说事件有以下几种

<span style="font-size:18px;">    std::function<bool(Touch*, Event*)> onTouchBegan;
    std::function<void(Touch*, Event*)> onTouchMoved;
    std::function<void(Touch*, Event*)> onTouchEnded;
    std::function<void(Touch*, Event*)> onTouchCancelled;
    </span>

从字面意思上我们基本 就能确定这些个 事件能够做什么。但是仔细 观察可以发现,几个事件的函数只有一个比较特殊就是onTouchBegan。它要求返回值是Bool类型。也就是说,所以的事件,Ontouchbegan这个事件应该先执行,因为你一定要先按下你的鼠标,才去执行拖动,弹起,取消等动作,假如我现在有以下代码:

<span style="font-size:18px;">	listener->onTouchBegan = [](Touch* t, Event* e){

		if(e->getCurrentTarget()->getBoundingBox().containsPoint(t->getLocation()))
		{
			log("ontouchbegan");
		}
		return false;
	};

	listener->onTouchMoved = [](Touch *t, Event* e)
	{
		log("ontouchmoved");
	};</span>

如果onTouchBegan在函数中返回值是false,那么它将不会触发以后所设定的事件,但是如果设定为true,就表明可以继续除法之后的事件。

四、监听物理按键事件

手机上面的每一个物理按键和电脑上面的一样都是有一个整数值代表他们。

首先就是创建一个专门用来监听物理按键事件的监听器:

auto listener = EventListenerKeyboard::create();

然后通过指定onKeyReleased函数,并且将创建的监听器加入到导演的管理。在真机上调试的时候就可以看到,每次按一个键,相应的键的数值都会显现出来。

	auto listener = EventListenerKeyboard::create();
	listener->onKeyReleased = [](EventKeyboard::KeyCode code, Event* e){

		log("key code %d", code);               //显示按键数值
		switch(code)
		{
		case EventKeyboard::KeyCode::KEY_ESCAPE:	//通过switch语句让不同的按键执行不同的 动作
			Director::getInstance()->end();
			break;
		default:
			break;
		}
	};

	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

COCOS2DX事件交互处理

时间: 2024-10-24 08:25:29

COCOS2DX事件交互处理的相关文章

cocos2dX 事件之触摸事件和触摸事件集合

今天, 我们来学习cocos2dX里面的触摸事件与触摸事件合集, 现在的手机游戏交互基本上都是通过触摸交互的, 所以大家明白这节的重要性了吧, 本节篇幅比较大, 所以我就不扯闲话了 先来看看常用函数: 触摸事件: addTargeteDelegate( 谁使用, 优先级, 是否拦截触摸消息); //注册单点触摸 virtual bool ccTouchBegan(CCTouch * touch,CCEvent * event); //触摸开始 virtual void ccTouchMoved(

HTML5 Canvas ( 事件交互, 点击事件为例 ) isPointInPath

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>canvas</title> <script type="text/javascript" src="../js/jQuery.js"></script> <style type="text/css">

NodeJs 开发微信公众号(三)微信事件交互

微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么样与微信交互的.这些功能的入口就是你在测试公众号里面填写的URL(以下用/login/wechat代替). 事件交互 扫码关注微信公众号后,微信会调用你的接口/login/wechat,并且附带一段xml信息,首先你需要获取一些签名,通过加密.排序比对是否与你填写的TOKEN一致,如果一致则进行xm

HTML5 Canvas ( 事件交互, 点击事件为例 ) isPointInPath(转)

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>canvas</title> <script type="text/javascript" src="../js/jQuery.js"></script> <style type="text/css">

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

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

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

cocos2d-x 3.0 出来已经好久了,也已经用3.0写了几个小游戏,感觉3.0的事件触发机制太赞了,随这里总结一下,也算是对知识的一种回忆和加深理解. 3.0的事件分发机制中,需要也仅仅需要通过创建一个事件监听器来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有的事件监听器由这个分发器统一管理,即可完成事件响应. 事件监听器有以下几种: 1.EventListenerTouch(触摸事件) 2.EventListenerKeyboard(键盘响应事件) 3.

Cocos2d-x事件监听机制

由于没有涉及到需要自定义监听事件以及暂时没有监听移动设备加速计的需求,所以暂时没有测试 1.监听触摸屏幕的事件 2.监听键盘事件 3.监听鼠标事件 4.用户自定义事件(实际上是将时间分发器当成消息中心发布消息触发响应事件,似乎模拟了观察者模式) 5.加速计事件 这个事件大致看了一下,使用方法很简单,但是在PC上看不到结果,可是很幸运的没有直接崩溃: 所有代码如下: 1 #include "TouchScene.h" 2 #include <string> 3 4 USING

【Cocos2d入门教程六】Cocos2d-x事件篇之触摸

Cocos游戏当中产生一个事件时,可以有多个对象在监听该事件,所以有优先级(Priority).优先级越高(Priority值越小),事件响应越靠前. 关系图: 新 事件分发机制:在2.x 版本事件处理时,将要触发的事件交给代理(delegate)处理,再通过实现代理里面的onTouchBegan等方法接收事件,最后完成事件的响应. 而在新的事件分发机制(3.x)中,只需通过创建一个事件监听器-用来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所 有事件监听器由这个

移动端“事件交互篇-远程实战开发课程”

1-移动端event相关问题2-touchEvent和滑屏3-滑屏的幻灯片(一)4-滑屏的幻灯片(二)5-移动端适配6-移动端布局注意事项7-音悦台布局8-显示隐藏的菜单和缓冲导航9-导航的缓冲和回弹动画10-滑屏选项卡上11-滑动选项卡12-3D(上)13-3D(下)14-百分比布局15-3d桌面切换16-touchEvent和transition的相关问题17-自定义滚动条18-相册(一)19-相册(二)20-相册(三)21-相册(四)22-相册(五) 原文地址:http://blog.51