require('../core/platform/CCClass');
var js = require('../core/platform/js');
/* 動(dòng)作管理類 */
/*
* @class HashElement
* @constructor--構(gòu)造函數(shù)
* @private--私有
*/
var HashElement = function () {
? ? this.actions = [];//存儲(chǔ)具體的action
? ? this.target = null; //ccobject
? ? this.actionIndex = 0;
? ? this.currentAction = null; //CCAction
? ? this.paused = false;
? ? this.lock = false;
};
/**
* !#en
* cc.ActionManager is a class that can manage actions.<br/>
* Normally you won't need to use this class directly. 99% of the cases you will use the CCNode interface,
* which uses this class's singleton object.
* But there are some cases where you might need to use this class. <br/>
* Examples:<br/>
* - When you want to run an action where the target is different from a CCNode.<br/>
* - When you want to pause / resume the actions<br/>
* !#zh
* cc.ActionManager 是可以管理動(dòng)作的單例類。<br/>
* 通常你并不需要直接使用這個(gè)類宪迟,99%的情況您將使用 CCNode 的接口。<br/>
* 但也有一些情況下狐蜕,您可能需要使用這個(gè)類。 <br/>
* 例如:
*? - 當(dāng)你想要運(yùn)行一個(gè)動(dòng)作街氢,但目標(biāo)不是 CCNode 類型時(shí)挪捕。 <br/>
*? - 當(dāng)你想要暫停/恢復(fù)動(dòng)作時(shí)。 <br/>
* @class ActionManager
* @example {@link cocos2d/core/CCActionManager/ActionManager.js}
*/
cc.ActionManager = function () {
? ? /* object 容器葵第,存儲(chǔ)了所有的動(dòng)作node 的 uuid绅你,*/
? ? /* 哈希map-object 存儲(chǔ)node */
? ? this._hashTargets = js.createMap(true);
? ? /* 數(shù)組存儲(chǔ)node */
? ? this._arrayTargets = [];
? ? /* 所有的存儲(chǔ)的arr中的node,都在時(shí)時(shí)update凑队,update時(shí)時(shí)運(yùn)行的node则果,遍歷的其中一個(gè) */
? ? this._currentTarget = null;
? ? cc.director._scheduler && cc.director._scheduler.enableForTarget(this);
};
/* 設(shè)置cc.ActionManager的原型對(duì)象 */
cc.ActionManager.prototype = {
? ? constructor: cc.ActionManager,
? ? /* 元素池,數(shù)組類型 */
? ? _elementPool: [],
? ? /* 根據(jù)target查找element */
? ? _searchElementByTarget: function (arr, target) {
? ? ? ? for (var k = 0; k < arr.length; k++) {
? ? ? ? ? ? if (target === arr[k].target)
? ? ? ? ? ? ? ? return arr[k];
? ? ? ? }
? ? ? ? return null;
? ? },
? ? /* 獲取一個(gè)element info漩氨,設(shè)置target西壮,設(shè)置pause屬性 */
? ? _getElement: function (target, paused) {
? ? ? ? var element = this._elementPool.pop();
? ? ? ? /* 當(dāng)element不存在的時(shí)候,new一個(gè) */
? ? ? ? if (!element) {
? ? ? ? ? ? element = new HashElement();
? ? ? ? }
? ? ? ? element.target = target;
? ? ? ? /* !!強(qiáng)制轉(zhuǎn)換成布爾類型 */
? ? ? ? element.paused = !!paused;
? ? ? ? /* 返回element */
? ? ? ? return element;
? ? },
? ? /* 把element元素直接放到容器叫惊,重置element屬性款青,回收 */
? ? _putElement: function (element) {
? ? ? ? /* node的actions數(shù)組的長(zhǎng)度為0 */
? ? ? ? element.actions.length = 0;
? ? ? ? /*? */
? ? ? ? element.actionIndex = 0;
? ? ? ? /* 元素的當(dāng)前action為空 */
? ? ? ? element.currentAction = null;
? ? ? ? /* 設(shè)置暫停屬性為false */
? ? ? ? element.paused = false;
? ? ? ? /* 設(shè)置target為空 */
? ? ? ? element.target = null;
? ? ? ? /* 設(shè)置lock屬性為false */
? ? ? ? element.lock = false;
? ? ? ? /* 回收info,放到pool池 */
? ? ? ? this._elementPool.push(element);
? ? },
? ? /**
? ? * !#en
? ? * Adds an action with a target.<br/>
? ? * If the target is already present, then the action will be added to the existing target.
? ? * If the target is not present, a new instance of this target will be created either paused or not, and the action will be added to the newly created target.
? ? * When the target is paused, the queued actions won't be 'ticked'.
? ? * !#zh
? ? * 增加一個(gè)動(dòng)作霍狰,同時(shí)還需要提供動(dòng)作的目標(biāo)對(duì)象抡草,目標(biāo)對(duì)象是否暫停作為參數(shù)。<br/>
? ? * 如果目標(biāo)已存在蔗坯,動(dòng)作將會(huì)被直接添加到現(xiàn)有的節(jié)點(diǎn)中康震。<br/>
? ? * 如果目標(biāo)不存在,將為這一目標(biāo)創(chuàng)建一個(gè)新的實(shí)例步悠,并將動(dòng)作添加進(jìn)去签杈。<br/>
? ? * 當(dāng)目標(biāo)狀態(tài)的 paused 為 true瘫镇,動(dòng)作將不會(huì)被執(zhí)行
? ? *
? ? * @method addAction
? ? * @param {Action} action
? ? * @param {Node} target
? ? * @param {Boolean} paused
? ? */
? ? addAction: function (action, target, paused) {
? ? ? ? if (!action || !target) {
? ? ? ? ? ? cc.errorID(1000);
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? //check if the action target already exists
? ? ? ? /* 檢查操作目標(biāo)是否已存在 */
? ? ? ? /* * !#zh 主要用于編輯器的 uuid鼎兽,在編輯器下可用于持久化存儲(chǔ),在項(xiàng)目構(gòu)建之后將變成自增的 id铣除。
? ? ? ? */
? ? ? ? var element = this._hashTargets[target._id];
? ? ? ? //if doesn't exists, create a hashelement and push in mpTargets
? ? ? ? /* 如果不存在谚咬,則創(chuàng)建一個(gè) hashelement 并推入 mpTargets */
? ? ? ? if (!element) {
? ? ? ? ? ? element = this._getElement(target, paused);//獲取一個(gè)element
? ? ? ? ? ? this._hashTargets[target._id] = element;//根據(jù)node uuid 存儲(chǔ)info object存儲(chǔ)
? ? ? ? ? ? this._arrayTargets.push(element);//array add info
? ? ? ? }
? ? ? ? else if (!element.actions) {//當(dāng)element存在,并且element的actions-動(dòng)作array為空
? ? ? ? ? ? element.actions = [];
? ? ? ? }
? ? ? ? element.actions.push(action);//info的action容器添加一個(gè)action
? ? ? ? action.startWithTarget(target);//action 設(shè)置target尚粘,
? ? },
? ? /**
? ? * !#en Removes all actions from all the targets.
? ? * !#zh 移除所有對(duì)象的所有動(dòng)作择卦。
? ? * @method removeAllActions
? ? */
? ? removeAllActions: function () {
? ? ? ? var locTargets = this._arrayTargets;
? ? ? ? /* 遍歷數(shù)組-info */
? ? ? ? for (var i = 0; i < locTargets.length; i++) {
? ? ? ? ? ? var element = locTargets[i];
? ? ? ? ? ? if (element)
? ? ? ? ? ? ? ? this._putElement(element);//回收elementinfo
? ? ? ? }
? ? ? ? /* 清空數(shù)組 */
? ? ? ? this._arrayTargets.length = 0;
? ? ? ? //重新創(chuàng)建一個(gè)map 給hashTargets賦值
? ? ? ? this._hashTargets = js.createMap(true);
? ? },
? ? /**
? ? * !#en
? ? * Removes all actions from a certain target. <br/>
? ? * All the actions that belongs to the target will be removed.
? ? * !#zh
? ? * 移除指定對(duì)象上的所有動(dòng)作。<br/>
? ? * 屬于該目標(biāo)的所有的動(dòng)作將被刪除郎嫁。
? ? * @method removeAllActionsFromTarget
? ? * @param {Node} target
? ? * @param {Boolean} forceDelete
? ? */
? ? removeAllActionsFromTarget: function (target, forceDelete) {
? ? ? ? // explicit null handling
? ? ? ? if (target == null)
? ? ? ? ? ? return;
? ? ? ? /* 從map中找到對(duì)應(yīng)的info */
? ? ? ? var element = this._hashTargets[target._id];
? ? ? ? if (element) {
? ? ? ? ? ? /* 清空數(shù)組 */
? ? ? ? ? ? element.actions.length = 0;
? ? ? ? ? ? this._deleteHashElement(element);
? ? ? ? }
? ? },
? ? /**
? ? * !#en Removes an action given an action reference.
? ? * !#zh 移除指定的動(dòng)作秉继。
? ? * @method removeAction
? ? * @param {Action} action
? ? */
? ? removeAction: function (action) {
? ? ? ? // explicit null handling
? ? ? ? /* 空action處理 */
? ? ? ? if (!action) {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? /* 獲取原始目標(biāo)節(jié)點(diǎn)。 */
? ? ? ? var target = action.getOriginalTarget();
? ? ? ? /* 從map中獲取info--element */
? ? ? ? var element = this._hashTargets[target._id];
? ? ? ? /* info不存在則return */
? ? ? ? if (!element) {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? /* 遍歷action數(shù)組 找到對(duì)應(yīng)的action */
? ? ? ? for (var i = 0; i < element.actions.length; i++) {
? ? ? ? ? ? /* 找到對(duì)應(yīng)的action */
? ? ? ? ? ? if (element.actions[i] === action) {
? ? ? ? ? ? ? ? /* 刪除action */
? ? ? ? ? ? ? ? element.actions.splice(i, 1);
? ? ? ? ? ? ? ? // update actionIndex in case we are in tick. looping over the actions
? ? ? ? ? ? ? ? /* 如果我們處于勾選狀態(tài)泽铛,請(qǐng)更新actionIndex尚辑。循環(huán)操作 */
? ? ? ? ? ? ? ? if (element.actionIndex >= i)
? ? ? ? ? ? ? ? ? ? element.actionIndex--;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? },
? ? /* 根據(jù)action的tag,移除某個(gè)node的action */
? ? _removeActionByTag(tag, element, target) {
? ? ? ? /* 遍歷某個(gè)具體info下的所有action */
? ? ? ? for (var i = 0, l = element.actions.length; i < l; ++i) {
? ? ? ? ? ? var action = element.actions[i];
? ? ? ? ? ? /* 某個(gè)action的tag和要找的tag一致 */
? ? ? ? ? ? if (action && action.getTag() === tag) {
? ? ? ? ? ? ? ? /* 如果target和action的target屬性不一致盔腔,則跳過(guò) */
? ? ? ? ? ? ? ? if (target && action.getOriginalTarget() !== target) {
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? /* 從action數(shù)組中刪除具體的action */
? ? ? ? ? ? ? ? this._removeActionAtIndex(i, element);
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? },
? ? /**
? ? * !#en Removes an action given its tag and the target.
? ? * !#zh 刪除指定對(duì)象下特定標(biāo)簽的一個(gè)動(dòng)作杠茬,將刪除首個(gè)匹配到的動(dòng)作月褥。
? ? * @method removeActionByTag
? ? * @param {Number} tag
? ? * @param {Node} [target]
? ? */
? ? removeActionByTag: function (tag, target) {
? ? ? ? /* tag不合法 */
? ? ? ? if (tag === cc.Action.TAG_INVALID)
? ? ? ? ? ? cc.logID(1002);
? ? ? ? /* 哈希map容器 */
? ? ? ? let hashTargets = this._hashTargets;
? ? ? ? if (target) {
? ? ? ? ? ? var element = hashTargets[target._id];
? ? ? ? ? ? /* info找到 */
? ? ? ? ? ? if (element) {
? ? ? ? ? ? ? ? this._removeActionByTag(tag, element, target);
? ? ? ? ? ? }
? ? ? ? }/* 假如target參數(shù)為空,則遍歷所有匹配key 根據(jù)找到的info進(jìn)行傳參刪除 */
? ? ? ? else {
? ? ? ? ? ? for (let name in hashTargets) {
? ? ? ? ? ? ? ? let element = hashTargets[name];
? ? ? ? ? ? ? ? this._removeActionByTag(tag, element);
? ? ? ? ? ? }
? ? ? ? }
? ? },
? ? /**
? ? * !#en Gets an action given its tag an a target.
? ? * !#zh 通過(guò)目標(biāo)對(duì)象和標(biāo)簽獲取一個(gè)動(dòng)作瓢喉。
? ? * @method getActionByTag
? ? * @param {Number} tag
? ? * @param {Node} target
? ? * @return {Action|Null}? return the Action with the given tag on success
? ? */
? ? getActionByTag: function (tag, target) {
? ? ? ? /* tag不合法報(bào)錯(cuò) */
? ? ? ? if (tag === cc.Action.TAG_INVALID)
? ? ? ? ? ? cc.logID(1004);
? ? ? ? /* 根據(jù)targed的id獲取到info */
? ? ? ? var element = this._hashTargets[target._id];
? ? ? ? if (element) {
? ? ? ? ? ? /* info的actions數(shù)組不為空宁赤,進(jìn)行遍歷actions,進(jìn)行tag比較 */
? ? ? ? ? ? if (element.actions != null) {
? ? ? ? ? ? ? ? for (var i = 0; i < element.actions.length; ++i) {
? ? ? ? ? ? ? ? ? ? var action = element.actions[i];
? ? ? ? ? ? ? ? ? ? if (action && action.getTag() === tag)
? ? ? ? ? ? ? ? ? ? ? ? return action;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? cc.logID(1005, tag);
? ? ? ? }
? ? ? ? return null;
? ? },
? ? /**
? ? * !#en
? ? * Returns the numbers of actions that are running in a certain target. <br/>
? ? * Composable actions are counted as 1 action. <br/>
? ? * Example: <br/>
? ? * - If you are running 1 Sequence of 7 actions, it will return 1. <br/>
? ? * - If you are running 7 Sequences of 2 actions, it will return 7.
? ? * !#zh
? ? * 返回指定對(duì)象下所有正在運(yùn)行的動(dòng)作數(shù)量栓票。 <br/>
? ? * 組合動(dòng)作被算作一個(gè)動(dòng)作决左。<br/>
? ? * 例如:<br/>
? ? *? - 如果您正在運(yùn)行 7 個(gè)動(dòng)作組成的序列動(dòng)作(Sequence),這個(gè)函數(shù)將返回 1逗载。<br/>
? ? *? - 如果你正在運(yùn)行 2 個(gè)序列動(dòng)作(Sequence)和 5 個(gè)普通動(dòng)作哆窿,這個(gè)函數(shù)將返回 7。<br/>
? ? *
? ? * @method getNumberOfRunningActionsInTarget
? ? * @param {Node} target
? ? * @return {Number}
? ? */
? ? /* 返回指定對(duì)象下所有正在運(yùn)行的動(dòng)作數(shù)量 */
? ? getNumberOfRunningActionsInTarget: function (target) {
? ? ? ? /* 找對(duì)應(yīng)的info */
? ? ? ? var element = this._hashTargets[target._id];
? ? ? ? /* 返回?cái)?shù)組的長(zhǎng)度 */
? ? ? ? if (element)
? ? ? ? ? ? return (element.actions) ? element.actions.length : 0;
? ? ? ? return 0;
? ? },
? ? /**
? ? * !#en Pauses the target: all running actions and newly added actions will be paused.
? ? * !#zh 暫停指定對(duì)象:所有正在運(yùn)行的動(dòng)作和新添加的動(dòng)作都將會(huì)暫停厉斟。
? ? * @method pauseTarget
? ? * @param {Node} target
? ? */
? ? /* 暫停某個(gè)對(duì)象的所有action */
? ? pauseTarget: function (target) {
? ? ? ? var element = this._hashTargets[target._id];
? ? ? ? if (element)
? ? ? ? ? ? element.paused = true;
? ? },
? ? /**
? ? * !#en Resumes the target. All queued actions will be resumed.
? ? * !#zh 讓指定目標(biāo)恢復(fù)運(yùn)行挚躯。在執(zhí)行序列中所有被暫停的動(dòng)作將重新恢復(fù)運(yùn)行。
? ? * @method resumeTarget
? ? * @param {Node} target
? ? */
? ? /* 回復(fù)action的運(yùn)行 */
? ? resumeTarget: function (target) {
? ? ? ? /* 根據(jù)對(duì)象id獲取info */
? ? ? ? var element = this._hashTargets[target._id];
? ? ? ? if (element)
? ? ? ? ? ? element.paused = false;
? ? },
? ? /**
? ? * !#en Pauses all running actions, returning a list of targets whose actions were paused.
? ? * !#zh 暫停所有正在運(yùn)行的動(dòng)作擦秽,返回一個(gè)包含了那些動(dòng)作被暫停了的目標(biāo)對(duì)象的列表码荔。
? ? * @method pauseAllRunningActions
? ? * @return {Array}? a list of targets whose actions were paused.
? ? */
? ? /* 暫停所有正在運(yùn)行的動(dòng)作,返回一個(gè)包含了那些動(dòng)作被暫停了的目標(biāo)對(duì)象的列表感挥。 */
? ? pauseAllRunningActions: function () {
? ? ? ? var idsWithActions = [];
? ? ? ? /* 存儲(chǔ)info的數(shù)組 */
? ? ? ? var locTargets = this._arrayTargets;
? ? ? ? /* 遍歷容器 */
? ? ? ? for (var i = 0; i < locTargets.length; i++) {
? ? ? ? ? ? var element = locTargets[i];
? ? ? ? ? ? /* info沒(méi)pause的缩搅,設(shè)置為pause為true */
? ? ? ? ? ? if (element && !element.paused) {
? ? ? ? ? ? ? ? element.paused = true;
? ? ? ? ? ? ? ? /* 把對(duì)應(yīng)都放到數(shù)組 */
? ? ? ? ? ? ? ? idsWithActions.push(element.target);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? /* 返回?cái)?shù)組 */
? ? ? ? return idsWithActions;
? ? },
? ? /**
? ? * !#en Resume a set of targets (convenience function to reverse a pauseAllRunningActions or pauseTargets call).
? ? * !#zh 讓一組指定對(duì)象恢復(fù)運(yùn)行(用來(lái)逆轉(zhuǎn) pauseAllRunningActions 效果的便捷函數(shù))。
? ? * @method resumeTargets
? ? * @param {Array} targetsToResume
? ? */
? ? resumeTargets: function (targetsToResume) {
? ? ? ? /* 參數(shù)必須是數(shù)組触幼,不為空 */
? ? ? ? if (!targetsToResume)
? ? ? ? ? ? return;
? ? ? ? /* 遍歷數(shù)組硼瓣,獲取所有具體對(duì)象 */
? ? ? ? for (var i = 0; i < targetsToResume.length; i++) {
? ? ? ? ? ? if (targetsToResume[i])
? ? ? ? ? ? ? ? this.resumeTarget(targetsToResume[i]);
? ? ? ? }
? ? },
? ? /**
? ? * !#en Pause a set of targets.
? ? * !#zh 暫停一組指定對(duì)象。
? ? * @method pauseTargets
? ? * @param {Array} targetsToPause
? ? */
? ? pauseTargets: function (targetsToPause) {
? ? ? ? if (!targetsToPause)
? ? ? ? ? ? return;
? ? ? ? /* 遍歷存儲(chǔ)對(duì)象的數(shù)組 */
? ? ? ? for (var i = 0; i < targetsToPause.length; i++) {
? ? ? ? ? ? if (targetsToPause[i])
? ? ? ? ? ? ? ? this.pauseTarget(targetsToPause[i]);
? ? ? ? }
? ? },
? ? /**
? ? * !#en
? ? * purges the shared action manager. It releases the retained instance. <br/>
? ? * because it uses this, so it can not be static.
? ? * !#zh
? ? * 清除共用的動(dòng)作管理器置谦。它釋放了持有的實(shí)例堂鲤。 <br/>
? ? * 因?yàn)樗褂?this,因此它不能是靜態(tài)的媒峡。
? ? * @method purgeSharedManager
? ? */
? ? purgeSharedManager: function () {
? ? ? ? /* 取消指定對(duì)象的 update 定時(shí)器瘟栖。 */
? ? ? ? cc.director.getScheduler().unscheduleUpdate(this);
? ? },
? ? //protected
? ? /* 刪除固定數(shù)組下標(biāo)的info */
? ? _removeActionAtIndex: function (index, element) {
? ? ? ? /* 獲取固定的action */
? ? ? ? var action = element.actions[index];
? ? ? ? /* 刪除某個(gè)index的屬性 */
? ? ? ? element.actions.splice(index, 1);
? ? ? ? // update actionIndex in case we are in tick. looping over the actions
? ? ? ? /* 如果我們處于勾選狀態(tài),請(qǐng)更新actionIndex谅阿。循環(huán)操作 */
? ? ? ? if (element.actionIndex >= index)
? ? ? ? ? ? element.actionIndex--;
? ? ? ? ? ? /* 當(dāng)action數(shù)組為空的時(shí)候半哟,刪除這個(gè)info */
? ? ? ? if (element.actions.length === 0) {
? ? ? ? ? ? this._deleteHashElement(element);
? ? ? ? }
? ? },
? ? /* 刪除map內(nèi)存儲(chǔ)的這個(gè)info */
? ? _deleteHashElement: function (element) {
? ? ? ? var ret = false;
? ? ? ? if (element && !element.lock) {
? ? ? ? ? ? if (this._hashTargets[element.target._id]) {
? ? ? ? ? ? ? ? /* 從object 刪除info */
? ? ? ? ? ? ? ? delete this._hashTargets[element.target._id];
? ? ? ? ? ? ? ? var targets = this._arrayTargets;
? ? ? ? ? ? ? ? /* 遍歷數(shù)組 */
? ? ? ? ? ? ? ? for (var i = 0, l = targets.length; i < l; i++) {
? ? ? ? ? ? ? ? ? ? if (targets[i] === element) {
? ? ? ? ? ? ? ? ? ? ? ? targets.splice(i, 1);//刪除這個(gè)元素,從數(shù)組中
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? /* 回收info */
? ? ? ? ? ? ? ? this._putElement(element);
? ? ? ? ? ? ? ? ret = true;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return ret;
? ? },
? ? /**
? ? * !#en The ActionManager update签餐。
? ? * !#zh ActionManager 主循環(huán)寓涨。
? ? * @method update
? ? * @param {Number} dt delta time in seconds
? ? */
? ? update: function (dt) {
? ? ? ? /* 聲明locCurrTarget 臨時(shí)變量存儲(chǔ)的是info? locTargets是數(shù)組this._arrayTargets的重新賦值 */
? ? ? ? var locTargets = this._arrayTargets, locCurrTarget;
? ? ? ? for (var elt = 0; elt < locTargets.length; elt++) {
? ? ? ? ? ? this._currentTarget = locTargets[elt];
? ? ? ? ? ? /* 設(shè)置當(dāng)前target info */
? ? ? ? ? ? locCurrTarget = this._currentTarget;
? ? ? ? ? ? /* action沒(méi)有被暫停,并且存在actions */
? ? ? ? ? ? if (!locCurrTarget.paused && locCurrTarget.actions) {
? ? ? ? ? ? ? ? locCurrTarget.lock = true;
? ? ? ? ? ? ? ? // The 'actions' CCMutableArray may change while inside this loop.
? ? ? ? ? ? ? ? /* 在此循環(huán)內(nèi)氯檐,“動(dòng)作”CCMutableArray 可能會(huì)發(fā)生變化戒良。 */
? ? ? ? ? ? ? ? for (locCurrTarget.actionIndex = 0; locCurrTarget.actionIndex < locCurrTarget.actions.length; locCurrTarget.actionIndex++) {
? ? ? ? ? ? ? ? ? ? locCurrTarget.currentAction = locCurrTarget.actions[locCurrTarget.actionIndex];
? ? ? ? ? ? ? ? ? ? if (!locCurrTarget.currentAction)
? ? ? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? ? ? //use for speed
? ? ? ? ? ? ? ? ? ? locCurrTarget.currentAction.step(dt * (locCurrTarget.currentAction._speedMethod ? locCurrTarget.currentAction._speed : 1));
? ? ? ? ? ? ? ? ? ? if (locCurrTarget.currentAction && locCurrTarget.currentAction.isDone()) {
? ? ? ? ? ? ? ? ? ? ? ? locCurrTarget.currentAction.stop();
? ? ? ? ? ? ? ? ? ? ? ? var action = locCurrTarget.currentAction;
? ? ? ? ? ? ? ? ? ? ? ? // Make currentAction nil to prevent removeAction from salvaging it.
? ? ? ? ? ? ? ? ? ? ? ? /* 將 currentAction 設(shè)置為 nil 以防止 removeAction 搶救它。 */
? ? ? ? ? ? ? ? ? ? ? ? locCurrTarget.currentAction = null;
? ? ? ? ? ? ? ? ? ? ? ? /* 移除指定動(dòng)作 */
? ? ? ? ? ? ? ? ? ? ? ? this.removeAction(action);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? locCurrTarget.currentAction = null;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? locCurrTarget.lock = false;
? ? ? ? ? ? }
? ? ? ? ? ? // only delete currentTarget if no actions were scheduled during the cycle (issue #481)
? ? ? ? ? ? /* 僅當(dāng)周期內(nèi)未安排任何操作時(shí)才刪除 currentTarget(問(wèn)題 #481) */
? ? ? ? ? ? if (locCurrTarget.actions.length === 0) {//回收info
? ? ? ? ? ? ? ? this._deleteHashElement(locCurrTarget) && elt--;
? ? ? ? ? ? }
? ? ? ? }
? ? }
};
/* 測(cè)試環(huán)境男摧,拓展屬性isTargetPaused_TEST 蔬墩,判斷某個(gè)node的動(dòng)畫(huà)是否是paused */
if (CC_TEST) {
? ? cc.ActionManager.prototype.isTargetPaused_TEST = function (target) {
? ? ? ? /* 獲取某個(gè)info */
? ? ? ? var element = this._hashTargets[target._id];
? ? ? ? return element.paused;
? ? };
}