Cocos2d-x2.0 之 ClickAndMoveTest “谈不上深入”的分析.


 

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier]

红孩儿Cocos2d-X学习园地QQ2群:44208467加群写:Cocos2d-x 
红孩儿Cocos2d-X学习园地QQ群:249941957 [暂满]加群写:Cocos2d-x

本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议!

另请转载者注明转载地址及作者。

Cocos2d-x2.0 之 ClickAndMoveTest “谈不上深入”的分析.

另:本章所用Cocos2d-x版本为:

cocos2d-2.0-x-2.0.2@ Aug 30 2012

http://cn.cocos2d-x.org/download


        大家好,经过前一阶段复杂的,长篇大论的动画部分的讲解,我们对于Cocos2d-x的基本结构有了一个大概的认识,也更加增强了我们继续将Cocos2d-x的示例学习完的信心,我们今天轻松一下,来学习一下ClickAndMoveTest这个例子。因为这个示例代码较短,谈不上深入,所以之后会再讲解一篇RotateWorldTest,以满足大家的胃口。

 

打开工程中TestCpp下的ClickAndMoveTest目录,可以看到两个文件:ClickAndMove.h和cpp。

打开ClickAndMove.h:

与之前一样,建立了一个场景,并在场景中创建所需要表现的CCLayer。

[cpp]  view plain copy
  1. class ClickAndMoveTestScene : public TestScene  
  2. {  
  3. public:  
  4.     virtual void runThisTest();  
  5. };  
  6.   
  7. class MainLayer : public CCLayer  
  8. {  
  9. public:  
  10. MainLayer();  
  11.     virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);  
  12. };  

     可以看到,这里面最关键的是在MainLayer中重载了基类的相应接口函数:


virtualvoid ccTouchesEnded(CCSet*pTouches, CCEvent *pEvent);


         CCLayer层本身由CCTouchDelegate派生,CCTouchDelegate是触点消息响应接口类,它指定了CCLayer在响应触点事件时所触发的函数。

[cpp]  view plain copy
  1. class CC_DLL CCTouchDelegate  
  2. {  
  3. public:  
  4.     //构造  
  5.     CCTouchDelegate() {}  
  6.     //析构  
  7.     virtual ~CCTouchDelegate()  
  8.     {  
  9.     }  
  10.     //单点触屏事件响应  
  11.     //按下  
  12. virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false;};  
  13. //移动  
  14. virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}  
  15. //停止移动  
  16.     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}  
  17.     //离开  
  18.     virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}  
  19.   
  20.     //多点触屏事件响应,事件与上面一致。  
  21.      virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}  
  22.      virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}  
  23.      virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}  
  24.      virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}  
  25.   
  26. };  

    看一下这些接口,如果我们需要增加相应的触屏事件处理,只需要在CCLayer的派生类中重载这些接口函数就OK了。

而MainLayer重载的virtualvoid ccTouchesEnded(CCSet *pTouches, CCEvent*pEvent);

即为多点触屏事件中的停止移动时触发的回调函数。

我们继续分析CPP文件:

[cpp]  view plain copy
  1. //定义一个枚举值为做精灵的tag。  
  2. enum  
  3. {  
  4.     kTagSprite = 1,  
  5. };  
  6. //场景运行时调用的函数。  
  7. void ClickAndMoveTestScene::runThisTest()  
  8. {  
  9.     //实例化一个MainLayer并设置由内存管理器进行引用计数管理。  
  10.     CCLayer* pLayer = new MainLayer();  
  11.     pLayer->autorelease();  
  12.     //将其放入当前场景中并运行这个场景。  
  13.     addChild(pLayer);  
  14.     CCDirector::sharedDirector()->replaceScene(this);  
  15. }  
  16. //MainLayer的构造函数。  
  17. MainLayer::MainLayer()  
  18. {  
  19.     //这个是打开当前CCLayer的触屏事件响应。  
  20.     setTouchEnabled(true);  
  21.     //创建一个男一号精灵。  
  22.     CCSprite* sprite = CCSprite::create(s_pPathGrossini);  
  23.     //创建一个纯色CCLayer,设置其初值色。  
  24.     CCLayer* layer = CCLayerColor::create(ccc4(255,255,0,255));  
  25.     //降低一层放在当前CCLayer中。  
  26.     addChild(layer, -1);  
  27.     //将精灵放在上面的纯色CCLayer之上。  
  28.     addChild(sprite, 0, kTagSprite);  
  29.     //设置精灵的初始位置。  
  30.     sprite->setPosition( CCPointMake(20,150) );  
  31.     //精灵运行一个4秒内跳跃4次到指定位置的动画。  
  32.     sprite->runAction( CCJumpTo::create(4, CCPointMake(300,48), 100, 4) );  
  33.     //纯色层运行一个无限循环的动画序列,这个动画序列中是两个动画,分别为渐亮和渐暗动画。  
  34.     layer->runAction( CCRepeatForever::create(   
  35.                                                         (CCActionInterval*)( CCSequence::create(      
  36.                                                                             CCFadeIn::create(1),  
  37.                                                                             CCFadeOut::create(1),  
  38.                                                                             NULL) )  
  39.                                                         ) );   
  40. }  
  41. //多点触屏事件中的停止移动时触发的回调函数。  
  42. void MainLayer::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)  
  43. {  
  44.     //取得多点中第一个触点。  
  45.     CCSetIterator it = pTouches->begin();  
  46.     CCTouch* touch = (CCTouch*)(*it);  
  47.       
  48.     //取得其位置。  
  49.     CCPoint location = touch->getLocation();  
  50.     //通过TAG值取得相应的精灵。  
  51.     CCNode* s = getChildByTag(kTagSprite);  
  52.     //让精灵停止所有动作。  
  53.     s->stopAllActions();  
  54.     //让精灵运行一个新的移动动画,在1秒内移动一触点位置。  
  55.     s->runAction( CCMoveTo::create(1, CCPointMake(location.x, location.y) ) );  
  56.     //取得触点位置与精灵的位置的方向。  
  57.     float o = location.x - s->getPosition().x;  
  58.     float a = location.y - s->getPosition().y;  
  59.     //通过斜率计算出角度。  
  60.     float at = (float) CC_RADIANS_TO_DEGREES( atanf( o/a) );  
  61.     //让人物头的方向始终朝着终点。  
  62.     if( a < 0 )   
  63.     {  
  64.         if(  o < 0 )  
  65.             at = 180 + fabs(at);  
  66.         else  
  67.             at = 180 - fabs(at);      
  68.     }  
  69.     //让精灵运行一个1秒内旋转相应角度的动画。  
  70.     s->runAction( CCRotateTo::create(1, at) );  
  71. }  

这个示例比较简单,大家也可以参考《Cocos2d-x 2.0 百例精讲:如何让一个精灵跟随触点移动》一文进行学习。


你可能感兴趣的:(Cocos2d-x2.0 之 ClickAndMoveTest “谈不上深入”的分析.)