博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2d-x Touch触屏事件
阅读量:6349 次
发布时间:2019-06-22

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

说明:这篇文章引用过来,主要提供给对这部分内容不太熟悉的学员参考。

FROM:http://blog.csdn.net/h1023417614/article/details/20390153


单点触控

前提是继承CCLayer 

1. OnEnter或init中添加开启触屏接收属性:

setTouchEnabled(true);

2. 重载

virtual void registerWithTouchDispatcher(void);

并添加: /* 注册触屏事件 */

CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,0, true)

3. 重载需要的响应函数

ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);  

ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

 

下面看一个例子:

新建HelloWorld, AppDelegate.cpp的applicationDidFinishLaunching注释掉原有HelloWorld的,添加CCScene *pScene = GameScene::scene();

为工程添加新类GameScene.定义如下:

[cpp] 

  1. #pragma once  

  2. #include "cocos2d.h"  

  3.   

  4. using namespace cocos2d;  

  5.   

  6. class GameScene :  

  7.     public CCLayerColor  

  8. {  

  9. public:  

  10.     static cocos2d::CCScene* scene();  

  11. public:  

  12.     virtual bool init();  

  13.   

  14.     virtual bool ccTouchBegan(CCTouch *pTouches, CCEvent *pEvent);  ///重载 

  15.     virtual void ccTouchMoved(CCTouch *pTouches, CCEvent *pEvent);  ///重载 

  16.     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);  ///重载 

  17.     virtual void registerWithTouchDispatcher(); ///重载 

  18.   

  19.     void menuCloseCallback(CCObject* pSender);  

  20.     CREATE_FUNC(GameScene);  

  21.   

  22.     void updateSize(CCPoint p);  

  23. };  

 

[cpp] 

  1. #include "GameScene.h"  

  2. #include "HelloWorldScene.h"  

  3.   

  4. using namespace cocos2d;  

  5.   

  6. CCScene* GameScene::scene()  

  7. {  

  8.     CCScene* scene = CCScene::create();  

  9.     GameScene *gameScene = GameScene::create();  

  10.     scene->addChild(gameScene);  

  11.     return scene;  

  12. }  

  13.   

  14. bool GameScene::init()  

  15. {  

  16.     CCLayerColor::init();  

  17.   

  18.     CCSize size = CCDirector::sharedDirector()->getWinSize();  

  19.   

  20.     setTouchEnabled(true);  //添加开启触屏接收属性:

  21.   

  22.     CCLayerColor *colorRect = CCLayerColor::create(ccc4(255, 255, 0, 255), 200.0, 200.0);  

  23.   

  24.     colorRect->setPosition(ccp(size.width/2, size.height/2));  

  25.     colorRect->ignoreAnchorPointForPosition(false);  

  26.     addChild(colorRect, 0, 1);  

  27.   

  28.     CCActionInterval *colorAction = CCRepeatForever::create((CCActionInterval *)CCSequence::create(  

  29.         CCTintTo::create(0.2f, 255, 0, 0),  

  30.         CCTintTo::create(0.2f, 0, 255, 0),  

  31.         CCTintTo::create(0.2f, 0, 0, 255),  

  32.         CCTintTo::create(0.2f, 0, 255, 255),  

  33.         CCTintTo::create(0.2f, 255, 255, 0),  

  34.         CCTintTo::create(0.2f, 255, 0, 255),  

  35.         CCTintTo::create(0.2f, 255, 255, 255),  

  36.         NULL));  

  37.   

  38.     colorRect->runAction(colorAction);  

  39.   

  40.     return true;  

  41. }  

  42.   

  43. bool GameScene::ccTouchBegan(CCTouch *pTouches, CCEvent *pEvent)  /

  44. {  

  45.     CCPoint point = pTouches->getLocation();  

  46.     updateSize(point);  

  47.     return true;  

  48. }  

  49.   

  50.   

  51. void GameScene::ccTouchMoved(CCTouch *pTouches, CCEvent *pEvent)  /

  52. {  

  53.     CCPoint point = pTouches->getLocation();  

  54.     updateSize(point);  

  55. }  

  56.   

  57. void GameScene::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)  //

  58. {  

  59.     CCPoint point = pTouch->getLocation();  

  60.     updateSize(point);  

  61. }  

  62.   

  63. void GameScene::updateSize(CCPoint p)  

  64. {  

  65.     CCSize size = CCDirector::sharedDirector()->getWinSize();  

  66.     CCSize newSize = CCSizeMake( fabs(p.x-size.width/2)*2, fabs(p.y-size.height/2)*2 );  

  67.     CCLayerColor *layer = (CCLayerColor*)getChildByTag(1);  

  68.     layer->setContentSize(newSize);  

  69. }  

  70.   

  71. void GameScene::registerWithTouchDispatcher()  /// /* 注册触屏事件 */

  72. {  

  73.     CCDirector* pDirector = CCDirector::sharedDirector();  

  74.     pDirector->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority + 1, true);  

  75. }  

运行点击屏幕,拖动屏幕可看到效果。

 

CCDirector的addTargetedDelegate的作用是在Dispatcher的列表中注册一个触屏事件的委托,用来监听用户的触屏事件。

参数分别为:触屏世家你委托CCTouchDelegate目标,优先级(值越高越早被响应),是否拦截触屏事件(true表示拦截触屏事件,即响应响应本次事件委托后,不再继续分发触屏事件到Dispatcher列表的中其他委托)。

多点触控

多点触控与单点触控类似,只不过是在触控的一串输入中,遍历这一串经行处理,在TestCpp的例子中有一个专门的例子MutiTouchTest

所用到的函数有:

ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)

ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)

ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)

ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent)

void MutiTouchTestLayer::registerWithTouchDispatcher(void)

{
    CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, 0);
}

你可能感兴趣的文章
SQL注入测试工具:Pangolin(穿山甲)
查看>>
在html 的img属性里只显示图片的部分区域(矩形,给出开始点和结束点),其他部份不显示,也不要拉伸...
查看>>
程序员第二定律:量化管理在程序员身上永无可能
查看>>
ubuntu一些脚本的执行顺序
查看>>
类继承的结构
查看>>
Intel 被 ARM 逼急了
查看>>
testng + reportng 测试结果邮件发送
查看>>
神操作:如何将Vim变成一个R语言IDE
查看>>
百度亮相iDASH,推动隐私保护在人类基因组分析领域的应用
查看>>
比特币暴涨拉升至1w美元以上,说比特币崩盘的专家要失望了
查看>>
Python「八宗罪」
查看>>
你的隐私还安全吗?社交网络中浏览历史的去匿名化
查看>>
NeurIPS 2018|如何用循环关系网络解决数独类关系推理任务?
查看>>
Windows 10 份额突破 40%,Windows 7 连跌四月终回升
查看>>
怎么把Maven项目转为动态Web项目?
查看>>
Arm发布Cortex-A76AE自动驾驶芯片架构,宣示车载系统市场主权
查看>>
FreeBSD ports中make可带有的参数(转)
查看>>
Hibernate入门教程
查看>>
Java支付宝扫码支付[新]
查看>>
SpringMVC 拦截器 筛选
查看>>