Cocos2d-x 学习笔记(8) ActionManager
1. 概述
ActionManager管理所有的action,调度所有的action,删除指定的action。每个action对应一个node对象,action存储在actions中,actions和node绑定在一个element中。
2. 学习
2.1 在哪使用
Director类中有成员ActionManager类单例对象指针_actionManager。
Director类在创建时调用到Director::init(void)方法,有以下操作:
_actionManager = new (std::nothrow) ActionManager();
_scheduler->scheduleUpdate(_actionManager, Scheduler::PRIORITY_SYSTEM, false);
scheduleUpdate方法是执行了schedulePerFrame方法,_actionManager的update方法作为回调函数,故该update方法在每帧被调用。
schedulePerFrame方法执行后,_actionManager作为target,update方法作为回调函数新建优先级最高的Timer。
2.2 一些成员
ActionManager类成员变量:
struct _hashElement *_targets; // Element容器
struct _hashElement *_currentTarget; // 当前的Element
bool _currentTargetSalvaged;
ActionManager类结构体变量:
typedef struct _hashElement
{
struct _ccArray *actions;
Node *target;
int actionIndex;
Action *currentAction; // 当前Action
bool currentActionSalvaged;
bool paused;
UT_hash_handle hh;
} tHashElement;
2.3 update方法
简要的说,update方法是对哈希链表_targets的每个element作为_currentTarget,再把每个element的action作为currentAction,其中包含对action和element的延后release()。
ActionManager的update(float dt)方法执行大致流程:

2.4 addAction方法
addAction(Action *action, Node *target, bool paused)方法执行流程:

新建element时,会对target执行retain()。
action添加到actions时,执行ccArrayAppendObject(element->actions, action),对action执行retain()。
2.5 pause resume
pauseTarget(Node *target)
resumeTarget(Node *target)
resumeTargets(const Vector<Node*>& targetsToResume)
上面这3个方法对target对应的element的paused变量置true或false。
pauseAllRunningActions()方法,对哈希链表_targets的每个element的成员pause置true,并用Vector<Node*> idsWithActions保存暂停了的target。添加到容器时,这些target执行retain(),在手动调用恢复方法resumeTargets(const Vector<Node*>& targetsToResume)后,对Vector容器执行clear()方法,此时对target执行release()。
2.6 remove
删除action操作归纳到以下两种方法:
removeAllActionsFromTarget(Node *target)
removeActionAtIndex(ssize_t index, tHashElement *element)
removeAllActionsFromTarget方法
首先通过target从哈希链表_targets中查找对应的element。如果是element的currentAction且currentActionSalvaged为false,说明该action被target执行,对于这个action要retain(),并currentActionSalvaged置true,下一步的release()延后执行。再执行ccArrayRemoveObjectAtIndex,所有action执行release(),之后只有currentAction没被删除。actions为空就要删除element了,此时若_currentTarget为当前element,即target正在执行,_currentTargetSalvaged置true,暂不删除element。
removeActionAtIndex方法
从element的actions中对指定的action执行release(),若currentAction为当前action则延后release(),并修改标志currentActionSalvaged为true。之后若actions为空,在删除element之前,若_currentTarget为当前element,_currentTargetSalvaged置true并暂不删除。
2.7 currentActionSalvaged _currentTargetSalvaged
currentActionSalvaged属于element,_currentTargetSalvaged属于ActionManager。
在ActionManager的update方法中,在对当前遍历到的element进行所有操作之前,_currentTargetSalvaged置false,在对element的actions遍历结束后,判断_currentTargetSalvaged。若在遍历actions时,有action被remove操作,之后需要判断actions是否为空,为空则置_currentTargetSalvaged为true。即在对element的actions遍历结束后才能对release()无action的element。
在对action执行step(dt)之前,currentActionSalvaged置false,执行step(dt)结束之后,再判断currentActionSalvaged,即对removeAction方法指定的action执行release()需要在step(dt)执行之后真正执行。
Cocos2d-x 学习笔记(8) ActionManager的更多相关文章
- 【Cocos2d-x】学习笔记目录
从2019年7月开始学习游戏引擎Cocos2dx,版本3.17. 学习笔记尽量以白话的形式表达自己对源码的理解,而不是大篇幅复制粘贴源码. 本人水平有限,欢迎批评指正! Cocos2d-x 学习笔记 ...
- cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建
一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何 ...
- android cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)
引用:http://weimingtom.iteye.com/blog/1483566 (20121108)注意:这篇文章用cdt编译ndk工程的内容已过时(现在可以用adt-bundle,避免配置繁 ...
- [Cocos2d-x for WP8学习笔记] HelloWorld结构分析
先来看一下目录结构: Assets:游戏资源文件,图片音频等,Resource文件夹也有类似功能 include:用于放置游戏头文件 Shaders:渲染器着色器文件(大雾) cocos2dorig. ...
- cocos2d-x实战 C++卷 学习笔记--第4章 字符串 __String类
前言: <cocos2d-x实战C++卷>学习笔记.(cocos2d-x 是3.0版本) 介绍 cocos2d-x 通用的字符串类 __String . 使用cocos2d::__Str ...
- Cocos2d-x学习笔记(17)(TestCpp源代码分析-1)
TestCpp源代码基于Cocos2d-x2.1.3版本号,部分资源来自红孩儿的游戏编程之路CSDN博客地址http://blog.csdn.net/honghaier/article/details ...
- 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴
上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音
<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...
- cocos2d-html5学习笔记(六)--alpha2中cc.Sequence.create中的bug
cocos2d-html5学习笔记(六)--alpha2中cc.Sequence.create中的bug http://blog.csdn.net/allenice1/article/details/ ...
随机推荐
- Oracle创建自增主键表
1.创建表 /*第一步:创建表格*/ create table t_user( id int primary key, --主键,自增长 username varchar(), password va ...
- LeetCode 1169. 查询无效交易
题目链接:https://leetcode-cn.com/problems/invalid-transactions/ 如果出现下述两种情况,交易 可能无效: 交易金额超过 ¥1000或者,它和另一个 ...
- tcp居然会数据延迟40ms被发送
tcpdump是很好的tcp分析工具,在此配合nc命令来学习tcpdump nc -l 8000 tcpdump -S -n -i lo tcp and host 127.0.0.1 and port ...
- XSS攻击-原理学习
本文优先发布于简书https://www.jianshu.com/p/04e0f8971890 1.百度百科XSS,跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样 ...
- JS替换字符串多余的空格符
var str = 'sdfsdfds '; str.replace(/(^\s*)|(\s*$)/g, "");
- [python]OS文件系统
1.getcwdd() 获得应用程序当前的工作目录 #getcwd() 获取应用程序当前的工作目录 import os print(os.getcwd()) 2.chdir(path) 改变当前工作目 ...
- java selenium 自动化笔记-不是0基础,至少有java基础
本来今天要学GitHub的,但是在群里问了下小伙伴时被暴击.说我学的东西太多太杂,不是很深入,都是皮毛.哎~自己早深有意识到,因个人能力吧,找的资料都不是很全,加上实际工作没有应用到.所以写一篇sel ...
- leveldb 源码--总体架构分析
一 本文目的 对leveldb的总体设计框架分析(关于leveldb基本原理,此文不做阐述,读者可以自行检索文章阅读即可),对leveldb中底层数据存储数据格式,内存数据模型,compact,版本管 ...
- CSS3相关编码规范
一.CSS书写顺序 1.位置属性(position, top, right, z-index, display, float等)2.大小(width, height, padding, margin) ...
- JS/Jquery 表单方式提交总结
1. submit提交 (1). submit 按钮式提交 缺点:在提交前不可修改提交的form表单数据 // 1. html <form method="post" act ...