Cocos2d-x如何控制动作速度
基本动作和组合动作实现了针对精灵的各种运动和动画效果的改变。但这样的改变速度匀速的、线性的。通过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如何控制动作速度的更多相关文章
- Cocos2d-x怎样控制动作速度
基本动作和组合动作实现了针对精灵的各种运动和动画效果的改变.但这种改变速度匀速的.线性的.通过ActionEase及其的派生类和Speed 类我们能够使精灵以非匀速或非线性速度运动,这样看起了效果更加 ...
- 小尝试一下 cocos2d
好奇 cocos2d 到底是怎样一个框架,正好有个项目需要一个游戏框架,所以稍微了解了一下.小结一下了解到的情况. 基本概念 首先呢,因为 cocos2d 是基于 pyglet 做的,你完全可以直接用 ...
- 在cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet
免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...
- Cocos2d入门--2--三角函数的应用
其实,三角函数的知识点是初中的数学基础.但是在编程里合理的利用的话,也会很好玩的,可以制作出很多有趣的动画特效. 首先要注意的是 角度 和 弧度 的转换. 360度 = 2×PI弧度 180度 = ...
- ios游戏开发--cocos2d学习(1)
学习cocos2d需要一定的编程基础,最好了解objective-c的语法.至于下载和安装的过程网上有很多,这里不多介绍,直接进入项目的学习. 创建一个cocos2d项目,直接运行,效果如图: 左下角 ...
- cocos2d粒子效果
第9章 粒子效果 游戏开发者通常使用粒子系统来制作视觉特效.粒子系统能够发射大量细小的粒子并对他们进行渲染,而且效率要远高于渲染同样数目的精灵.粒子系统可以模拟下雨.火焰.雪.爆炸.蒸气拖尾以及其他多 ...
- 【Cocos2d入门教程二】Cocos2d-x基础篇
上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...
- Android导入Cocos2D的Sample项目
导入Cocos2D项目到Android的Eclipse时注意以下几点 1. Set up Variables: Eclipse->Windows->Preferences->Gene ...
- 【转】频点CTO张成:基于Cocos2d的MMORPG开发经验
http://www.9ria.com/plus/view.php?aid=27698 作者: zhiyuanzhe3 发表时间: 2013-06-29 17:46 6月29日,由9Tech社区.51 ...
随机推荐
- C# 常用日期类型转换帮助类
本文转载:http://www.cnblogs.com/iamlilinfeng/p/3378659.html 最近工作比较忙,与此同时自己也在业余时间开发一个电子商务网站.虽然每天都很累,但感觉过的 ...
- uva 10152 ShellSort
//这个算法用到了"相对位置"的思想,并且就本题而言还有一个很重要的结论就是,假设 //移动了k个元素,那么这k个元素一定是最后结果的那个序列的前k个元素,而且易知, //越先移动 ...
- classloader加载过程
/** * 转载请注明作者longdick http://longdick.iteye.com * */ java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个j ...
- 自己写一个jQuery垂直滚动栏插件(panel)
html中原生的滚动栏比較难看,所以有些站点,会自己实现滚动栏,导航站点hao123在一个側栏中,就自己定义了垂直滚动栏,效果比較好看,截图例如以下: watermark/2/text/aHR0cDo ...
- Codeforces Round #332 (Div. 2) C. Day at the Beach 线段树
C. Day at the Beach Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/599/p ...
- iOS开发——UI_swift篇&UItableView实现移动单元格
UItableView实现移动单元格 1,下面的样例是给表格UITableView添加单元格移动功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,可以看到单元格后面出现 ...
- jQuery Pagination Ajax分页插件中文详解(转)
一.相关demo 基本demo页面 Ajax demo页面 参数可编辑demo页面 二.简介与说明 此jQuery插件为Ajax分页插件,一次性加载,故分页切换时无刷新与延迟,如果数据量较大不建议用此 ...
- 循环语句until和while
一.until语句的基本格式 until 条件测试 do 语句块 done 只要条件测试语句未成功结束,则执行语句块.(如果一开始条件测试语句就成功退出,那么一次也不执行语句块.这里跟C语言中的do. ...
- Linux环境变量的修改(永久,暂时)
Linux修改环境变量,很简单但很重要 一.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1. 永久的:需要修改配置文件,变量永久生效. 2. 临时的:使用export命令 ...
- win7家庭版任务栏预览消失,只显文字终极解决法
出现问题:win7家庭基础版,任务栏的预览窗口没有了,只有文字: Likethis: 工具/原料 services.msc 方法/步骤 网上的解决办法都试了,不管用,先把网上的方法列举出来如下 ...