博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx 3.2 事件机制
阅读量:5758 次
发布时间:2019-06-18

本文共 5027 字,大约阅读时间需要 16 分钟。

一个sprite的情况

// oneSpritevoid HelloWorld::touchableSpriteTestOne(){    Vec2 origin = Director::getInstance()->getVisibleOrigin();    Size size = Director::getInstance()->getVisibleSize();    auto sprite1 = Sprite::create("Images/CyanSquare.png");    sprite1->setPosition(160, 240);    addChild(sprite1,0,100);    // Make sprite1 touchable    auto listener1 = EventListenerTouchOneByOne::create();    listener1->setSwallowTouches(true);//设置是否想下传递触摸    listener1->onTouchBegan = [=](Touch* touch, Event* event){        auto target = static_cast
(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(0, 0, 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(180); return true; } return false; }; listener1->onTouchMoved = [](Touch* touch, Event* event){ log("%s", "onTouchMoved"); auto target = static_cast
(event->getCurrentTarget()); target->setPosition(target->getPosition() + touch->getDelta()); }; listener1->onTouchEnded = [=](Touch* touch, Event* event){ auto target = static_cast
(event->getCurrentTarget()); log("sprite onTouchesEnded.. "); target->setOpacity(255); }; //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 互相包含的情况:

// TouchableSpriteTestvoid 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
(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
(event->getCurrentTarget()); target->setPosition(target->getPosition() + touch->getDelta()); }; listener1->onTouchEnded = [=](Touch* touch, Event* event){ auto target = static_cast
(event->getCurrentTarget()); log("sprite onTouchesEnded.. "); target->setOpacity(255); }; _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite2);}

 

转载于:https://www.cnblogs.com/as3lib/p/3904477.html

你可能感兴趣的文章
一秒 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql 问题
查看>>
Android组件化最佳实践 ARetrofit原理
查看>>
舍弃浮躁, 50条重要的C++学习建议
查看>>
同步手绘板——将View的内容映射成Bitmap转图片导出
查看>>
【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!...
查看>>
微信小程序之wx.navigateback往回携带参数
查看>>
陌陌和请吃饭之类的应用,你要是能玩转,那就厉害了
查看>>
递归的运行机制简单理解
查看>>
汉字转阿斯克马值
查看>>
Java 栈与堆简介
查看>>
【supervisord】部署单进程服务的利器
查看>>
zabbix oracle监控插件orabbix部署安装
查看>>
python3 通过qq 服务器 发送邮件
查看>>
java 多线程踩过的坑
查看>>
部署Replica Sets及查看相关配置
查看>>
倒序显示数组(从右往左)
查看>>
文献综述二:UML技术在行业资源平台系统建模中的应用
查看>>
阿里云服务器 linux下载 jdk
查看>>
Swift 学习 用 swift 调用 oc
查看>>
第三章 Python 的容器: 列表、元组、字典与集合
查看>>