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));                             ⑥

}

上述代码实现了顺序动作演示其中主要使用的类是SequenceSequence是派生于ActionInterval属性间隔动作。Sequence作用就是顺序排列若干个动作然后按先后次序逐个执行。代码⑥行执行SequenceSequence的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动作。第④行代码是创建顺序动作对象seqseq的类型为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))是执行反动作。

更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
本书交流讨论网站http://www.cocoagame.net

更多精彩视频课程请关注智捷课堂Cocos课程http://v.51work6.com

欢迎加入Cocos2d-x技术讨论群257760386

《Cocos2d-x实战 C++卷》现已上线各大商店均已开售

京东http://item.jd.com/11584534.html

亚马逊http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当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

欢迎关注智捷iOS课堂微信公共平台

时间: 2024-10-05 12:43:59

Cocos2d-x手机游戏开发中-组合动作的相关文章

手机游戏开发中如何选择适合的纹理格式

为毛要写这个 本来觉得像这样的问题,是无法归类的,因为不同的项目有不同的需求,但今天因为quick论坛中的一个技术疑问贴,钩起了我整理这篇文章的兴趣 http://www.cocoachina.com/bbs/read.php?tid=214811 于是,我决定尽力描述一下纹理格式选择方面的问题,一是起到一个科普的作用,因为目前没有发现十分完整的讲这方面的文章.二是整理一下自己的思路. 当然,这些东西肯定不是我自己凭空YY出来的,我也是参考了不少文章,也从项目中总结了一些问题.在此先列出一些链接

手机游戏开发成为安卓应用中的重中之重

目前,对于现在的中国大陆智能手机操作系统市场来说,占大部分份额的还是安卓系统.塞班系统还有ios系统三大手机系统.当然还有一部分智能手机是使用的别的系统的,例如黑莓公司使用的就是其公司本身研发的系统黑莓系统.但不得不承认,在这么多系统中安卓系统了是风头最劲的一个.不管是安卓系统的制造商还是软件开发者都具有永不松懈的创新创新精神,而且安卓系统对于"未来适用于各类链接性设备"的定位也使更多的开发商加入其中!不难预测,安卓未来的前景非常广阔. 随着HTC.MOTO.联想,中兴.华为.三星等手

Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化

  关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记! 原文地址:http://blog.csdn.net/xiaominghimi/archive/2011/01/10/6127578.aspx 先上一段代码大家来看一下: view plaincopy to clipboardprint? ·········10········20········30········40········50········60········70········80····

安卓应用增长迅速 手机游戏开发是重点

中介交易 SEO诊断 淘宝客 云主机 技术大厅 现在的中国大陆智能手机操作系统市场份额大部分是由安卓系统.塞班系统还有ios系统三大手机系统所占领.当然还有一些智能手机是使用的别的系统的,例如黑莓公司使用的就是其公司本身研发的系统黑莓系统.在这么多系统中现在风头正劲应该说是安卓系统了.不管是安卓系统的制造商还是软件开发者都具有永不松懈的创新创新精神,而且安卓系统对于"未来适用于各类链接性设备"的定位也使更多的开发商加入其中! 随着HTC.MOTO.联想,中兴.华为.三星等手机制造商的加

Android 重力传感器在游戏开发中的应用_Android

      手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性.本节将继续介绍智能手机的另一种神奇之处:传感器.        一.何为传感器        所谓传感器就是能够探测如光.热.温度.重力.方向等等的装置.        二.Android提供了哪些传感器        1.加速度传感器(重力传感器)        2.陀螺仪传感器        3.光传感器        4.恒定磁场传感器       

资深设计师Tony Ventrice解析手机游戏开发的四个层次

营销人员可能明白强势品牌的重要性,但却对游戏机制一无所知:程序员可能深谙强大游戏机制的意义所在,但对游戏机制的传达方式一窍不通.这样的营销人员和程序员都无法各自打造出成功的游戏.因为一款成功的游戏离不开跨领域的协调性,然而,我们经常见到情况就如上所述,游戏制作团队的成员往往只熟悉游戏设计中面向己方的专业知识,对其他学科的知识所知甚少. 此时游戏设计师的职责显得尤为关键把不同专业的观点融合为全面的设计构想.如果设计师做不到,结果就是,团队里的成员各忙各的,把时间和精力浪费在毫不相干的工作上. 游戏

Android 重力传感器在游戏开发中的应用

手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性.本节将继续介绍智能手机的另一种神奇之处:传感器. 一.何为传感器 所谓传感器就是能够探测如光.热.温度.重力.方向等等的装置. 二.Android提供了哪些传感器 1.加速度传感器(重力传感器) 2.陀螺仪传感器 3.光传感器 4.恒定磁场传感器 5.方向传感器 6.恒定的压力传感器 7.接近传感器 8.温度传感器 今天我们给大家介绍的是游戏开发中最最常见的,用到的频

监听器在游戏开发中的应用----消息回调

我一向是不太喜欢给一些东西强加上个名字.但为了随波逐流,我还是这样做了. 在我们的游戏开发中,通常会遇到两个模块之间的通信. 回调估计是最常用的方式了. 回调的设计思想很简单,就是两个对象相互注册,然后在需要的时候调用对方的函数. 如下: class B;   class A   {   public:       void RegisterCallback(B* pB)       {           m_pB = pB;       }       void ActiveA()     

J2ME游戏开发中时钟的简单实现

时钟 在游戏开发中,有时候我们需要一个时钟来记录游戏的时间,如果时间结束则结束游戏.本文介绍如何在J2ME中使用Timer和TimerTask来实现这样一个时钟,并给出具体代码实例. 在java.util包中有一个TimerTask类,你可以扩展这个类并且实现他的run()方法,在run()方法中编写我们的逻辑代码.如果我们想制作一个游戏时钟,那么非常简单我们编写一个GameClock类扩展TimerTask,GameClock需要维持一个实例变量timeLeft,这样我们就可以记录游戏剩余的时