基本动作和组合动作实现了针对精灵的各种运动和动画效果的改变。但这样的改变速度匀速的、线性的。通过ActionEase及其的派生类和Speed 类我们可以使精灵以非匀速或非线性速度运动,这样看起了效果更加逼真。

ActionEase的类图如下图所示。

下面我们通过一个实例介绍一下这些动作中速度的控制的使用,这个实例如下图所示,上图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的动作效果,点击Back按钮可以返回到菜单场景。

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

[html] view plaincopy

  • #ifndef __HELLOWORLD_SCENE_H__
  • #define __HELLOWORLD_SCENE_H__
  • #include "cocos2d.h"
  • #include "MyActionScene.h"
  • typedef enum                                                                                                                                         ①
  • {
  • kEaseIn = 1
  • ,kEaseOut
  • ,kEaseInOut
  • ,kEaseSineIn
  • ,kEaseSineOut
  • ,kEaseSineInOut
  • ,kEaseExponentialIn
  • ,kEaseExponentialOut
  • ,kEaseExponentialInOut
  • ,kSpeed
  • } ActionTypes;                                                                                                                             ②
  • class HelloWorld : public cocos2d:ayer
  • {
  • public:
  • static cocos2d::Scene* createScene();
  • virtual bool init();
  • void OnClickMenu(cocos2d::Ref* pSender);
  • CREATE_FUNC(HelloWorld);
  • };
  • #endif // __HELLOWORLD_SCENE_H__

上述代码第①~②是定义个枚举类型ActionTypes,枚举类型ActionTypes中定义了10个常量,这10个常量对应10个菜单项。

HelloWorldScene的实现代码HelloWorldScene.ccp文件,它的主要代码如下:

[html] view plaincopy

  • bool HelloWorld::init()
  • {
  • if( !Layer::init() )
  • {
  • returnfalse;
  • }
  • SizevisibleSize = Director::getInstance()->getVisibleSize();
  • Pointorigin = Director::getInstance()->getVisibleOrigin();
  • autobg = Sprite::create("background.png");
  • bg->setPosition(Point(visibleSize.width/2,visibleSize.height /2));
  • this->addChild(bg);
  • autopItmLabel1 = Label::createWithBMFont("fonts/fnt2.fnt","EaseIn");
  • autopItmMenu1 = MenuItemLabel::create(pItmLabel1,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu, this));
  • pItmMenu1->setTag(kEaseIn);
  • autopItmLabel2 = Label::createWithBMFont("fonts/fnt2.fnt","EaseOut");
  • autopItmMenu2 = MenuItemLabel::create(pItmLabel2,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
  • pItmMenu2->setTag(kEaseOut);
  • autopItmLabel3 = Label::createWithBMFont("fonts/fnt2.fnt","EaseInOut");
  • autopItmMenu3 = MenuItemLabel::create(pItmLabel3,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
  • pItmMenu3->setTag(kEaseInOut);
  • autopItmLabel4 = Label::createWithBMFont("fonts/fnt2.fnt","EaseSineIn");
  • autopItmMenu4 = MenuItemLabel::create(pItmLabel4,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
  • pItmMenu4->setTag(kEaseSineIn);
  • autopItmLabel5 = Label::createWithBMFont("fonts/fnt2.fnt", "EaseSineOut");
  • autopItmMenu5 = MenuItemLabel::create(pItmLabel5,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
  • pItmMenu5->setTag(kEaseSineOut);
  • autopItmLabel6 = Label::createWithBMFont("fonts/fnt2.fnt","EaseSineInOut");
  • autopItmMenu6 = MenuItemSprite::create(pItmLabel6,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
  • pItmMenu6->setTag(kEaseSineInOut);
  • autopItmLabel7 = Label::createWithBMFont("fonts/fnt2.fnt","EaseExponentialIn");
  • autopItmMenu7 = MenuItemSprite::create(pItmLabel7,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
  • pItmMenu7->setTag(kEaseExponentialIn);
  • autopItmLabel8 = Label::createWithBMFont("fonts/fnt2.fnt","EaseExponentialOut");
  • autopItmMenu8 = MenuItemLabel::create(pItmLabel8,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
  • pItmMenu8->setTag(kEaseExponentialOut);
  • autopItmLabel9 = Label::createWithBMFont("fonts/fnt2.fnt","EaseExponentialInOut");
  • autopItmMenu9 = MenuItemLabel::create(pItmLabel9,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
  • pItmMenu9->setTag(kEaseExponentialInOut);
  • autopItmLabel10 = Label::createWithBMFont("fonts/fnt2.fnt","Speed");
  • autopItmMenu10 = MenuItemLabel::create(pItmLabel10,
  • CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
  • pItmMenu10->setTag(kSpeed);
  • automn = Menu::create(pItmMenu1,pItmMenu2,pItmMenu3,pItmMenu4,pItmMenu5,
  • pItmMenu6,pItmMenu7,pItmMenu8,pItmMenu9,pItmMenu10,NULL);
  • mn->alignItemsInColumns(2,2, 2, 2, 2, NULL);
  • this->addChild(mn);
  • returntrue;
  • }
  • void HelloWorld::OnClickMenu(Ref* pSender)
  • {
  • MenuItem*nmitem = (MenuItem*)pSender;
  • auto  sc = Scene::create();
  • auto  layer = MyAction::create();
  • layer->setTag(nmitem->getTag());
  • sc->addChild(layer);
  • autoreScene = TransitionSlideInR::create(1.0f, sc);
  • Director::getInstance()->replaceScene(reScene);
  • }

在上诉代码大家比较熟悉了,我们这里就不再介绍了。下面我们再看看下一个场景MyActionScene,它的MyActionScene.ccp,它的主要代码如下:

[html] view plaincopy

  • void MyAction::goMenu(Ref* pSender)
  • {
  • log("Tag = %i",this->getTag());
  • FiniteTimeAction * ac1 = (FiniteTimeAction *)MoveBy::create(2,Point(200, 0));
  • FiniteTimeAction * ac2 = ((FiniteTimeAction *)ac1)->reverse();
  • ActionInterval * ac = Sequence::create(ac1, ac2, NULL);
  • switch (this->getTag()) {
  • case kEaseIn:
  • sprite->runAction(EaseIn::create(ac, 3));                                                                        ①
  • break;
  • case kEaseOut:
  • sprite->runAction(EaseOut::create(ac, 3));                                                            ②
  • break;
  • case kEaseInOut:
  • sprite->runAction(EaseInOut::create(ac,3));                                                         ③
  • break;
  • case kEaseSineIn:
  • sprite->runAction(EaseSineIn::create(ac));                                                           ④
  • break;
  • case kEaseSineOut:
  • sprite->runAction(EaseSineOut::create(ac));                                                                  ⑤
  • break;
  • case kEaseSineInOut:
  • sprite->runAction(EaseSineInOut::create(ac));                                                              ⑥
  • break;
  • case kEaseExponentialIn:
  • sprite->runAction(EaseExponentialIn::create(ac));                                                       ⑦
  • break;
  • case kEaseExponentialOut:
  • sprite->runAction(EaseExponentialOut::create(ac));                                                     ⑧
  • break;
  • case kEaseExponentialInOut:
  • sprite->runAction(EaseExponentialInOut::create(ac));                                        ⑨
  • break;
  • case kSpeed:
  • sprite->runAction(Speed::create(ac, (CCRANDOM_0_1() * 5)));                                  ⑩
  • break;
  • }
  • }

第①行代码sprite->runAction(EaseIn::create(ac, 3))是以3倍速度由慢至快。第②代码sprite->runAction(EaseOut::create(ac, 3))是以3倍速度由快至慢。第③代码sprite->runAction(EaseInOut::create(ac, 3))是以3倍速度由慢至快再由快至慢。

第④代码sprite->runAction(EaseSineIn::create(ac))是采用正弦变换速度由慢至快。第⑤代码sprite->runAction(EaseSineOut::create(ac))是采用正弦变换速度由快至慢。第⑥代码sprite->runAction(EaseOut::create(ac, 3)) 是采用正弦变换速度由慢至快再由快至慢。

第⑦代码sprite->runAction(EaseExponentialIn::create(ac))采用指数变换速度由慢至快。第⑧代码sprite->runAction(EaseExponentialOut::create(ac))采用指数变换速度由快至慢。第⑨代码sprite->runAction(EaseExponentialInOut::create(ac)) 采用指数变换速度由慢至快再由快至慢。

第⑩代码sprite->runAction(Speed::create(ac, (CCRANDOM_0_1() * 5))) 随机设置变换速度。

更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》
本书交流讨论网站:http://www.cocoagame.net
欢迎加入cocos2d-x技术讨论群:257760386、327403678

Cocos2d-x如何控制动作速度的更多相关文章

  1. Cocos2d-x怎样控制动作速度

    基本动作和组合动作实现了针对精灵的各种运动和动画效果的改变.但这种改变速度匀速的.线性的.通过ActionEase及其的派生类和Speed 类我们能够使精灵以非匀速或非线性速度运动,这样看起了效果更加 ...

  2. 小尝试一下 cocos2d

    好奇 cocos2d 到底是怎样一个框架,正好有个项目需要一个游戏框架,所以稍微了解了一下.小结一下了解到的情况. 基本概念 首先呢,因为 cocos2d 是基于 pyglet 做的,你完全可以直接用 ...

  3. 在cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet

    免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...

  4. Cocos2d入门--2--三角函数的应用

    其实,三角函数的知识点是初中的数学基础.但是在编程里合理的利用的话,也会很好玩的,可以制作出很多有趣的动画特效. 首先要注意的是 角度 和 弧度 的转换. 360度 = 2×PI弧度 180度 =   ...

  5. ios游戏开发--cocos2d学习(1)

    学习cocos2d需要一定的编程基础,最好了解objective-c的语法.至于下载和安装的过程网上有很多,这里不多介绍,直接进入项目的学习. 创建一个cocos2d项目,直接运行,效果如图: 左下角 ...

  6. cocos2d粒子效果

    第9章 粒子效果 游戏开发者通常使用粒子系统来制作视觉特效.粒子系统能够发射大量细小的粒子并对他们进行渲染,而且效率要远高于渲染同样数目的精灵.粒子系统可以模拟下雨.火焰.雪.爆炸.蒸气拖尾以及其他多 ...

  7. 【Cocos2d入门教程二】Cocos2d-x基础篇

    上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...

  8. Android导入Cocos2D的Sample项目

    导入Cocos2D项目到Android的Eclipse时注意以下几点 1. Set up Variables: Eclipse->Windows->Preferences->Gene ...

  9. 【转】频点CTO张成:基于Cocos2d的MMORPG开发经验

    http://www.9ria.com/plus/view.php?aid=27698 作者: zhiyuanzhe3 发表时间: 2013-06-29 17:46 6月29日,由9Tech社区.51 ...

随机推荐

  1. 得到内网域管理员的5种常见方法<转>

    1.Netbios and LLMNR Name Poisoning 这个方法在WIN工作组下渗透很有用,WIN的请求查询顺序是下面三个步骤:本地hosts文件(%windir%\System32\d ...

  2. delphi 插入表格HTML代码

     <table width="174"  height="76" border="1" align="center" ...

  3. MYSQL之HANDLER_READ_*详细讲解

    http://www.databaseclub.com/category/performance/

  4. mysql --The MEMORY Storage Engine--官方文档

    原文地址:http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html The MEMORY storage engine (fo ...

  5. 利用 Composer 完善自己的 PHP 框架(二)——发送邮件

    本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 上一篇文章中,我们手工建造了一个简易的视图加载器 ...

  6. centos中samba配置后始终连不上的绝招

    奶奶的,按照网上的办法改了/etc/samba/smb.conf配置文件,结果在win7里面死活连不上,后来发现是防火墙的问题. 有两个命令必须要执行: 1.将SELIUNX设置成disabled或者 ...

  7. VBA-工程-找不到工程或库-解决方案

    近来,越来越多的朋友被“找不到工程或库”的错误所烦恼,所以决定新开一帖来聊聊此问题! QUOTE: 一般情况下,出现此错误是因为找不到引用工程,或找不到与工程语言对应的引用的对象库 出现此类错误可以根 ...

  8. JavaFX(三)窗口拖动

    1.问题场景 在上一篇中,我们将窗口的默认标题栏隐藏从而导致鼠标点击窗体无法进行拖动. 2.解决思路 给组件添加鼠标按下事件监听器和鼠标拖动事件监听器. 3.代码实现 代码片段: private do ...

  9. Java基础知识强化之网络编程笔记24:Android网络通信之 AndroidAsync(基于nio的异步通信库)

    1. AndroidAsync   AndroidAsync 是一个基于nio的异步socket ,http(客户端服务器端),websocket,socket.io库,AndroidAsync 是一 ...

  10. Android进阶笔记10:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...