Cocos2d-x怎样控制动作速度
基本动作和组合动作实现了针对精灵的各种运动和动画效果的改变。但这种改变速度匀速的、线性的。通过ActionEase及其的派生类和Speed 类我们能够使精灵以非匀速或非线性速度运动,这样看起了效果更加逼真。
ActionEase的类图例如以下图所看到的。
以下我们通过一个实例介绍一下这些动作中速度的控制的使用,这个实比例如以下图所看到的,上图是一个操作菜单场景,选择菜单能够进入到下图动作场景,在下图动作场景中点击Gobutton能够运行我们选择的动作效果,点击Backbutton能够返回到菜单场景。
以下我们再看看详细的程序代码,首先看一下看HelloWorldScene.h文件,它的代码例如以下:
#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::Layer
{
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文件,它的主要代码例如以下:
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。它的主要代码例如以下:
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))) 随机设置变换速度。
京东:http://item.jd.com/11584534.html
当当: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
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# Hook
C# Hook原理及EasyHook简易教程 前言 在说C# Hook之前,我们先来说说什么是Hook技术.相信大家都接触过外挂,不管是修改游戏客户端的也好,盗取密码的也罢,它们都是如何实现的呢? 实 ...
- 文件共享服务器nfs搭建过程
网络文件共享服务器192. yum install -y nfs-utils 在exports文件中添加的从机范围 vim /etc/exports /home/nfs/ (rw,sync,fsid= ...
- springMVC怎么接收日期类型的参数?
springMVC怎么接收日期类型的参数? springMVC的controller中用实体接受页面传递的参数,并且实体中的属性类型为日期类型,怎么接收呢?如果接收不到会进不到controller中. ...
- vue1.0父子、兄弟间 通信案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MVC中几种常用的ActionResult
一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等 ...
- 洛谷P3402 【模板】可持久化并查集
一定注意每一次都要是 $root[cur]=root[cur-1]$,不然进行合并时如果 $a,b$ 在同一集合中就会使 $root[cur]=0$. Code: #include <cstdi ...
- 关联Anaconda和最新Pycharm2018.3.2
在Anaconda和Pycharm 2018.3.2 x64都安装好之后,进行Anaconda 与Pycharm的关联操作 首先File -->New Project 打开以后切记要把Proje ...
- users---显示当前登录系统的所有用户的用户列表
users命令用于显示当前登录系统的所有用户的用户列表.每个显示的用户名对应一个登录会话.如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数. 语法 users(选项) 选项 --help: ...
- 洛谷 P1096 Hanoi双塔问题
P1096 Hanoi双塔问题 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情 ...
- Android 使用DrawerLayout高速实现側滑菜单
一.概述 DrawerLayout是一个能够方便的实现Android側滑菜单的组件,我近期开发的项目中也有一个側滑菜单的功能.于是DrawerLayout就派上用场了.假设你从未使用过DrawerLa ...