CocosCreator 源碼.CCActionManager詳解

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;

? ? };

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末译打,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拇颅,更是在濱河造成了極大的恐慌奏司,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樟插,死亡現(xiàn)場(chǎng)離奇詭異韵洋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)黄锤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門搪缨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鸵熟,你說(shuō)我怎么就攤上這事副编。” “怎么了流强?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵痹届,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我打月,道長(zhǎng)队腐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任奏篙,我火速辦了婚禮柴淘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秘通。我一直安慰自己,他們只是感情好充易,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布梗脾。 她就那樣靜靜地躺著荸型,像睡著了一般盹靴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瑞妇,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天稿静,我揣著相機(jī)與錄音,去河邊找鬼辕狰。 笑死改备,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔓倍。 我是一名探鬼主播悬钳,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盐捷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了默勾?” 一聲冷哼從身側(cè)響起碉渡,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎母剥,沒(méi)想到半個(gè)月后滞诺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡环疼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年习霹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炫隶。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淋叶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伪阶,到底是詐尸還是另有隱情爸吮,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布望门,位于F島的核電站形娇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏筹误。R本人自食惡果不足惜桐早,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厨剪。 院中可真熱鬧哄酝,春花似錦、人聲如沸祷膳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)直晨。三九已至搀军,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勇皇,已是汗流浹背罩句。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敛摘,地道東北人门烂。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屯远。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蔓姚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容