Cocos2d-x 3.4 Action管理(ActionManager)总结

Cocos2d-x Action管理

动作管理类CCActionManager是一个管理所有动作的单例,工作原理是:当CCNode执行runAction时,该函数会把动作通过动作管理类的addAction函数将对象传递给CCActionManager的单例,该实例再把这个动作添加到自己的动作序列中。

动作管理单例通过定时刷新自己的update方法,在这个方法中去调用行为序列中每个动作的step(暂停的行为不会update),这些step方法再根据自身的完成进度去update或是结束行为。

实际上是由动作管理单例驱动的每个动作去更新自己的逻辑,而runAction方法只是将行为对象添加进CCActionManager的待执行队列。当节点被清除或是行为结束时,动作管理类会自动将动作从队列中删除,不需要程序员的管理。

一般情况下,不需要使用这个单例来管理动作,可以使用CCNode类的stopAction、stopActionByTag和stopActions等函数来管理、但是有两种情况需要使用CCActionManager类单例:

<1>
动作的执行者不是同一个节点。 <2> 需要暂停/重启活动时。

一、CC_CALLBACK_0
不带参数

auto child =
Sprite::create("Images/grossini.png");

Rect r =
Director::getInstance()->getOpenGLView()->getVisibleRect();

Vec2 v2 =
Vec2(r.origin.x+300,r.origin.y/2+r.size.height-300);

child->setPosition(v2);

addChild(child,1);

child->runAction(RotateBy::create(1.5f,90));//顺时针旋转
90度

child->runAction(Sequence::create(DelayTime::create(1.4f),FadeOut::create(1.1f),nullptr));//1.4秒后,消失

child->runAction(Sequence::create(DelayTime::create(1.4f),CallFunc::create(CC_CALLBACK_0(HelloWorld::remove,this)),nullptr));//1.4秒后,执行remove方法

void
HelloWorld::remove(){

CCLOG("bbbbbbbbbb");

}

二、CC_CALLBACK_1
带一个参数

auto child1 =
Sprite::create("Images/grossini.png");

addChild(child1,0,2);

Rect r1 =
Director::getInstance()->getOpenGLView()->getVisibleRect();

Vec2 v2 =
Vec2(r1.origin.x+300,r1.origin.y/2+r1.size.height-300);

child1->setPosition(v2);

child1->runAction(Sequence::create(MoveBy::create(1,Vec2(150,0)),CallFuncN::create(CC_CALLBACK_1(HelloWorld::update1,this)),nullptr));

void
HelloWorld::update1(Node*
node){

node->stopAllActions();

node->runAction(ScaleTo::create(2,2));

//removeChild(node);

}

三、CC_SCHEDULE_SELECTOR先执行一个动作然后定时执行某个动作

auto child2 =
Sprite::create("Images/grossini.png");

addChild(child2,0,121);

Rect r1 =
Director::getInstance()->getOpenGLView()->getVisibleRect();

Vec2 v2 =
Vec2(r1.origin.x + 300,r1.origin.y/2 + r1.size.height
-300);

child2->setPosition(v2);

auto action =
MoveBy::create(1,Vec2(150,0));

auto director =
Director::getInstance();

director->getActionManager()->addAction(action,child2,true);

schedule(CC_SCHEDULE_SELECTOR(HelloWorld::unpause),3);//3秒后执行unpause方法

void
HelloWorld::unpause(float
dt){

//unschedule(CC_SCHEDULE_SELECTOR(HelloWorld::unpause));

auto node =getChildByTag(121);

auto director =
Director::getInstance();

CCAction* action1 =
CCRotateBy::create(1, 360);

//director->getActionManager()->resumeTarget(node);

node->runAction(action1);

}

四、执行完某个动作后停止动作

auto child2 
= Sprite::create("Images/grossini.png");

Rect r1 =
Director::getInstance()->getOpenGLView()->getVisibleRect();

Vec2 v2 =
Vec2(r1.origin.x +300,r1.origin.y/2 +r1.size.height
-300);

child2->setPosition(v2);

addChild(child2,0,111);

auto pmove =
MoveBy::create(2,Vec2(200,0));

auto pCallback = CallFunc::create(CC_CALLBACK_0(HelloWorld::stopAction,this));

auto pSequence = Sequence::create(pmove,pCallback,nullptr);

pSequence->setTag(121);

child2->runAction(pSequence);

void
HelloWorld::stopAction(){

auto sprite =getChildByTag(111);

sprite->stopActionByTag(121);

}

五、停止所有动作,但保持某个动作

auto pmove1 =
MoveBy::create(2,Vec2(200,0));

auto pmove2 =
MoveBy::create(2,Vec2(200,0));

auto pSequenceMove =
Sequence::createWithTwoActions(pmove1,pmove2);

auto pRepeatMove =
RepeatForever::create(pSequenceMove);

pRepeatMove->setTag(111);

auto pScale1 =
ScaleBy::create(2,1.5f);

auto pScale2 =
ScaleBy::create(2,1.0f/1.5f);

auto pSequenceScale =
Sequence::createWithTwoActions(pScale1,pScale2);

auto pRepeatScale =
RepeatForever::create(pSequenceScale);

pRepeatScale->setTag(111);

auto pRotate =
RotateBy::create(2,360);

auto pRepeateRotate =
RepeatForever::create(pRotate);

auto pChild =
Sprite::create("Images/grossini.png");

Rect r =
Director::getInstance()->getOpenGLView()->getVisibleRect();

Vec2 v2 =
Vec2(r.origin.x + 300, r.size.height -300);

pChild->setPosition(v2);

addChild(pChild,1,112);

pChild->runAction(pRepeatMove);

pChild->runAction(pRepeatScale);

pChild->runAction(pRepeateRotate);

this->scheduleOnce((SEL_SCHEDULE)& HelloWorld::stopAction,4);

void
HelloWorld::stopAction(float
time){

auto sprite =getChildByTag(112);

sprite->stopAllActionsByTag(111);

}

六、一段时间后执行一次某个动作

Rect r =
Director::getInstance()->getOpenGLView()->getVisibleRect();

Vec2 v2 =
Vec2(r.origin.x + 300,r.size.height -300);

auto child =
Sprite::create("Images/grossini.png");

addChild(child,0,111);

child->setPosition(v2;

//child->runAction(ScaleBy::create(2,2));

auto director =
Director::getInstance();

//director->getActionManager()->pauseTarget(child);//貌似不起作用

//child->runAction(RotateBy::create(2,360));

this->schedule(CC_SCHEDULE_SELECTOR(HelloWorld::resumeChild),8.0f);

void
HelloWorld::resumeChild(float
time){

//this->unschedule(CC_SCHEDULE_SELECTOR(HelloWorld::resumeChild));
//加上这句只执行一次,否则每8秒调用一次

auto child =getChildByTag(111);

auto director =
Director::getInstance();

//director->getActionManager()->resumeTarget(child);//貌似不起作用

child->runAction(RotateBy::create(2,360));

}



时间: 2024-08-11 14:47:55

Cocos2d-x 3.4 Action管理(ActionManager)总结的相关文章

untiy3d action管理机制的编写

使用unity3d对于一些可视化强迫者来说,是一个不错的选择,但unity3d没有cocos2d的action管理机制,比如cocos2dx的CCMoveTo,CCScale等action,所以笔者通过封装action管理来实现类似cocos2dx的actionmanager. 首先需要写一个ActionManager来创建.更新.移除所有action.编写代码实现如下: using UnityEngine;using System.Collections;using System; publi

Cocos2d之&ldquo;引用计数&rdquo;内存管理机制实现解析

一.引言 本文主要分析cocos2d游戏开发引擎的引用计数内存管理技术的实现原理.建议读者在阅读本文之前阅读笔者之前一篇介绍如何使用cocos2d内存管理技术的文章--<Cocos2d之Ref类与内存管理使用详解>. 二.相关概念 引用计数 引用计数是计算机编程语言的一种内存管理技术,是指将资源(对象.内存或者磁盘空间等)的被引用计数保存起来,当引用计数变为零时就将资源释放的过程.使用引用计数技术可以实现自动内存管理的目的. 当实例化一个类时,对象的引用计数为1,在其他对象需要持有这个对象时,

Vuex入门(5)—— 为什么要用Action管理异步操作

Action 类似于 mutation,不同在于: 1.Action 提交的是 mutation,而不是直接变更状态. 2.Action 可以包含任意异步操作. 官方给的定义我没什么意见,事实上我通过mutation异步操作,好像跟用action管理也没什么区别.关于为什么要用Action管理异步操作,我会通过一个简单的例子和一个复杂的例子来进行说明,事实上,如果初学者没有考虑到实际场景的复杂情况,会觉得Action根本没有一点软用,这个时候就要把问题想得复杂一些了,然后才能看到Action的作

cocos2d-x3.3 源码分析之-动作Action和ActionManager

写这篇文章,没有花我多少时间.但是由于我的笔记写在云笔记中,图片也多.csdn也不支持直接复制粘贴图片,可以说把笔记移植过来比我当初写还要费事,希望改进吧 从入口开始分析,我们来看看addaction函数,他接受一个动作,并绑定自己,是否暂停取决于节点的running属性. 我们来具体看看ActionManager这个类 class CC_DLLActionManager : public Ref { public: ActionManager(void); ~ActionManager(voi

Cocos2d-x3.0模版容器详解之三:cocos2d::Value

1.概述 版本: v3.0 beta 语言: C++ 定义在 "COCOS2DX_ROOT/cocos/base" 路径下的 "CCValue.h" 的头文件中. ? 1 class Value; cocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vector<Value>, std::unordered_map<s

Cocos2d-x3.0模版容器详解之——cocos2d::Vector&lt;T&gt;, cocos2d::Map&lt;K,V&gt;, cocos2d::Value

Cocos2d-x3.0模版容器详解之一:cocos2d::Vector<T>  http://www.cocoachina.com/bbs/read.php?tid=199793Cocos2d-x3.0模版容器详解之二:cocos2d::Map<K,V>  http://www.cocoachina.com/bbs/read.php?tid=199916Cocos2d-x3.0模版容器详解之三:cocos2d::Value  http://www.cocoachina.com/b

cocos2d-x 3.1.1 学习笔记[3]Action 动作

这些动画貌似都非常多的样子,就所有都创建一次. 代码例如以下: /* 动画*/ auto sp = Sprite::create("card_bg_big_26.jpg"); Size size = Director::getInstance()->getWinSize(); sp->setScale(0.2); sp->setPosition(Vec2(size.width / 2 + 200, size.height / 2 + 200)); sp->set

Elasticsearch 集群管理工具curator 接口模式使用介绍

安装配置参考文档:http://blog.51cto.com/michaelkang/2333586 curator 接口模式使用介绍 curator的命令行语法如下: curator [--config CONFIG.YML] [--dry-run] ACTION_FILE.YML --config : 之后跟上配置文件 --dry-run :调试参数,测试脚本运行是否正常: ACTION_FILE.YML :action文件中可以包含一连串的action,curator接口集中式的confi

【STL】哈希表 uthash.h

散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构.线性表查找的时间复杂度为O(n)而平衡二叉树的查找的时间复杂度为O(log(n)).无论是采用线程表或是树进行存储,都面临面随着数据量的增大,查找速度将不同程度变慢的问题.而哈希表正好解决了这个问题. 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数 函