zoukankan      html  css  js  c++  java
  • Cocos2d-x开发实例介绍帧动画使用

    下面我们通过一个实例介绍一下帧动画的使用,这个实例如下图所示,点击Go按钮开始播放动画,这时候播放按钮标题变为Stop,点击Stop按钮可以停止播放动画。

    下面我们再看看具体的程序代码,首先看一下看HelloWorldScene.h文件,它的代码如下:

    [html] view plaincopy
     
    1. #ifndef __HELLOWORLD_SCENE_H__  
    2. #define __HELLOWORLD_SCENE_H__  
    3.    
    4. #include "cocos2d.h"  
    5.    
    6. class HelloWorld : public cocos2d::Layer  
    7. {  
    8.          bool isPlaying; //播放标识                                                                                                  ①  
    9.    cocos2d::Sprite* sprite;                                                                                                        ②  
    10. public:  
    11.    
    12.    static cocos2d::Scene* createScene();  
    13.    virtual bool init();   
    14.      
    15.     voidOnAction(cocos2d::Ref* pSender);                                                                                       ③  
    16.      
    17.    CREATE_FUNC(HelloWorld);  
    18.    
    19. };  
    20.    
    21. #endif // __HELLOWORLD_SCENE_H__  

    第①行代码是声明一个布尔变量isPlaying,用来保存播放状态,true时候说明正在播放,false时候说明停止播放。第②行代码cocos2d::Sprite*sprite是声明一个精灵变量。第③行声明了一个函数,用来在选择不同菜单时候的回调。

    [html] view plaincopy
     
    1. HelloWorldScene的实现代码HelloWorldScene.ccp文件,其中HelloWorld::init()函数代码如下:  
    2. bool HelloWorld::init()  
    3. {  
    4.     if( !Layer::init() )  
    5.     {  
    6.          returnfalse;  
    7.     }  
    8.    
    9.     SizevisibleSize = Director::getInstance()->getVisibleSize();  
    10.     Pointorigin = Director::getInstance()->getVisibleOrigin();  
    11.    
    12.     SpriteFrameCache::getInstance()->addSpriteFramesWithFile("run.plist");  
    13.    
    14.     autobackground = Sprite::createWithSpriteFrameName("background.png");  
    15.     background->setAnchorPoint(Point::ZERO);  
    16.     this->addChild(background,0);  
    17.    
    18.     sprite= Sprite::createWithSpriteFrameName("h1.png");  
    19.     sprite->setPosition(Point(visibleSize.width/2,visibleSize.height /2));  
    20.     this->addChild(sprite);  
    21.    
    22.     isPlaying= false;  
    23.      
    24.          //toggle菜单  
    25.     autogoSprite = Sprite::createWithSpriteFrameName("go.png");                                                 ①  
    26.     autostopSprite = Sprite::createWithSpriteFrameName("stop.png");                                           ②  
    27.     autogoToggleMenuItem = MenuItemSprite::create(goSprite, goSprite);                                    ③  
    28.  auto stopToggleMenuItem = MenuItemSprite::create(stopSprite,stopSprite);                            ④  
    29.  auto toggleMenuItem = MenuItemToggle::createWithCallback(  
    30.                     CC_CALLBACK_1(HelloWorld::OnAction,this),  
    31.                           goToggleMenuItem , stopToggleMenuItem, NULL);                                             ⑤  
    32.     toggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(930,540)));                   ⑥  
    33.    auto mn = Menu::create(toggleMenuItem, NULL);  
    34.    mn->setPosition(Point::ZERO);  
    35.    this->addChild(mn);  
    36.    
    37.     returntrue;  
    38. }  

    上述代码第①行是创建Go按钮精灵,对应的第③行代码是创建Go按钮(菜单项)。代码第②行是创建Stop按钮精灵,对应的第④行代码是创建Stop按钮(菜单项)。在第⑤行代码是创建Go和Stop是两种状态切换的开关菜单项。第⑥行代码是设置开关菜单项的位置。

    HelloWorldScene的实现代码HelloWorldScene.ccp文件,其中HelloWorld::OnAction(Ref*pSender)函数代码如下:

    [html] view plaincopy
     
    1. void HelloWorld::OnAction(Ref* pSender)  
    2. {  
    3.      
    4.     if(!isPlaying) {  
    5.    
    6.          ///////////////动画开始//////////////////////  
    7.          Animation*animation = Animation::create();                                                                    ①  
    8.          for(int i=1; i<= 4; i++)  
    9.          {  
    10.              __String*frameName = __String::createWithFormat("h%d.png",i);                                    ②  
    11.              log("frameName= %s",frameName->getCString());  
    12.              SpriteFrame*spriteFrame = SpriteFrameCache::getInstance()->  
    13.                                        getSpriteFrameByName(frameName->getCString());                                  ③  
    14.              animation->addSpriteFrame(spriteFrame);                                                                           ④  
    15.          }  
    16.    
    17.          animation->setDelayPerUnit(0.15f);           //设置两个帧播放时间                             ⑤  
    18.          animation->setRestoreOriginalFrame(true);    //动画执行后还原初始状态                   ⑥  
    19.    
    20.          Animate*action = Animate::create(animation);                                                                          ⑦  
    21.          sprite->runAction(RepeatForever::create(action));                                                         ⑧  
    22.          //////////////////动画结束///////////////////  
    23.    
    24.          isPlaying= true;  
    25.    
    26.     }else {         
    27.          sprite->stopAllActions();                                                                                               ⑨  
    28.          isPlaying= false;  
    29.     }  
    30. }  

    上述第①行代码是创建一个Animation对象,它是动画对象,然后我们要通过循环将各个帧图片放到Animation对象中。第②行是获得帧图片的文件名,String类型是Cocos2d-x字符串数据类型。第③行代码是通过帧名创建精灵帧对象,第④行代码把精灵帧对象添加到Animation对象中。

    第⑤行代码是animation->setDelayPerUnit(0.15f)是设置两个帧播放时间,我们这个动画播放是4帧。第⑥行代码animation->setRestoreOriginalFrame(true)是动画执行完成是否还原到初始状态。第⑦行代码是通过一个Animation对象创建Animate对象,第⑧行代码sprite->runAction(RepeatForever::create(action))是执行动画动作,无限循环方式。

    第⑨行代码sprite->stopAllActions()停止所有的动作。

    更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》
    本书交流讨论网站:http://www.cocoagame.net
    欢迎加入cocos2d-x技术讨论群:257760386、327403678
  • 相关阅读:
    工具类-vim在shell中卡死的情况
    tomcat日志分类
    逻辑运算
    牛客练习赛29 F 算式子
    牛客练习赛29 B
    查询
    hdu 5984
    zoj 4057
    zoj 4056
    zoj 4054
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/3845051.html
Copyright © 2011-2022 走看看