基本动作和组合动作实现了针对精灵的各种运动和动画效果的改变。但这样的改变速度匀速的、线性的。通过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))) 随机设置变换速度。
本书交流讨论网站:http://www.cocoagame.net
《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:
京东: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
样章下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1
相关推荐
3. **动作(Actions)与效果**:Cocos2d-x的动作系统允许开发者对游戏对象施加各种效果,如移动、旋转、缩放、淡入淡出等,实现丰富的视觉表现。 4. **物理引擎集成**:可能包含Box2D或Chipmunk等物理引擎的集成,...
在Cocos2d-x 3.x中,有丰富的动画支持,如动作(Actions)、时间线(Timeline)等。同时,Cocos2d-x集成了Box2D物理引擎,使开发者能轻松实现物理效果,如碰撞检测、重力模拟等。 游戏中的音频管理也是不可或缺的一...
14. **版本控制**:3.1版本发布后,Cocos2d-x经历了一系列的迭代和升级,每个新版本都引入了新的特性和改进,因此学习这个版本可以帮助理解框架的发展历程。 总的来说,Cocos2d-x 3.1是游戏开发者学习2D游戏开发的...
这次Cocos2d-x 3.13.1与Spine 3.6的整合,意味着开发者可以利用Spine的强大功能,为游戏带来更生动的角色动作和更丰富的视觉效果。 首先,我们需要了解Cocos2d-x与Spine的集成过程。在Cocos2d-x项目中,你需要将...
4. **Action系统**:cocos2d-x的动作系统允许开发者轻松实现物体的移动、旋转、缩放等效果,极大地简化了动画制作。 5. **Scene和Layer**:通过Scene和Layer的概念,可以组织游戏的场景和层次结构,方便管理游戏...
这个压缩包“cocos2d-x-cocos2d-x-2.2.2.zip”包含了cocos2d-x 的2.2.2版本,该版本是cocos2d-x发展中的一个重要里程碑,它提供了许多改进和优化,使得开发者能够更加高效地创建2D游戏和应用。 在cocos2d-x 2.2.2中...
同时,音效和音乐管理也是游戏体验的重要组成部分,书中会介绍如何使用Cocos2d-x的音频API来播放和控制音频资源。 在实际项目开发中,内存管理和性能优化是关键。本书可能会详细讲解Cocos2d-x中的内存管理机制,如...
《cocos2d-x 3.0:游戏开发中的角色移动技术详解》 在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更...
《cocos2d-x 2.1.4:探索移动游戏开发的新篇章》 cocos2d-x 是一个跨平台的2D游戏开发框架,它为开发者提供了强大的工具和技术支持,使得游戏开发变得更为便捷。2.1.4 版本是这个框架的一个重要里程碑,它在前一...
- **动作(Action)**:cocos2d-x提供了丰富的动作类,如移动、旋转、缩放,用于实现角色和物体的动画效果。 - **层(Layer)**:作为游戏界面的基本单位,用于组织和管理屏幕上的元素。 - **物理引擎(Box2D)**...
首先,Cocos2d-x的核心特性在于它的渲染引擎,它提供了丰富的2D图形绘制功能,如精灵(Sprite)、批次渲染(Batching)、动作(Actions)和转换(Transitions)。开发者可以通过Lua语言调用这些功能,创建出动态的、...
- 掌握Cocos2d-x的基本架构:Cocos2d-x框架中包括场景(Scene)、层(Layer)、精灵(Sprite)、动作(Action)等基本组件,学习如何使用这些组件来构建游戏逻辑。 - 理解资源管理:在Cocos2d-x中,资源管理是开发...
cocos2d-x的动画系统支持帧动画和动作(Action)动画。帧动画可以通过`CCSpriteBatchNode`和`CCAnimation`类来实现,将多张图片序列化成一个动画效果。动作动画则包括平移、旋转、缩放等多种效果,可以组合形成复杂...
1. 动画系统:cocos2d-x的动画系统通过组合.plist文件创建精灵动画,例如角色的跑动、跳跃动作。 2. 地图拼接:TMX或CSV格式的文件描述了游戏地图的结构,cocos2d-x的TiledMap类可以加载这些文件,动态拼接地图,...
总的来说,这个"Cocos2d-x横版动作手游完整源码Source"是学习和开发横版动作游戏的宝贵资源。通过深入研究源代码,开发者不仅可以掌握Cocos2d-x框架的用法,还能了解到游戏设计、优化和调试的实践技巧。无论是新手...
Cocos2d-x支持音频播放,开发者可以使用AudioEngine或SimpleAudioEngine类加载、播放和控制音效。在《保卫萝卜》中,每个动作、事件都有对应的音效,提升了游戏的沉浸感。 此外,Cocos2d-x支持多平台发布,包括...
1. **Cocos2d-x架构**:了解Cocos2d-x的核心组件,如场景(Scene)、层(Layer)、精灵(Sprite)、动作(Action)等,以及如何用Lua来控制这些元素。 2. **Lua与C++交互**:Cocos2d-x支持Lua作为脚本语言,源码会展示如何...
cocos2d-x提供了一系列的动作类和动画类,这些类可以帮助开发者轻松实现复杂的动画效果。例如,通过组合简单的动作可以创建复杂的动画序列。 #### 4. 触摸事件处理(Touch Event Handling) 对于移动设备来说,...
Cocos2d-x 是一个开源的游戏开发框架,主要用于创建2D游戏、图形界面以及实时应用程序。这个框架基于C++,并且提供了多种语言接口,包括Python、JavaScript和Lua,让开发者可以选择他们熟悉的编程语言进行游戏开发。...
1. **性能优化**:cocos2d-x 3.x对渲染引擎进行了大量优化,提升了游戏运行速度和帧率,同时降低了内存消耗,使游戏运行更加流畅。 2. **新API设计**:采用更加现代化的C++11标准,提供了更简洁、面向对象的API,让...