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/ ...
随机推荐
- centos7下mysql 用户管理和权限设置
1.进入mysql命令行,输入root及密码[root@localhost ~]# mysql -u root -pEnter password: Welcome to the MySQL monit ...
- 52 (OC)* 苹果手机各种尺寸详细表以及iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax屏幕适配
iPhone设备 物理分辨率是硬件所支持的,逻辑分辨率是软件可以达到的. 代数 设备 操作系统 逻辑分辨率(point) 物理分辨率(pixel) 屏幕尺寸(对角线长度) 缩放因子 iPhone ...
- 大白话讲解 BitSet
原理 BitSet是位操作的对象,值只有0或1即false和true,内部维护了一个long数组,初始只有一个long,所以BitSet最小的size是64,当随着存储的元素越来越多,BitSet内部 ...
- seo搜索引擎的优化方法
现在互联网的入口,一般都是被搜索引擎霸占.所以我们要想让别人搜索时,优先看到我们的网站.有两种方法: 1.竞价排名.这是需要钱的,给的钱越多,排名越靠前.参考某度.. 2.不想花钱,就使用seo搜索引 ...
- jenkins之插件下载方法
jenkins插件下载方法有两种,在线下载和离线下载方式 在线下载 就是在安装好了jenkins之后,进入jenkins的插件管理页面,搜索想要的插件,点击安装即可 例如:安装git插件 问题:有时候 ...
- jenkins自动化部署项目5 -- 系统管理-系统设置ssh配置
[系统管理]-[系统设置] 如果应用服务(前端后台)要部署在linux服务器上,我选择的是用ssh 为了jenkins登录远程登录linux服务器可以免密登录,先配置公钥和私钥: 我是在windows ...
- mysql创建数据库指定字符集和校对规则
mysql创建数据库的语法格式: CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] ...
- maven scope属性说明
一.scope属性: 依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中. compile (编译) compile是默认的范围:如果没有提供一个范围,那该依赖的范围就是编 ...
- 【ADO.NET基础】加密方法公共类
各种加密方法集锦: using System; using System.Security.Cryptography; using System.Text; using System.IO; usin ...
- SUSE Storage6 环境搭建详细步骤 - Win10 + VMware WorkStation
学习 SUSE Storage 系列文章 (1)SUSE Storage6 实验环境搭建详细步骤 - Win10 + VMware WorkStation (2)SUSE Linux Enterpri ...