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

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

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



还是分步骤来:

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

  1. classHelloWorld:publiccocos2d::CCLayer
  2. {
  3. public:
  4. //Here'sadifference.Method'init'incocos2d-xreturnsbool,insteadofreturning'id'incocos2d-iphone
  5. virtualboolinit();
  6. //there'sno'id'incpp,sowerecommandtoreturntheexactlyclasspointer
  7. staticcocos2d::CCScene*scene();
  8. //aselectorcallback下面是按下各个文字菜单调用的回调函数
  9. virtualvoidLJCallback(CCObject*pSender);
  10. virtualvoidCXCallback(CCObject*pSender);
  11. virtualvoidBJCallback(CCObject*pSender);
  12. virtualvoidInitback(CCObject*pSender);
  13. virtualvoidGZCallback(CCObject*pSender);
  14. virtualvoidJDCallback(CCObject*pSender);
  15. virtualvoidonExit();
  16. //implementthe"staticnode()"methodmanually
  17. LAYER_NODE_FUNC(HelloWorld);
  18. protected:
  19. cocos2d::CCSprite*m_tamara;
  20. cocos2d::CCProgressTimer*m_left;
  21. cocos2d::CCSizes;
  22. };

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


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

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

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

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

tool.h:

  1. #ifndef_TOOLS_H_
  2. #define_TOOLS_H_
  3. #include"cocos2d.h"
  4. #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
  5. #include"iconv.h"
  6. intGBKToUTF8(std::string&gbkStr,constchar*toCode,constchar*formCode);
  7. #endif
  8. #endif

--Tools.cpp

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

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


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


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


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


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值