cocos2dx 3.2 事件机制
一个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、
二:两个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 事件机制的更多相关文章
- Cocos2d-X3.0 刨根问底(七)----- 事件机制Event源码分析
这一章,我们来分析Cocos2d-x 事件机制相关的源码, 根据Cocos2d-x的工程目录,我们可以找到所有关于事件的源码都存在放在下图所示的目录中. 从这个event_dispatcher目录中的 ...
- 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...
- tkinter事件机制
一.tkinter.Event tkinter的事件机制跟js是一样的,也是只有一个Event类,这个类包罗万象,集成了键盘事件,鼠标事件,包含各种参数. 不像java swing那种强类型事件,sw ...
- [解惑]JavaScript事件机制
群里童鞋问到关于事件传播的一个问题:“事件捕获的时候,阻止冒泡,事件到达目标之后,还会冒泡吗?”. 初学 JS 的童鞋经常会有诸多疑问,我在很多 QQ 群也混了好几年了,耳濡目染也也收获了不少,以后会 ...
- Atitit 数据库的事件机制--触发器与定时任务attilax总结
Atitit 数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...
- 深入浅出iOS事件机制
原文地址: http://zhoon.github.io/ios/2015/04/12/ios-event.html 本文章将讲解有关iOS事件的传递机制,如有错误或者不同的见解,欢迎留言指出. iO ...
- Java 事件机制
java事件机制包括三个部分:事件.事件监听器.事件源. 1.事件.一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息,用于listener的相应的方法之中,作 ...
- Angular $scope和$rootScope事件机制之$emit、$broadcast和$on
Angular按照发布/订阅模式设计了其事件系统,使用时需要“发布”事件,并在适当的位置“订阅”或“退订”事件,就像邮箱里面大量的订阅邮件一样,当我们不需要时就可以将其退订了.具体到开发中,对应着$s ...
- JavaScript 详说事件机制之冒泡、捕获、传播、委托
DOM事件流(event flow )存在三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段. 事件捕获(event capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会 ...
随机推荐
- 对Spring Bean了解一二
这之前从未听说过Spring Bean,今天因为学习的<Java核心36讲>其中一篇涉及到了这个内容,因自己基础薄弱,杨晓峰老师讲的内容需要一定的基础才能看懂,故在网上搜罗一些我能理解的关 ...
- javascript数组总结
数组是一个有序的集合,javascript数组中的元素的类型可以是任意的,同一个数组不同元素之间的类型也是可以不同的.数组也是对象,有个length属性,记录数组的长度. 创建数组有两种方法: 数组直 ...
- 从e.getMessage()为null看Java异常机制
问题:自定义异常触发了,但是自定义的提示信息RuntimeException却没有带过来. throw new RuntimeException("不允许插入报价主项和报价子项同时重复的记录 ...
- nodejs 8 利用原生 util.promisify() 实现 promise.delay()
Nodejs 8 在 util 包里新增了 promisify() .这个方法基本和 bluebird 的 promisify() 作用一样,即把最后一个参数是 callback 函数的函数变成返回 ...
- VC/MFC 编程技巧大总结
1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐 ...
- Ubuntu 16.04+1080Ti机器学习基本环境配置【转】
本文转载自:https://blog.csdn.net/MahoneSun/article/details/80808930 一.设置网络 机器有两张网卡,将当前正在使用的“有线连接1”配置为以下的设 ...
- 数据库常见的三种join方式
数据库常见的join方式有三种:inner join, left outter join, right outter join(还有一种full join,因不常用,本文不讨论).这三种连接方式都是将 ...
- zabbix中监控某个进程的shell脚本
#!/bin/sh ret_ok= ret_warn= ret_critical= ret_unknown= info_count=`ps -aux | awk 'BEGIN {cnt=0} /[^- ...
- tfn2k工具使用介绍
主要介绍tfn2k(Linux),因为它最著名嘛!主要分为使用说明 然后在说安装所以有点长 (注意:有的人拿VPS来做DDOS·问题是有的人发现了会关闭你VPS的·除非你认识他或者你自己有服务器而不是 ...
- jmeter 网速
有人知道在jmeter 哪个里面哦 JMeterPlugins里面 network