cocos2d-x 菜鸟实习生学习篇(五) action例子

这几天一直都在看红孩儿的博客,里面讲cocos2d-x可以说:逆天了!!!你无法想象他注解的详细,详细的让你觉得枯燥,害怕。对我这种初学者来说,一篇博客看下来整个人都凌乱了。不过真的讲的很好!不吊大家胃口,直接上链接:http://blog.csdn.net/honghaier?viewmode=contents

其中几篇对action 讲述的很好,从里到外。本文就是在红孩儿博客的基础上,再参考蓝米粒的动作小例子:http://blog.csdn.net/xiaoxiangp/article/details/7693343



还是分步骤来:

1.先看.h文件,在类的声明中声明各种需要用到的成员函数和成员变量:

[cpp]  view plain copy
  1. class HelloWorld : public cocos2d::CCLayer  
  2. {  
  3. public:  
  4.     // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone  
  5.     virtual bool init();    
  6.   
  7.     // there's no 'id' in cpp, so we recommand to return the exactly class pointer  
  8.     static cocos2d::CCScene* scene();  
  9.       
  10.     // a selector callback  下面是按下各个文字菜单调用的回调函数
  11.     virtual void LJCallback(CCObject* pSender);  
  12.     virtual void CXCallback(CCObject* pSender);  
  13.     virtual void BJCallback(CCObject* pSender);  
  14.     virtual void Initback(CCObject* pSender);  
  15.     virtual void GZCallback(CCObject* pSender);  
  16.     virtual void JDCallback(CCObject* pSender);  
  17.     virtual void onExit();  
  18.   
  19.     // implement the "static node()" method manually  
  20.     LAYER_NODE_FUNC(HelloWorld);  
  21. protected:  
  22.     cocos2d::CCSprite* m_tamara;  
  23.     cocos2d::CCProgressTimer *m_left;  
  24.     cocos2d::CCSize s;  
  25. };  

2. 现在看.cpp文件,init()函数中把菜单实现,并且初始化各种变量...代码中有很多宏判断,是因为需要转换字符才能显示中文,后面会告诉大家方法...


[cpp]  view plain copy
  1. bool HelloWorld::init()  
  2. {  
  3.     bool bRet = false;  
  4.     do   
  5.     {  
  6.         CC_BREAK_IF(! CCLayer::init());  
  7.   
  8.         CCMenuItemFont::setFontName("Thonburi");//设置菜单字体  
  9.         CCMenuItemFont::setFontSize(25);//设置菜单字体大小  
  10.   
  11.         s = CCDirector::sharedDirector()->getWinSize();  
  12.   
  13.         std::string menuItemStr = "立即动画";  
  14. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  15.         GBKToUTF8(menuItemStr,"gb2312","utf-8");//调用字符转换函数  
  16. #endif  
  17.         CCMenuItem *shuenjian = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,  
  18.             menu_selector(HelloWorld::LJCallback)); //创建菜单项,并绑定触发函数..  
  19.   
  20.         menuItemStr = "持续动画";  
  21. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  22.         GBKToUTF8(menuItemStr,"gb2312","utf-8");  
  23. #endif  
  24.         CCMenuItem* chixu = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,  
  25.             menu_selector(HelloWorld::CXCallback));  
  26.   
  27.         menuItemStr = "补间动画";  
  28. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  29.         GBKToUTF8(menuItemStr,"gb2312","utf-8");  
  30. #endif  
  31.         CCMenuItem* bujian = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,  
  32.             menu_selector(HelloWorld::BJCallback));  
  33.   
  34.         menuItemStr = "跟踪动画";  
  35. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  36.         GBKToUTF8(menuItemStr,"gb2312","utf-8");  
  37. #endif  
  38.         CCMenuItem* genzong = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,  
  39.             menu_selector(HelloWorld::GZCallback));  
  40.   
  41.         menuItemStr = "进度动作";  
  42. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  43.         GBKToUTF8(menuItemStr,"gb2312","utf-8");  
  44. #endif  
  45.         CCMenuItem* jingdu = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,  
  46.             menu_selector(HelloWorld::JDCallback));  
  47.   
  48.         menuItemStr = "初始化精灵";  
  49. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  50.         GBKToUTF8(menuItemStr,"gb2312","utf-8");  
  51. #endif  
  52.         CCMenuItem* InitItem = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,  
  53.             menu_selector(HelloWorld::Initback));  
  54.   
  55.   
  56.         CCMenu* pMenu = CCMenu::menuWithItems(shuenjian,chixu,bujian,genzong,jingdu,InitItem,NULL);//创建菜单  
  57.         pMenu->alignItemsVertically();//设置菜单的显示为垂直列表  
  58.         CC_BREAK_IF(! pMenu);  
  59.         pMenu->setPosition(s.width/2+s.width/4, s.height/2);//设置菜单显示位置  
  60.         this->addChild(pMenu, 1);//添加菜单进入  
  61.   
  62.         //初始化精灵  
  63.         m_tamara = CCSprite::spriteWithFile("jl.png");  
  64.         m_tamara->retain();  
  65.         addChild(m_tamara,1);  
  66.         m_tamara->setPosition(CCPointMake(s.width/2, s.height/2));  
  67.   
  68.         //初始化背景图片,这里用的图片是960X360..也就是两个屏幕宽  
  69.         CCSprite* bg = CCSprite::spriteWithFile("bg_24.png");  
  70.         bg->setPosition(ccp(s.width/2 + s.width/2, s.height/2));  
  71.         this->addChild(bg,-1);  
  72.   
  73.         bRet = true;  
  74.     } while (0);  
  75.   
  76.     return bRet;  
  77. }  

3. 规范代码,养成好习惯,所以我们添加<Tools.h> 和 <Tools.cpp> 文件,把字符转换的处理函数写在里面:

--Tools.h,其中会调用到‘.iconv.h’这个头文件,要自己手动添加进去,这让我一阵好找!在

cocos2d-1.0.1-x\cocos2dx\platform\third_party\win32\iconv

tool.h:

[cpp]  view plain copy
  1. #ifndef _TOOLS_H_  
  2. #define  _TOOLS_H_  
  3.   
  4. #include "cocos2d.h"  
  5.   
  6. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  7.   
  8. #include "iconv.h"  
  9. int GBKToUTF8(std::string &gbkStr,const char* toCode,const char* formCode);  
  10.   
  11. #endif  
  12.   
  13. #endif  

--Tools.cpp

[cpp]  view plain copy
  1. #include "tools.h"  
  2.   
  3. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  4. //字符转换,使cocos2d-x在win32平台支持中文显示  
  5. int GBKToUTF8(std::string &gbkStr,const char* toCode,const char* formCode)  
  6. {  
  7.     iconv_t iconvH;  
  8.     iconvH = iconv_open(formCode,toCode);  
  9.     if(iconvH == 0)  
  10.     {  
  11.         return -1;  
  12.     }  
  13.   
  14.     const char* strChar = gbkStr.c_str();  
  15.     const char** pin = &strChar;  
  16.   
  17.     size_t strLength = gbkStr.length();  
  18.     char* outbuf = (char*)malloc(strLength*4);  
  19.     char* pBuff = outbuf;  
  20.     memset(outbuf,0,strLength*4);  
  21.     size_t outLength = strLength*4;  
  22.     if(-1 == iconv(iconvH,pin,&strLength,&outbuf,&outLength))  
  23.     {  
  24.         iconv_close(iconvH);  
  25.         return -1;  
  26.     }  
  27.   
  28.     gbkStr = pBuff;  
  29.     iconv_close(iconvH);  
  30.     return 0;  
  31. }  
  32. #endif  

4. 添加附加依赖项 ,不添加的话,会提示找不到的外部符号....


对工程右键-> 属性 -> 连接器 -> 输入 -> 附加依赖项    栏目->后面有个按钮,点击打开,换一行加入libiconv.lib,或者在最后空一格加上libiconv.lib也行


5. 对号入座的实现各个小功能的回调函数和退出的处理函数:


[cpp]  view plain copy
  1. //立即动画,不需要时间,直接完成  
  2. void HelloWorld::LJCallback(CCObject* pSender)  
  3. {  
  4.     CCActionInstant* Action1 = CCPlace::actionWithPosition(ccp(100,100));  
  5.     m_tamara->runAction(Action1);  
  6. }  
  7.   
  8. //持续动画  
  9. void HelloWorld::CXCallback(CCObject* pSender)  
  10. {     
  11.     //创建一个同时动作,同时移动和旋转  
  12.     CCFiniteTimeAction* actionsGo = CCSpawn::actions(  
  13.         CCMoveTo::actionWithDuration(1.0f,ccp(0,0)),  
  14.         CCRotateBy::actionWithDuration(1.0f,360),NULL);  
  15.   
  16.     //创建一个同时动作,同时移动和旋转  
  17.     CCFiniteTimeAction* actionsBack = CCSpawn::actions(  
  18.         CCMoveTo::actionWithDuration(1.0f, CCPointMake(s.width/2,s.height/2)),  
  19.         CCRotateBy::actionWithDuration( 2,  720),NULL);  
  20.   
  21.     //创建一个组合动作,执行完第一个动作后执行下一个  
  22.     CCFiniteTimeAction* All = CCSequence::actions(actionsGo,actionsBack,NULL);  
  23.   
  24.     //使用动作包装把组合动作变成永久循环执行..需要转换成CCActionInterval *  
  25.     m_tamara->runAction(CCRepeatForever::actionWithAction((CCActionInterval*)All));  
  26. }  
  27.   
  28. //补间动画  
  29. void HelloWorld::BJCallback(CCObject* pSender)  
  30. {  
  31.     CCActionInterval* actionTo = CCRotateBy::actionWithDuration(4.0f,360);  
  32.     m_tamara->runAction(CCEaseBackOut::actionWithAction(actionTo));  
  33. }  
  34.   
  35. //跟踪动画  
  36. void HelloWorld::GZCallback(CCObject* pSender)  
  37. {  
  38.     CCActionInterval* Moveto = CCMoveBy::actionWithDuration(3.0f,CCPointMake(s.width*2+100, 0));  
  39.     CCActionInterval* MoveBack = Moveto->reverse();  
  40.     CCFiniteTimeAction* All = CCSequence::actions(Moveto,MoveBack,NULL);  
  41.     CCAction* rep = CCRepeatForever::actionWithAction((CCActionInterval*)All);//包装动作为永久循环  
  42.   
  43.     m_tamara->runAction(rep);//执行rep动作  
  44.     this->runAction(CCFollow::actionWithTarget(m_tamara,CCRectMake(0,0,s.width*2, s.height)));//执行跟踪动作  
  45. }  
  46.   
  47. //进度动作  
  48. void HelloWorld::JDCallback(CCObject* pSender)  
  49. {  
  50.     CCProgressTo *to1 = CCProgressTo::actionWithDuration(2,100);  
  51.     CCProgressTimer *left = CCProgressTimer::progressWithFile("jl.png");  
  52.     left->setType(kCCProgressTimerTypeHorizontalBarLR);  
  53.     addChild(left);  
  54.     left->setPosition(CCPointMake(100,s.height/2));  
  55.     left->runAction(CCRepeatForever::actionWithAction(to1));  
  56. }  
  57.   
  58. //初始化精灵  
  59. void HelloWorld::Initback(CCObject* pSender)  
  60. {  
  61.     m_tamara->stopAllActions();//停止所有动作  
  62.     m_tamara->setRotation(0.0f);//设置旋转为0,即为没有旋转的状态  
  63.     m_tamara->setPosition(ccp(s.width/2, s.height/2));//设置位置为中心  
  64. }  
  65.   
  66. void HelloWorld::onExit()  
  67. {  
  68.     m_tamara->release();  
  69.     CCLayer::onExit();  
  70. }  


最后的释放中,我只释放了 m_tamara.但是还有一个m_left成员变量,如果在此释放就会出问题..有谁知道原因的请留言哦...谢谢



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值