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

FROM:http://blog.youkuaiyun.com/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] view plaincopy

  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] view plaincopy

  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);
}