Cocos2d-x手机游戏开发中-组合动作
动作往往不是单一,而是复杂的组合。我们可以按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作。组合动作包括以下几类:顺序、并列、有限次数重复、无限次数重复、反动作和动画。动画我们会在下一节介绍,本节我们重点顺序、并列、有限次数重复、无限次数重复和反动
下面我们通过一个实例介绍一下组合动作的使用,这个实例如下图所示,下图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的动作效果,点击Back按钮可以返回到菜单场景。
下面我们再看看具体的程序代码,首先看一下看HelloWorldScene.h文件,它的代码如下:
- #ifndef __HELLOWORLD_SCENE_H__
- #define __HELLOWORLD_SCENE_H__
- #include "cocos2d.h"
- #include "MyActionScene.h" ①
- typedef enum { ②
- kSequence = 100,
- kSpawn,
- kRepeate,
- kRepeatForever1,
- kReverse
- } 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__
上述代码是中第①行是引入头文件MyActionScene.h。第②~③是定义个枚举类型ActionTypes,枚举类型ActionTypes中定义了5个常量,这5个常量对应5个菜单项。第④行声明了一个函数,用来在选择不同菜单时候的回调。
在上诉代码大家比较熟悉了,我们这里就不再介绍了。下面我们再看看下一个场景MyActionScene,它的MyActionScene.h代码如下:
- #ifndef __MYACTION_SCENE_H__
- #define __MYACTION_SCENE_H__
- #include "cocos2d.h"
- #include "HelloWorldScene.h"
- class MyAction : public cocos2d::Layer
- {
- cocos2d::Sprite *sprite;
- public:
- staticcocos2d::Scene* createScene();
- virtual bool init();
- CREATE_FUNC(MyAction);
- void goMenu(cocos2d::Ref* pSender);
- void backMenu(cocos2d::Ref* pSender);
- voidOnSequence(cocos2d::Ref* pSender); ①
- void OnSpawn(cocos2d::Ref* pSender);
- void OnRepeat(cocos2d::Ref* pSender);
- void OnReverse(cocos2d::Ref* pSender);
- void OnRepeatForever(cocos2d::Ref* pSender); ②
- };
- #endif // __MYACTION_SCENE_H__
在.h文件中第①~②行代码是声明了5个用于菜单选择的回调函数。
MyActionScene的实现代码MyActionScene.ccp文件,其中点击Go按钮时候调用的函数MyAction::goMenu代码如下:
- void MyAction::goMenu(Ref* pSender)
- {
- log("Tag= %i",this->getTag());
- switch (this->getTag()) {
- casekSequence:
- this->OnSequence(pSender);
- break;
- casekSpawn:
- this->OnSpawn(pSender);
- break;
- casekRepeate:
- this->OnRepeat(pSender);
- break;
- casekRepeatForever1:
- this->OnRepeatForever(pSender);
- break;
- case kReverse:
- this->OnReverse(pSender);
- break;
- default:
- break;
- }
- }
我们在这个函数中根据选择菜单不同调用不同的函数。
- MyActionScene.ccp中MyActionLayer::OnSequence代码如下:
- void MyAction::OnSequence(Ref* pSender)
- {
- Size size = Director::getInstance()->getVisibleSize();
- Pointp = Point(size.width/2, 200);
- FiniteTimeAction* ac0 =(FiniteTimeAction*)sprite->runAction(Place::create(p)); ①
- FiniteTimeAction* ac1 = (FiniteTimeAction*)sprite->runAction(
- MoveTo::create(2,Point(size.width- 130, size.height - 200))); ②
- FiniteTimeAction* ac2 = (FiniteTimeAction*)sprite->runAction(
- JumpBy::create(2,Point(8, 8),6, 3)); ③
- FiniteTimeAction* ac3 =(FiniteTimeAction*)sprite->runAction(Blink::create(2,3)); ④
- FiniteTimeAction* ac4 = (FiniteTimeAction*)sprite->runAction(
- TintBy::create(0.5,0,255,255)); ⑤
- sprite->runAction(Sequence::create(ac0,ac1, ac2, ac3, ac4, ac0, NULL)); ⑥
- }
上述代码实现了顺序动作演示,其中主要使用的类是Sequence,Sequence是派生于ActionInterval属性间隔动作。Sequence作用就是顺序排列若干个动作,然后按先后次序逐个执行。代码⑥行执行Sequence,Sequence的create函数需要动作数组。代码第①行创建Place动作,由于Sequence的create函数需要FiniteTimeAction类型的动作,因此需要将表达式sprite->runAction(Place::create(p))强制转换为FiniteTimeAction*类型。类似的代码第②~⑤行都需要强制类型转换。第②行代码是创建MoveTo动作,第③行代码是创建JumpBy动作。第④行代码是创建Blink动作。第⑤行代码是创建TintBy动作。
MyActionScene.ccp中MyActionLayer::OnSpawn,这个函数是在演示并列动作时候调用的函数,它的代码如下:
- void MyAction::OnSpawn(Ref* pSender)
- {
- Size size = Director::getInstance()->getVisibleSize();
- Pointp = Point(size.width/2, 200);
- sprite->setRotation(0); ①
- sprite->setPosition(p); ②
- FiniteTimeAction* ac1 = (FiniteTimeAction*)sprite->runAction(
- MoveTo::create(2,Point(size.width- 100, size.height - 100))); ③
- FiniteTimeAction* ac2 =(FiniteTimeAction*)sprite->runAction(RotateTo::create(2, 40)); ④
- sprite->runAction(Spawn::create(ac1,ac2,NULL)); ⑤
- }
上述代码实现了并列动作演示,其中主要使用的类是Spawn类也从ActionInterval继承而来,该类作用就是同时并列执行若干个动作,但要求动作都必须 是可以同时执行的。比如:移动式翻转、改变色、改变大小等。第⑤行代码sprite->runAction(Spawn::create(ac1,ac2,NULL))执行并列动作,create函数的动作类型数组。第①行代码sprite->setRotation(0)设置精灵旋转角度保持原来状态。第②行代码sprite->setPosition(p)是重新设置精灵位置。第③行代码创建MoveTo动作。第④行代码创建RotateTo动作。
MyActionScene.ccp中MyActionLayer::OnRepeat,这个函数是在演示重复动作时候调用的函数,它的代码如下:
- void MyAction::OnRepeat(Ref* pSender)
- {
- Size size = Director::getInstance()->getVisibleSize();
- Pointp = Point(size.width/2, 200);
- sprite->setRotation(0);
- sprite->setPosition(p);
- FiniteTimeAction* ac1 = (FiniteTimeAction*)sprite->runAction(
- MoveTo::create(2,Point(size.width- 100, size.height - 100))); ①
- FiniteTimeAction* ac2 = (FiniteTimeAction*)sprite->runAction(
- JumpBy::create(2,Point(10,10), 20,5)); ②
- FiniteTimeAction* ac3 = (FiniteTimeAction*)sprite->runAction(
- JumpBy::create(2,Point(-10,-10),20,3)); ③
- ActionInterval* seq = Sequence::create(ac1, ac2, ac3, NULL); ④
- sprite->runAction(Repeat::create(seq,3)); ⑤
- }
上述代码实现了重复动作演示,其中主要使用的类是Repeat类也从ActionInterval继承而来。第①行代码是创建MoveTo动作。第②行代码是创建JumpBy动作。第③行代码是创建JumpBy动作。第④行代码是创建顺序动作对象seq,seq的类型为ActionInterval*或FiniteTimeAction*。第⑤行代码sprite->runAction(Repeat::create(seq,3)) 重复运行顺序动作3次,create函数参数的类型是FiniteTimeAction。
MyActionScene.ccp中MyActionLayer::OnRepeatForever,这个函数是在演示无限重复动作时候调用的函数,它的代码如下:
- void MyAction::OnRepeatForever(Ref*pSender)
- {
- Size size = Director::getInstance()->getVisibleSize();
- Point p = Point(size.width/2, 500);
- sprite->setRotation(0);
- sprite->setPosition(p);
- ccBezierConfigbezier; ①
- bezier.controlPoint_1 = Point(0, size.height/2);
- bezier.controlPoint_2= Point(10, -size.height/2);
- bezier.endPosition= Point(10,20); ②
- FiniteTimeAction* ac1 =(FiniteTimeAction*)sprite->runAction(BezierBy::create(2,bezier)); ③
- FiniteTimeAction* ac2 = (FiniteTimeAction*)sprite->runAction(
- TintBy::create(0.5,0, 255, 255)); ④
- FiniteTimeAction* ac1Reverse = ((ActionInterval*)ac1)->reverse(); ⑤
- FiniteTimeAction* ac2Repeat = (FiniteTimeAction*)sprite->runAction(
- Repeat::create((ActionInterval*)ac2,4)); ⑥
- FiniteTimeAction* ac3 = (FiniteTimeAction*)sprite->runAction(
- Spawn::create(ac1,ac2Repeat,NULL)); ⑦
- FiniteTimeAction* ac4 = (FiniteTimeAction*)sprite->runAction(
- Spawn::create(ac1Reverse,ac2Repeat,NULL)); ⑧
- ActionInterval* seq = Sequence::create(ac3, ac4, NULL); ⑨
- sprite->runAction(RepeatForever::create(seq)); ⑩
- }
上述代码实现了重复动作演示,其中主要使用的类是RepeatForever,它也从ActionInterval继承而来。第⑩行代码sprite->runAction(RepeatForever::create(seq))是执行无限重复动作,create函数参数的类型是FiniteTimeAction。代码第①~②行是定义贝塞尔曲线控制点。第③行代码创建贝塞尔曲线动作BezierBy。第④行代码创建动作TintBy。第⑤行代码是创建BezierBy动作的反转动作。第⑥行代码是创建重复动作。第⑦和⑧行代码是创建并列动作。第⑨行代码是创建顺序动作。
MyActionScene.ccp中MyActionLayer::OnReverse,这个函数是在演示反动作时候调用的函数,它的代码如下:
- void MyAction::OnReverse(Ref* pSender)
- {
- Size size = Director::getInstance()->getVisibleSize();
- Pointp = Point(size.width/2, 300);
- sprite->setRotation(0);
- sprite->setPosition(p);
- FiniteTimeAction* ac1 = (FiniteTimeAction*)sprite->runAction(
- MoveBy::create(2,Point(40,60))); ①
- Action* ac2 = ac1->reverse(); ②
- ActionInterval* seq = Sequence::create(ac1, ac2, NULL); ③
- sprite->runAction(Repeat::create(seq,2)); ④
- }
上述代码实现了反动作演示,支持顺序动作的反顺序动作,反顺序动作不是一个类,不是所有的动作类都支持反动作。XxxTo 类通常不支持反动作,XxxBy类通常支持。第①行代码是创建一个移动MoveBy动作。第②行代码调用ac1的reverse()函数执行反动作。第③行代码是创建顺序动作。第④行代码sprite->runAction(Repeat::create(seq,2))是执行反动作。
Cocos2d-x手机游戏开发中-组合动作的更多相关文章
- Android——Cocosd2d-x手机游戏开发学习思路
手机APP应用如雨后春笋般冒了出来,而在众多的APP应用中,游戏占据了半壁江山.它丰富着人们的业余生活,增进了人们之间的沟通交流.也有许多开发的朋友对游戏开发情有独钟,他们不止是享受着有很多的人们去下 ...
- 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?
如题! 首先说一说学习手机游戏(移动游戏)这件事. 眼下移动互联网行业的在以井喷状态发展.全球几十亿人都持有智能终端设备(ios android),造就了非常多移动互联网创业机会: 一.移动社交 微信 ...
- 二、Cocos2dx概念介绍(游戏开发中不同的坐标系,cocos2dx锚点)
注:ccp是cocos2dx中的一个宏定义,#define ccp(__X__,__Y__)CCPointMake((float)__X__, (float)__Y__),在此文章中表示坐标信息 1. ...
- [C++基金会]位计算 游戏开发中的应用
定义的位操作:通俗点说,,位计算是计算机操作二进制整数. 无论整数可以用二的方式来表示进度,不同类型的其长度的整数位的是不一样的.INT8要么char靠8个月2 位表示,INT16或者short是由1 ...
- Unity3D手机游戏开发
<Unity3D手机游戏开发> 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 ...
- 【Cocos2D研究院之游戏开发】
http://www.xuanyusong.com/archives/category/ios/cocos2d_game 分类目录归档:[Cocos2D研究院之游戏开发] 201211-19 Co ...
- [Unity游戏开发]向量在游戏开发中的应用(三)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51088236 在上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景.本 ...
- [Unity游戏开发]向量在游戏开发中的应用(二)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...
- [Unity游戏开发]向量在游戏开发中的应用(一)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50810102 向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只 ...
随机推荐
- IIS功能查看、配置
#获取所有IIS功能列表: get-webconfiguration -filter /system.webserver #查看目录浏览功能的配置信息:Get-WebConfiguration -fi ...
- 【M2】最好使用C++转型操作符
1.C语言中的转型操作符有两个问题: a.是个通用的转换操作符,也就是说,可以从一个类型转换到其他类型.通用必定是低效率和冗余的,因为要考虑很多情况. b.在代码中,难以辨认出哪些是类型转换. 2.C ...
- Codeforces Round #313 (Div. 2) A. Currency System in Geraldion 水题
A. Currency System in Geraldion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/c ...
- show processlist 命令详解
如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的 MySQL 帐户运行的线程). mysql> show processlist; +—–+— ...
- [Canvas] Make Canvas Responsive to Pixel Ratio
Canvas is great for high performance graphics rendering but by default the results look blocky on ph ...
- 工作vs.学�
近一两年来,我先后对[工作与学习]的复杂过程有过多次的头脑风暴,而且感觉在这方面略有所成(看这里和这里):当然既然仅仅是头脑风暴,所谓的所成也仅仅是一些粗糙的想法,一些没有实证过的如果,算是积累而已, ...
- mysql备份工具 :mysqldump mydumper Xtrabackup 原理
备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低.衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(R ...
- HDFS原理讲解
简介 本文是笔者在学习HDFS的时候的学习笔记整理, 将HDFS的核心功能的原理都整理在这里了. [广告] 如果你喜欢本博客,请点此查看本博客所有文章:http://www.cnblogs.com/x ...
- 如何用jquery操作table的方法
今天我在做你约我吧交友www.niyuewo.com网项目时遇到一个问题,就是如何用qjuery控制table的添加.编辑与删除,经过网上查资料发现用jquery很容易实现,在此整理下来供大家参考: ...
- 如何用eclispe远程调试tomcat--转载
原文地址:http://jingyan.baidu.com/article/0320e2c1f4ef6b1b87507b06.html tomcat是一种非常常见的java web应用服务器,有时候服 ...