一个sprite的情况

// oneSprite
void HelloWorld::touchableSpriteTestOne()
{
Vec2 origin = Director::getInstance()->getVisibleOrigin();
Size size = Director::getInstance()->getVisibleSize(); auto sprite1 = Sprite::create("Images/CyanSquare.png");
sprite1->setPosition(, );
addChild(sprite1,,); // Make sprite1 touchable
auto listener1 = EventListenerTouchOneByOne::create();
listener1->setSwallowTouches(true);//设置是否想下传递触摸 listener1->onTouchBegan = [=](Touch* touch, Event* event){
auto target = static_cast<Sprite*>(event->getCurrentTarget()); log("target.x.y: %f %f tag:%d isSprite1:%d width:%f,height:%f", target->getPosition().x, target->getPosition().y,
target->getTag(), target == sprite1, target->getContentSize().width, target->getContentSize().height); Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
log("locationInNode %f %f", locationInNode.x, locationInNode.y);
Size s = target->getContentSize();
Rect rect = Rect(, , s.width, s.height);
if (rect.containsPoint(locationInNode))
{
log("sprite began... x = %f, y = %f tag:%d", locationInNode.x, locationInNode.y, target->getTag());
target->setOpacity();
return true;
}
return false;
}; listener1->onTouchMoved = [](Touch* touch, Event* event){
log("%s", "onTouchMoved");
auto target = static_cast<Sprite*>(event->getCurrentTarget());
target->setPosition(target->getPosition() + touch->getDelta());
}; listener1->onTouchEnded = [=](Touch* touch, Event* event){
auto target = static_cast<Sprite*>(event->getCurrentTarget());
log("sprite onTouchesEnded.. ");
target->setOpacity(); };
//onTouchBegan 随便点个地方都触发,onTouchMoved onTouchEnded 是点到sprite1才触发,
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1); }

1、onTouchBegan无论点哪里都触发。只有在点中了sprite1,onTouchBegan return true的时候onTouchMoved ,onTouchEnded才会触发

2、Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation()); 这个touch->getLocation是整个GL的坐标,整个屏幕相对于左下角的坐标

转换为target的本地坐标 矩形是原点为(0,0),长宽,原点是左下角,锚点是中心,addchild的时候是孩子的锚点对准自己的原点,自己的原点是左下角。
3、点击屏幕的每个地方 target都是最上层的那个target,通过转换为target的矩形范围,来判断是点击了哪个sprite.

4、

 设备是把屏幕上的点击通过坐标告诉你,所以begin必定触发

 begin返回true,表示你要处理这个点击,才会触发后面的move和end 
5、摸监听listener的创建方式有两种,一种是:EventListenerTouchOneByOne,另一种是:EventListenerTouchAllAtOnce,顾名思义,EventListenerTouchOneByOne的意思单点触摸,EventListenerTouchAllAtOnce,是多点触摸,而不需要再用设置Delegate的方式来做了。3.0触摸机制还有个不同的地方,只要是放在最上面的那个精灵,那它的触摸优先级就最高。我们用的按钮Menu 就是用这种方式设置触摸优先级的。

二:两个sprite 互相包含的情况:

// TouchableSpriteTest
void HelloWorld::touchableSpriteCont()
{
Vec2 origin = Director::getInstance()->getVisibleOrigin();
Size size = Director::getInstance()->getVisibleSize(); auto sprite2 = Sprite::create("Images/MagentaSquare.png");
sprite2->setPosition(origin + Vec2(size.width / 2, size.height / 2)); addChild(sprite2, 20, 200);
log("1sprite2.width,sprite2.height: %f %f", sprite2->getContentSize().width, sprite2->getContentSize().height);
//锚点确定精灵自己在父节点的加载位置,原点始终在左下角为0,0 addchild的时候是孩子的锚点对准 自己的原点。
//并不是你点精灵的区域才响应 是精灵所在的那一层范围都能响应
auto sprite3 = Sprite::create("Images/YellowSquare.png");
sprite3->setPosition(0, 0); sprite2->addChild(sprite3, 1, 300);
log("layer.width,layer.height: %f %f",this->getContentSize().width,this->getContentSize().height);
log("2sprite2.width,height:%f %f", sprite2->getContentSize().width, sprite2->getContentSize().height); // Make sprite1 touchable
auto listener1 = EventListenerTouchOneByOne::create();
listener1->setSwallowTouches(true); listener1->onTouchBegan = [=](Touch* touch, Event* event){
auto target = static_cast<Sprite*>(event->getCurrentTarget());
log("target.x.y: %f %f tag:%d width:%f,height:%f", target->getPosition().x, target->getPosition().y,
target->getTag(), target->getContentSize().width, target->getContentSize().height); Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
Size s = target->getContentSize();
Rect rect = Rect(0, 0, s.width, s.height);
log("locationInNode.x= %f ,y= %f,contentW= %f,contentH= %f", locationInNode.x, locationInNode.y, s.width, s.height);
if (rect.containsPoint(locationInNode))
{
log("dist began... x = %f, y = %f tag:%d", locationInNode.x, locationInNode.y, target->getTag());
target->setOpacity(180);
return true;
}
return false;
}; listener1->onTouchMoved = [](Touch* touch, Event* event){
log("%s", "onTouchMoved");
auto target = static_cast<Sprite*>(event->getCurrentTarget());
target->setPosition(target->getPosition() + touch->getDelta());
}; listener1->onTouchEnded = [=](Touch* touch, Event* event){
auto target = static_cast<Sprite*>(event->getCurrentTarget());
log("sprite onTouchesEnded.. ");
target->setOpacity(255); };
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite2);
}

cocos2dx 3.2 事件机制的更多相关文章

  1. Cocos2d-X3.0 刨根问底(七)----- 事件机制Event源码分析

    这一章,我们来分析Cocos2d-x 事件机制相关的源码, 根据Cocos2d-x的工程目录,我们可以找到所有关于事件的源码都存在放在下图所示的目录中. 从这个event_dispatcher目录中的 ...

  2. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  3. tkinter事件机制

    一.tkinter.Event tkinter的事件机制跟js是一样的,也是只有一个Event类,这个类包罗万象,集成了键盘事件,鼠标事件,包含各种参数. 不像java swing那种强类型事件,sw ...

  4. [解惑]JavaScript事件机制

    群里童鞋问到关于事件传播的一个问题:“事件捕获的时候,阻止冒泡,事件到达目标之后,还会冒泡吗?”. 初学 JS 的童鞋经常会有诸多疑问,我在很多 QQ 群也混了好几年了,耳濡目染也也收获了不少,以后会 ...

  5. Atitit  数据库的事件机制--触发器与定时任务attilax总结

    Atitit  数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...

  6. 深入浅出iOS事件机制

    原文地址: http://zhoon.github.io/ios/2015/04/12/ios-event.html 本文章将讲解有关iOS事件的传递机制,如有错误或者不同的见解,欢迎留言指出. iO ...

  7. Java 事件机制

    java事件机制包括三个部分:事件.事件监听器.事件源. 1.事件.一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息,用于listener的相应的方法之中,作 ...

  8. Angular $scope和$rootScope事件机制之$emit、$broadcast和$on

    Angular按照发布/订阅模式设计了其事件系统,使用时需要“发布”事件,并在适当的位置“订阅”或“退订”事件,就像邮箱里面大量的订阅邮件一样,当我们不需要时就可以将其退订了.具体到开发中,对应着$s ...

  9. JavaScript 详说事件机制之冒泡、捕获、传播、委托

    DOM事件流(event  flow )存在三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段. 事件捕获(event  capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会 ...

随机推荐

  1. 对Spring Bean了解一二

    这之前从未听说过Spring Bean,今天因为学习的<Java核心36讲>其中一篇涉及到了这个内容,因自己基础薄弱,杨晓峰老师讲的内容需要一定的基础才能看懂,故在网上搜罗一些我能理解的关 ...

  2. javascript数组总结

    数组是一个有序的集合,javascript数组中的元素的类型可以是任意的,同一个数组不同元素之间的类型也是可以不同的.数组也是对象,有个length属性,记录数组的长度. 创建数组有两种方法: 数组直 ...

  3. 从e.getMessage()为null看Java异常机制

    问题:自定义异常触发了,但是自定义的提示信息RuntimeException却没有带过来. throw new RuntimeException("不允许插入报价主项和报价子项同时重复的记录 ...

  4. nodejs 8 利用原生 util.promisify() 实现 promise.delay()

    Nodejs 8 在 util 包里新增了 promisify() .这个方法基本和 bluebird 的 promisify() 作用一样,即把最后一个参数是 callback 函数的函数变成返回 ...

  5. VC/MFC 编程技巧大总结

    1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐 ...

  6. Ubuntu 16.04+1080Ti机器学习基本环境配置【转】

    本文转载自:https://blog.csdn.net/MahoneSun/article/details/80808930 一.设置网络 机器有两张网卡,将当前正在使用的“有线连接1”配置为以下的设 ...

  7. 数据库常见的三种join方式

    数据库常见的join方式有三种:inner join, left outter join, right outter join(还有一种full join,因不常用,本文不讨论).这三种连接方式都是将 ...

  8. zabbix中监控某个进程的shell脚本

    #!/bin/sh ret_ok= ret_warn= ret_critical= ret_unknown= info_count=`ps -aux | awk 'BEGIN {cnt=0} /[^- ...

  9. tfn2k工具使用介绍

    主要介绍tfn2k(Linux),因为它最著名嘛!主要分为使用说明 然后在说安装所以有点长 (注意:有的人拿VPS来做DDOS·问题是有的人发现了会关闭你VPS的·除非你认识他或者你自己有服务器而不是 ...

  10. jmeter 网速

    有人知道在jmeter 哪个里面哦 JMeterPlugins里面 network