Cocos2d-x开发实例介绍帧动画使用

news/2024/7/20 21:20:50 标签: swift, ios, swift教程, cocos2d-x, 手机游戏

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


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

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
 
#include "cocos2d.h"
 
class HelloWorld : public cocos2d::Layer
{
         bool isPlaying; //播放标识                                                                                                  ①
   cocos2d::Sprite* sprite;                                                                                                        ②
public:
 
   static cocos2d::Scene* createScene();
   virtual bool init(); 
   
    voidOnAction(cocos2d::Ref* pSender);                                                                                       ③
   
   CREATE_FUNC(HelloWorld);
 
};
 
#endif // __HELLOWORLD_SCENE_H__

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

HelloWorldScene的实现代码HelloWorldScene.ccp文件,其中HelloWorld::init()函数代码如下:
bool HelloWorld::init()
{
    if( !Layer::init() )
    {
         returnfalse;
    }
 
    SizevisibleSize = Director::getInstance()->getVisibleSize();
    Pointorigin = Director::getInstance()->getVisibleOrigin();
 
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("run.plist");
 
    autobackground = Sprite::createWithSpriteFrameName("background.png");
    background->setAnchorPoint(Point::ZERO);
    this->addChild(background,0);
 
    sprite= Sprite::createWithSpriteFrameName("h1.png");
    sprite->setPosition(Point(visibleSize.width/2,visibleSize.height /2));
    this->addChild(sprite);
 
    isPlaying= false;
   
         //toggle菜单
    autogoSprite = Sprite::createWithSpriteFrameName("go.png");                                                 ①
    autostopSprite = Sprite::createWithSpriteFrameName("stop.png");                                           ②
    autogoToggleMenuItem = MenuItemSprite::create(goSprite, goSprite);                                    ③
 auto stopToggleMenuItem = MenuItemSprite::create(stopSprite,stopSprite);                            ④
 auto toggleMenuItem = MenuItemToggle::createWithCallback(
                    CC_CALLBACK_1(HelloWorld::OnAction,this),
                          goToggleMenuItem , stopToggleMenuItem, NULL);                                             ⑤
    toggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(930,540)));                   ⑥
   auto mn = Menu::create(toggleMenuItem, NULL);
   mn->setPosition(Point::ZERO);
   this->addChild(mn);
 
    returntrue;
}

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

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

void HelloWorld::OnAction(Ref* pSender)
{
   
    if(!isPlaying) {
 
         ///动画开始//
         Animation*animation = Animation::create();                                                                    ①
         for(int i=1; i<= 4; i++)
         {
             __String*frameName = __String::createWithFormat("h%d.png",i);                                    ②
             log("frameName= %s",frameName->getCString());
             SpriteFrame*spriteFrame = SpriteFrameCache::getInstance()->
                                       getSpriteFrameByName(frameName->getCString());                                  ③
             animation->addSpriteFrame(spriteFrame);                                                                           ④
         }
 
         animation->setDelayPerUnit(0.15f);           //设置两个帧播放时间                             ⑤
         animation->setRestoreOriginalFrame(true);    //动画执行后还原初始状态                   ⑥
 
         Animate*action = Animate::create(animation);                                                                          ⑦
         sprite->runAction(RepeatForever::create(action));                                                         ⑧
         //动画结束///
 
         isPlaying= true;
 
    }else {       
         sprite->stopAllActions();                                                                                               ⑨
         isPlaying= false;
    }
}

上述第①行代码是创建一个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实战 C++卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11584534.html

亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当:http://product.dangdang.com/23606265.html

互动出版网:http://product.china-pub.com/3770734

《Cocos2d-x实战 C++卷》源码及样章下载地址:

源码下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

样章下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台


http://www.niftyadmin.cn/n/1036789.html

相关文章

爬楼梯(蓝桥杯C/C++B组真题详解)

题目&#xff1a; 思路&#xff1a; 因为最多能走四个台阶 我们就可以先把初始能走的四个台阶方案数 写出来 后面台阶的方案数每次都是 在该台阶-4能取到的 台阶数的方法总和 &#xff08;因为能通过前面的台阶一步走到要算的台阶数&#xff09; 注&#xff1a; 大家可能…

npm run eject时最常见报错解决

npm run eject导入webpack其中最常见的就是这个错误 这是因为git配置的原因 解决办法有两个 如果你有git 把代码提交了就好了 如果你不是在用git管理项目 在scr目录下将.get文件干掉就好了

queue 的使用

1.常见queue的使用地方&#xff1a; 在我们做bfs的时候因为要存储一个点 &#xff08;方便对其进行往四周走&#xff09; 所以我们就需要用queue 来存储下我们走过点 把每个方向走完然后对于四周可以走的 点存储到queue里面 先遍历完能走的四周 然后继续走后面的点 qu…

Cocos2d-x中触摸事件

理解一个触摸事件可以从时间和空间两方面考虑。 1、触摸事件的时间方面 触摸事件的在时间方面&#xff0c;如下图所示&#xff0c;可以有不同的“按下”、“移动”和“抬起”等阶段&#xff0c;表示触摸是否刚刚开始、是否正在移动或处于静止状态&#xff0c;以及何时结束&…

vector常见使用操作

无需多言 一代码可了解天下&#xff1a; 理解每一行代码的时候 因为代码解释采用递进的方式 大家可以根据实际边观看输出 边理解&#xff1a; #include<iostream> using namespace std; #include<vector> vector<int> q; #include<algorithm> in…

产生冠军(set)

题目&#xff1a; 产生冠军 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 29670 Accepted Submission(s): 13310 Problem Description 有一群人&#xff0c;打乒乓球比赛&#xff0c;两两捉对撕杀&#xff0c;每两…

Cocos2d-x实例:单点触摸事件

为了让大家掌握Cocos2d-x中的事件机制&#xff0c;下面我们以触摸事件为例&#xff0c;使用事件触发器实现单点触摸事件。该实例如图8-3所示&#xff0c;场景中有三个方块精灵&#xff0c;显示顺序如图8-3所示&#xff0c;拖拽它们可以移动它们&#xff0c;事件响应优先级是按照…

Cocos2d-x开发实例:使用Lambda 表达式

在Cocos2d-x 3.0之后提供了对C11标准[1]的支持&#xff0c;其中的Lambda[2]表达式使用起来非常简洁。我们可以使用Lambda表达式重构上一节的实例。 我们可以将下面的代码&#xff1a;listener->onTouchBegan CC_CALLBACK_2(HelloWorld::onTouchBegan, this);... ...bool Hel…