Learning Cocos2d-x for WP8(8)——动作Action

原文:Learning Cocos2d-x for WP8(8)——动作Action

游戏很大程度上是由动作画面支撑起来的。

动作分为两大类:瞬间动作和延时动作。

瞬间动作基本等同于设置节点的属性,延时动作会执行一段时间,不需要清除这两种动作,一旦动作完成,就会从节点上清除并释放所占内存。

 

封装CCSpriteBatchNode的使用方法

BatchAnimatitonSprite

 1 CCSprite* SpriteActionLayer::BatchAnimatitonSprite(CCLayer* pLayer,CCSprite *pSprite, CCPoint* spriteStartPoint, const char *strFramesFileName,const char *strFramesFileNameImg,const char *strFirstFrameName,const char *strEachFrameName,int frameCount,float frameDelay)
 2 {
 3     //CCSpriteBatchNode
 4     //创建批处理节点,读取plist文件
 5     CCSpriteFrameCache* cache=CCSpriteFrameCache::sharedSpriteFrameCache();
 6     cache->addSpriteFramesWithFile(strFramesFileName,strFramesFileNameImg);
 7
 8     //起始精灵
 9     pSprite=CCSprite::spriteWithSpriteFrameName(strFirstFrameName);//纹理plist中包含strfirstFrameName
10     pSprite->setPosition(ccp(spriteStartPoint->x,spriteStartPoint->y));
11
12     CCSpriteBatchNode* spritebatch = CCSpriteBatchNode::batchNodeWithFile(strFramesFileNameImg);//与CCSpriteFrameCache同一纹理
13     spritebatch->addChild(pSprite);
14     pLayer->addChild(spritebatch,1);
15
16     //创建逐帧数组
17     CCMutableArray<CCSpriteFrame*>* animFrames1=new CCMutableArray<CCSpriteFrame*>(frameCount);
18     char str1[100]={0};
19     for(int i=0;i<frameCount;i++)
20     {
21         sprintf(str1,strEachFrameName,i);
22         CCSpriteFrame* pFrame=cache->spriteFrameByName( str1 );
23         animFrames1->addObject(pFrame);
24     }
25
26     CCAnimation* animation1=CCAnimation::animationWithFrames(animFrames1,frameDelay);
27     pSprite->runAction(CCRepeatForever::actionWithAction(CCAnimate::actionWithAnimation(animation1,false)));
28
29     animFrames1->release();
30     return pSprite;
31 }

重复动作

可以使一个动作或一系列的动作不停地重复无限循环,除非“外力”使其停止。

实例

1     //重复动作
2     CCSprite *role0=CCSprite::spriteWithFile("Sprite/Role.png");
3     role0->setPosition(ccp(100,s.height-100));
4     addChild(role0,1);
5     CCRotateBy* role0RotateBy=CCRotateBy::actionWithDuration(2.0f,360);
6     CCRepeatForever* role0Repeat=CCRepeatForever::actionWithAction(role0RotateBy);
7     role0->runAction(role0Repeat);

Sprite循环不停地旋转

流畅动画

CCEaseAction类能在一段时间内动作的流畅执行,使得更强大。而非简单地执行简单动画效果。

在实际运动过程中,匀速运动在启动和结束时往往会有一定的加速和减速的效果,这样更加的真实。

cocoos2d-x引擎提供了相关的API,免除了我们编写相关的算法实现的烦恼,实现起来相当的方便。

实现该方法的是CCActionEase中CCEaseRateAction系列,大体分成三类:

In:开始时候的加速度

Out:结束时候的加速度

InOut:开始结束时候的加速度

(以下图片来源其他博文,具体地址忘记了,以后再加上)

1.指数缓冲

EaseExponentialIn

EaseExponentialOut

EaseExponentialInOut

2.赛因缓冲

EaseSineIn

EaseSineOut

EaseSineInOut

3.弹性缓冲

EaseElasticIn

EaseElasticOut

EaseElasticInOut

4.跳跃缓冲

EaseBounceIn

EaseBounceOut

EaseBounceInOut

5.回震缓冲

EaseBackIn

EaseBackOut

EaseBackInOut

 

实例

1     //流畅动画
2     CCSprite* role1=NULL;
3     role1=SpriteActionLayer::BatchAnimatitonSprite(this,role1,new CCPoint(100,s.height/2),"Sprite/Plist/RoleRun.plist","Sprite/Plist/RoleRun.png","RoleRun0.png","RoleRun%d.png",10,0.2f);
4     CCMoveTo* role1Move=CCMoveTo::actionWithDuration(5,CCPointMake(s.width-100,s.height/2));//CCMoveTo绝对位置移动
5     CCEaseInOut* role1MoveEase=CCEaseInOut::actionWithAction(role1Move,4);//rate=4,决定流畅动画的明显程度,只有当它大于1时才能看到效果
6     role1->runAction(role1MoveEase);

可见,Sprite开始缓慢移动——加速——缓慢停止。

动作序列

通常情况下,Action动作执行添加多个动作时,它们会在同一时间运行,如上面的动作。但有时我们需要让动作一个接着一个运行。CCSequence将实现该功能。

实例

1     //动作序列
2     CCSprite* role2=NULL;
3     role2=SpriteActionLayer::BatchAnimatitonSprite(this,role2,new CCPoint(100,s.height/4),"Sprite/Plist/Role2Run.plist","Sprite/Plist/Role2Run.png","Role2Run0.png","Role2Run%d.png",10,0.3f);
4     CCMoveBy* role2MoveBy=CCMoveBy::actionWithDuration(5,CCPointMake(500,0));//CCMoveBy相对位置移动
5     CCJumpBy* role2JumpBy=CCJumpBy::actionWithDuration(1,CCPointMake(-500,0),100,1);//CCJumpBy相当位置jump
6     role2->runAction(CCSequence::actions(role2MoveBy,role2JumpBy,NULL));

Sprite跑动到指定位置后,下个动作就是弹跳回起始位置

瞬间动作

有时在一串动作中,需要改变Sprite的属性,然后在继续执行下个动作。瞬间动作将实现该功能,通常情况下依赖与CCCallFunc动作。

实例

1     //瞬时动作
2     CCSprite* role3=CCSprite::spriteWithFile("Sprite/Role.png");
3     role3->setPosition(ccp(s.width-100,s.height-100));
4     addChild(role3,1);
5     CCScaleTo * role3ScaleTo=CCScaleTo::actionWithDuration(2,2.0f);
6     CCCallFuncN* role3FunN=CCCallFuncN::actionWithTarget(this,callfuncN_selector(SpriteActionLayer::repeatForever));
7     role3->runAction(CCSequence::actions(role3ScaleTo,role3FunN,NULL));

repeatForever方法

1 void SpriteActionLayer::repeatForever(CCNode* pSender)
2 {
3     CCRepeatForever* repeat=CCRepeatForever::actionWithAction(CCSkewBy::actionWithDuration(5, 37.2f, -37.2f));//歪斜
4     pSender->runAction(repeat);
5 }

执行完ScaleTo后执行SkewBy

 

完整源码

SpriteActionTest.h

 1 #ifndef _SPRITE_ACTION_TEST_
 2 #define _SPRITE_ACTION_TEST_
 3
 4 #include "cocos2d.h"
 5 using namespace cocos2d;
 6
 7 class SpriteActionScene:public CCScene
 8 {
 9 public:
10     SpriteActionScene();
11     ~SpriteActionScene();
12
13     virtual void onEnter();
14
15 };
16
17
18
19 class SpriteActionLayer:public CCLayer
20 {
21 public:
22     SpriteActionLayer();
23     ~SpriteActionLayer();
24
25 public:
26     void repeatForever(CCNode* pTarget);
27     CCSprite* BatchAnimatitonSprite(CCLayer* pLayer,CCSprite *pSprite,CCPoint* spriteStartPoint,const char *strFramesFileName,const char *strFramesFileNameImg,const char *strFirstFrameName,const char *strEachFrameName,int frameCount,float frameDelay);
28 };
29
30
31
32 #endif

SpriteActionTest.cpp

  1 #include "pch.h"
  2 #include "Classes\SpriteActionTest.h"
  3
  4
  5 //----------------------------------------
  6 //
  7 //SpriteActionLayer
  8 //
  9 //----------------------------------------
 10 SpriteActionLayer::SpriteActionLayer()
 11 {
 12     CCSize s=CCDirector::sharedDirector()->getWinSize();
 13
 14     //重复动作
 15     CCSprite *role0=CCSprite::spriteWithFile("Sprite/Role.png");
 16     role0->setPosition(ccp(100,s.height-100));
 17     addChild(role0,1);
 18     CCRotateBy* role0RotateBy=CCRotateBy::actionWithDuration(2.0f,360);
 19     CCRepeatForever* role0Repeat=CCRepeatForever::actionWithAction(role0RotateBy);
 20     role0->runAction(role0Repeat);
 21
 22     //流畅动画
 23     CCSprite* role1=NULL;
 24     role1=SpriteActionLayer::BatchAnimatitonSprite(this,role1,new CCPoint(100,s.height/2),"Sprite/Plist/RoleRun.plist","Sprite/Plist/RoleRun.png","RoleRun0.png","RoleRun%d.png",10,0.2f);
 25     CCMoveTo* role1Move=CCMoveTo::actionWithDuration(5,CCPointMake(s.width-100,s.height/2));//CCMoveTo绝对位置移动
 26     CCEaseInOut* role1MoveEase=CCEaseInOut::actionWithAction(role1Move,4);//rate=4,决定流畅动画的明显程度,只有当它大于1时才能看到效果
 27     role1->runAction(role1MoveEase);
 28
 29     //动作序列
 30     CCSprite* role2=NULL;
 31     role2=SpriteActionLayer::BatchAnimatitonSprite(this,role2,new CCPoint(100,s.height/4),"Sprite/Plist/Role2Run.plist","Sprite/Plist/Role2Run.png","Role2Run0.png","Role2Run%d.png",10,0.3f);
 32     CCMoveBy* role2MoveBy=CCMoveBy::actionWithDuration(5,CCPointMake(500,0));//CCMoveBy相对位置移动
 33     CCJumpBy* role2JumpBy=CCJumpBy::actionWithDuration(1,CCPointMake(-500,0),100,1);//CCJumpBy相当位置jump
 34     role2->runAction(CCSequence::actions(role2MoveBy,role2JumpBy,NULL));
 35
 36     //瞬时动作
 37     CCSprite* role3=CCSprite::spriteWithFile("Sprite/Role.png");
 38     role3->setPosition(ccp(s.width-100,s.height-100));
 39     addChild(role3,1);
 40     CCScaleTo * role3ScaleTo=CCScaleTo::actionWithDuration(2,2.0f);
 41     CCCallFuncN* role3FunN=CCCallFuncN::actionWithTarget(this,callfuncN_selector(SpriteActionLayer::repeatForever));
 42     role3->runAction(CCSequence::actions(role3ScaleTo,role3FunN,NULL));
 43 }
 44
 45 void SpriteActionLayer::repeatForever(CCNode* pSender)
 46 {
 47     CCRepeatForever* repeat=CCRepeatForever::actionWithAction(CCSkewBy::actionWithDuration(5, 37.2f, -37.2f));//歪斜
 48     pSender->runAction(repeat);
 49 }
 50
 51 SpriteActionLayer::~SpriteActionLayer()
 52 {}
 53
 54 CCSprite* SpriteActionLayer::BatchAnimatitonSprite(CCLayer* pLayer,CCSprite *pSprite, CCPoint* spriteStartPoint, const char *strFramesFileName,const char *strFramesFileNameImg,const char *strFirstFrameName,const char *strEachFrameName,int frameCount,float frameDelay)
 55 {
 56     //CCSpriteBatchNode
 57     //创建批处理节点,读取plist文件
 58     CCSpriteFrameCache* cache=CCSpriteFrameCache::sharedSpriteFrameCache();
 59     cache->addSpriteFramesWithFile(strFramesFileName,strFramesFileNameImg);
 60
 61     //起始精灵
 62     pSprite=CCSprite::spriteWithSpriteFrameName(strFirstFrameName);//纹理plist中包含strfirstFrameName
 63     pSprite->setPosition(ccp(spriteStartPoint->x,spriteStartPoint->y));
 64
 65     CCSpriteBatchNode* spritebatch = CCSpriteBatchNode::batchNodeWithFile(strFramesFileNameImg);//与CCSpriteFrameCache同一纹理
 66     spritebatch->addChild(pSprite);
 67     pLayer->addChild(spritebatch,1);
 68
 69     //创建逐帧数组
 70     CCMutableArray<CCSpriteFrame*>* animFrames1=new CCMutableArray<CCSpriteFrame*>(frameCount);
 71     char str1[100]={0};
 72     for(int i=0;i<frameCount;i++)
 73     {
 74         sprintf(str1,strEachFrameName,i);
 75         CCSpriteFrame* pFrame=cache->spriteFrameByName( str1 );
 76         animFrames1->addObject(pFrame);
 77     }
 78
 79     CCAnimation* animation1=CCAnimation::animationWithFrames(animFrames1,frameDelay);
 80     pSprite->runAction(CCRepeatForever::actionWithAction(CCAnimate::actionWithAnimation(animation1,false)));
 81
 82     animFrames1->release();
 83     return pSprite;
 84 }
 85
 86 //----------------------------------------
 87 //
 88 //SpriteActionScene
 89 //
 90 //----------------------------------------
 91
 92 SpriteActionScene::SpriteActionScene()
 93 {}
 94
 95 SpriteActionScene::~SpriteActionScene()
 96 {}
 97
 98 void SpriteActionScene::onEnter()
 99 {
100     CCScene::onEnter();
101     CCLayer* spriteActionLayer=new SpriteActionLayer();
102     addChild(spriteActionLayer);
103     spriteActionLayer->release();
104 }

 

著作权声明:本文由http://www.cnblogs.com/suguoqiang 原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

时间: 2024-10-23 16:27:49

Learning Cocos2d-x for WP8(8)——动作Action的相关文章

cocos2d-基本概念(4)-CallFunc Action

CallFunc Action 允许你可以在一个action里面调用一个方法.在序列action里面的最后一个调用,会非常有用. Example: id actionTo = [MoveTo actionWithDuration: 2 position:ccp(s.width-40, s.height-40)]; id actionBy = [MoveBy actionWithDuration:2 position: ccp(80,80)]; id actionCallFunc = [CallF

Photoshop导航器和动作快捷键介绍

  Photoshop导航器和动作快捷键介绍         Home=到画布的左上角 End=到画布的右下角 PageUp=把画布向上滚动动一页 PageDown=把画布向下滚动动一页 Ctrl+PageUp=把画布向左滚动动一页 Ctrl+PageDown=把画布向右滚动动一页 Shift+PageUp=把画布向上滚动10个像素 Shift+PageDown=把画布向下滚动10个像素 Ctrl+Shift+PageUp=把画布向左滚动10个像素 Ctrl+Shift+PageDown=把画布

Photoshop导航器和动作的技巧

  大家用photoshop用的久了,就觉会得很多时候用键盘来控制导航器(navigation)比用鼠标更快捷.这里列出了一些常用的导航器快捷键: Home=到画布的左上角 End=到画布的右下角 PageUp=把画布向上滚动动一页 PageDown=把画布向下滚动动一页 Ctrl+PageUp=把画布向左滚动动一页 Ctrl+PageDown=把画布向右滚动动一页 Shift+PageUp=把画布向上滚动10个像素 Shift+PageDown=把画布向下滚动10个像素 Ctrl+Shift+

《从零开始学Swift》学习笔记(Day 64)——Cocoa Touch设计模式及应用之目标与动作

原创文章,欢迎转载.转载请注明:关东升的博客   目标(Target)与动作(Action)是iOS和OS X应用开发的中事件处理机制.   问题提出 如图所示是一个ButtonLabelSample案例设计原型图,其中包含一个标签和一个按钮,当点击按钮的时候,标签文本会从初始的Label替换为HelloWorld.   ButtonLabelSample案例首先要解决的问题是:按钮点击事件后有谁负责响应事件?谁进行事件处理?要答这个问题,可以打开ButtonLabelSample案例故事板文件

xcode-cocos2D中禁用触屏动作

问题描述 cocos2D中禁用触屏动作 有没有方法在cocos2D中完全禁止触屏动作? 比如在下载文件时用户不能进行任何按钮操作. 谢谢 解决方案 忽略所有用户交互: [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 恢复: [[UIApplication sharedApplication] endIgnoringInteractionEvents]; 解决方案二: 手动删除对菜单和图层的触摸 //Cocos

《编程原本 》一2.5 动作

2.5 动作 在算法里,变换f经常被用在如下形式的语句中x = f(x); 应用变换去改变对象的状态,就定义了相应对象上的一个动作(action).变换和动作之间有直接的对偶关系,可以基于变换来定义动作,反之亦然:void a(T& x) { x = f(x); } //从变换定义动作以及T f(T x) { a(x); return x; } //从动作定义变换 虽然存在这种对偶关系,但有时独立的实现效率更高,这种情况下就应该分别提供动作和变换.举例说,如果在很大的对象上定义变换,但是只修改整

增强学习——马尔科夫决策过程(MDP)

增强学习--马尔科夫决策过程(MDP),最近因为研究需要,要开始学习机器学习了.之前只是懂些CNN什么的皮毛,对机器学习的整体认识都比较缺乏,后面我会从头开始一点点打基础,正好也用博客把自己的学习历程记录一下,如果有大牛看到博文中有错误,欢迎指正! 增强学习(reinforcement learning,RL)是近年来机器学习和智能控制领域的主要方法之一.在增强学习中有三个概念:状态.动作和回报. "状态(state)"是描述当前情况的.对一个正在学习行走的机器人来说,状态是它的两条腿

Photoshop调出数码照片梦幻的柔焦风格

Photoshop的动作(aciton)可以说是不精通PS的人的宝贝.有了它我们可以方便的作出一些原本需要非常高超PS技巧的特效什么的.其实动作就是预先"录"制的一组命令,可以说就是图像自动处理命令功能. 本文将会介绍如何使用photoshop制作梦幻柔焦(orton)效果的动作,将一幅稍显生硬的照片变得梦幻生动起来.同时,你也可以用这个方法,录制其他动作(aciton).下面就跟随本文学习如何打造属于你的orton effect吧. 新建动作 在对图片进行了一系列的处理之后,可以制作

EJB 3.0+Beehive开发客户反馈系统

设计目标 客户反馈系统作为公司与客户交流的平台,几乎为所有的企业所运用,最近,公司让我负责客户反馈系统的开发.由于,公司与国外客户的业务需要,该系统必须实现中,英,日三国语言的切换(国际化要求).在接到任务之后,我便决定尝试使用目前开源社区比较流行的Apache Beehive(蜂巢)和下一代EJB,EJB3.0等技术来实现这个系统. 开发环境 选择平台,开发工具 为了支持EJB3.0和Beehive,我们选择JBoss4.0.3应用服务器作为运行平台,它也是目前唯一提供EJB3.0容器的应用服