这几天一直都在看红孩儿的博客,里面讲cocos2d-x可以说:逆天了!!!你无法想象他注解的详细,详细的让你觉得枯燥,害怕。对我这种初学者来说,一篇博客看下来整个人都凌乱了。不过真的讲的很好!不吊大家胃口,直接上链接:http://blog.csdn.net/honghaier?viewmode=contents
其中几篇对action 讲述的很好,从里到外。本文就是在红孩儿博客的基础上,再参考蓝米粒的动作小例子:http://blog.csdn.net/xiaoxiangp/article/details/7693343
还是分步骤来:
1.先看.h文件,在类的声明中声明各种需要用到的成员函数和成员变量:
- classHelloWorld:publiccocos2d::CCLayer
- {
- public:
- //Here'sadifference.Method'init'incocos2d-xreturnsbool,insteadofreturning'id'incocos2d-iphone
- virtualboolinit();
- //there'sno'id'incpp,sowerecommandtoreturntheexactlyclasspointer
- staticcocos2d::CCScene*scene();
- //aselectorcallback下面是按下各个文字菜单调用的回调函数
- virtualvoidLJCallback(CCObject*pSender);
- virtualvoidCXCallback(CCObject*pSender);
- virtualvoidBJCallback(CCObject*pSender);
- virtualvoidInitback(CCObject*pSender);
- virtualvoidGZCallback(CCObject*pSender);
- virtualvoidJDCallback(CCObject*pSender);
- virtualvoidonExit();
- //implementthe"staticnode()"methodmanually
- LAYER_NODE_FUNC(HelloWorld);
- protected:
- cocos2d::CCSprite*m_tamara;
- cocos2d::CCProgressTimer*m_left;
- cocos2d::CCSizes;
- };
2. 现在看.cpp文件,init()函数中把菜单实现,并且初始化各种变量...代码中有很多宏判断,是因为需要转换字符才能显示中文,后面会告诉大家方法...
- boolHelloWorld::init()
- {
- boolbRet=false;
- do
- {
- CC_BREAK_IF(!CCLayer::init());
- CCMenuItemFont::setFontName("Thonburi");//设置菜单字体
- CCMenuItemFont::setFontSize(25);//设置菜单字体大小
- s=CCDirector::sharedDirector()->getWinSize();
- std::stringmenuItemStr="立即动画";
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
- GBKToUTF8(menuItemStr,"gb2312","utf-8");//调用字符转换函数
- #endif
- CCMenuItem*shuenjian=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,
- menu_selector(HelloWorld::LJCallback));//创建菜单项,并绑定触发函数..
- menuItemStr="持续动画";
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
- GBKToUTF8(menuItemStr,"gb2312","utf-8");
- #endif
- CCMenuItem*chixu=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,
- menu_selector(HelloWorld::CXCallback));
- menuItemStr="补间动画";
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
- GBKToUTF8(menuItemStr,"gb2312","utf-8");
- #endif
- CCMenuItem*bujian=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,
- menu_selector(HelloWorld::BJCallback));
- menuItemStr="跟踪动画";
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
- GBKToUTF8(menuItemStr,"gb2312","utf-8");
- #endif
- CCMenuItem*genzong=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,
- menu_selector(HelloWorld::GZCallback));
- menuItemStr="进度动作";
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
- GBKToUTF8(menuItemStr,"gb2312","utf-8");
- #endif
- CCMenuItem*jingdu=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,
- menu_selector(HelloWorld::JDCallback));
- menuItemStr="初始化精灵";
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
- GBKToUTF8(menuItemStr,"gb2312","utf-8");
- #endif
- CCMenuItem*InitItem=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,
- menu_selector(HelloWorld::Initback));
- CCMenu*pMenu=CCMenu::menuWithItems(shuenjian,chixu,bujian,genzong,jingdu,InitItem,NULL);//创建菜单
- pMenu->alignItemsVertically();//设置菜单的显示为垂直列表
- CC_BREAK_IF(!pMenu);
- pMenu->setPosition(s.width/2+s.width/4,s.height/2);//设置菜单显示位置
- this->addChild(pMenu,1);//添加菜单进入
- //初始化精灵
- m_tamara=CCSprite::spriteWithFile("jl.png");
- m_tamara->retain();
- addChild(m_tamara,1);
- m_tamara->setPosition(CCPointMake(s.width/2,s.height/2));
- //初始化背景图片,这里用的图片是960X360..也就是两个屏幕宽
- CCSprite*bg=CCSprite::spriteWithFile("bg_24.png");
- bg->setPosition(ccp(s.width/2+s.width/2,s.height/2));
- this->addChild(bg,-1);
- bRet=true;
- }while(0);
- returnbRet;
- }
3. 规范代码,养成好习惯,所以我们添加<Tools.h> 和 <Tools.cpp> 文件,把字符转换的处理函数写在里面:
--Tools.h,其中会调用到‘.iconv.h’这个头文件,要自己手动添加进去,这让我一阵好找!在
cocos2d-1.0.1-x\cocos2dx\platform\third_party\win32\iconv
tool.h:
- #ifndef_TOOLS_H_
- #define_TOOLS_H_
- #include"cocos2d.h"
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
- #include"iconv.h"
- intGBKToUTF8(std::string&gbkStr,constchar*toCode,constchar*formCode);
- #endif
- #endif
--Tools.cpp
- #include"tools.h"
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)
- //字符转换,使cocos2d-x在win32平台支持中文显示
- intGBKToUTF8(std::string&gbkStr,constchar*toCode,constchar*formCode)
- {
- iconv_ticonvH;
- iconvH=iconv_open(formCode,toCode);
- if(iconvH==0)
- {
- return-1;
- }
- constchar*strChar=gbkStr.c_str();
- constchar**pin=&strChar;
- size_tstrLength=gbkStr.length();
- char*outbuf=(char*)malloc(strLength*4);
- char*pBuff=outbuf;
- memset(outbuf,0,strLength*4);
- size_toutLength=strLength*4;
- if(-1==iconv(iconvH,pin,&strLength,&outbuf,&outLength))
- {
- iconv_close(iconvH);
- return-1;
- }
- gbkStr=pBuff;
- iconv_close(iconvH);
- return0;
- }
- #endif
4. 添加附加依赖项 ,不添加的话,会提示找不到的外部符号....
对工程右键-> 属性 -> 连接器 -> 输入 -> 附加依赖项 栏目->后面有个按钮,点击打开,换一行加入libiconv.lib,或者在最后空一格加上libiconv.lib也行
5. 对号入座的实现各个小功能的回调函数和退出的处理函数:
- //立即动画,不需要时间,直接完成
- voidHelloWorld::LJCallback(CCObject*pSender)
- {
- CCActionInstant*Action1=CCPlace::actionWithPosition(ccp(100,100));
- m_tamara->runAction(Action1);
- }
- //持续动画
- voidHelloWorld::CXCallback(CCObject*pSender)
- {
- //创建一个同时动作,同时移动和旋转
- CCFiniteTimeAction*actionsGo=CCSpawn::actions(
- CCMoveTo::actionWithDuration(1.0f,ccp(0,0)),
- CCRotateBy::actionWithDuration(1.0f,360),NULL);
- //创建一个同时动作,同时移动和旋转
- CCFiniteTimeAction*actionsBack=CCSpawn::actions(
- CCMoveTo::actionWithDuration(1.0f,CCPointMake(s.width/2,s.height/2)),
- CCRotateBy::actionWithDuration(2,720),NULL);
- //创建一个组合动作,执行完第一个动作后执行下一个
- CCFiniteTimeAction*All=CCSequence::actions(actionsGo,actionsBack,NULL);
- //使用动作包装把组合动作变成永久循环执行..需要转换成CCActionInterval*
- m_tamara->runAction(CCRepeatForever::actionWithAction((CCActionInterval*)All));
- }
- //补间动画
- voidHelloWorld::BJCallback(CCObject*pSender)
- {
- CCActionInterval*actionTo=CCRotateBy::actionWithDuration(4.0f,360);
- m_tamara->runAction(CCEaseBackOut::actionWithAction(actionTo));
- }
- //跟踪动画
- voidHelloWorld::GZCallback(CCObject*pSender)
- {
- CCActionInterval*Moveto=CCMoveBy::actionWithDuration(3.0f,CCPointMake(s.width*2+100,0));
- CCActionInterval*MoveBack=Moveto->reverse();
- CCFiniteTimeAction*All=CCSequence::actions(Moveto,MoveBack,NULL);
- CCAction*rep=CCRepeatForever::actionWithAction((CCActionInterval*)All);//包装动作为永久循环
- m_tamara->runAction(rep);//执行rep动作
- this->runAction(CCFollow::actionWithTarget(m_tamara,CCRectMake(0,0,s.width*2,s.height)));//执行跟踪动作
- }
- //进度动作
- voidHelloWorld::JDCallback(CCObject*pSender)
- {
- CCProgressTo*to1=CCProgressTo::actionWithDuration(2,100);
- CCProgressTimer*left=CCProgressTimer::progressWithFile("jl.png");
- left->setType(kCCProgressTimerTypeHorizontalBarLR);
- addChild(left);
- left->setPosition(CCPointMake(100,s.height/2));
- left->runAction(CCRepeatForever::actionWithAction(to1));
- }
- //初始化精灵
- voidHelloWorld::Initback(CCObject*pSender)
- {
- m_tamara->stopAllActions();//停止所有动作
- m_tamara->setRotation(0.0f);//设置旋转为0,即为没有旋转的状态
- m_tamara->setPosition(ccp(s.width/2,s.height/2));//设置位置为中心
- }
- voidHelloWorld::onExit()
- {
- m_tamara->release();
- CCLayer::onExit();
- }