今天碰到一個(gè)需求,要在動(dòng)作結(jié)束的回調(diào)函數(shù)中取到當(dāng)前動(dòng)作的精靈,實(shí)現(xiàn)在執(zhí)行動(dòng)作之后自動(dòng) remove 掉這個(gè)精靈。查了一下,沒有結(jié)果。然后看了一下 API ,發(fā)現(xiàn)利用 cc.CallFunc 構(gòu)造函數(shù)中的 data 參數(shù)可以解決這個(gè)問題。
下面是 cc.CallFunc 的構(gòu)造函數(shù)和 init 方法的實(shí)現(xiàn):
ctor:function(selector, selectorTarget, data){
cc.FiniteTimeAction.prototype.ctor.call(this);
if(selector !== undefined){
if(selectorTarget === undefined)
this.initWithFunction(selector);
else this.initWithFunction(selector, selectorTarget, data);
}
},
initWithFunction:function (selector, selectorTarget, data) {
if (selectorTarget) {
this._data = data;
this._callFunc = selector;
this._selectorTarget = selectorTarget;
}
else if (selector)
this._function = selector;
return true;
},
參數(shù) selector 和 selectorTarget 不贅述。注意到在 init 方法中,將 ctor 方法傳入的 data 賦給了 this 的 _data 。
再看它的 execute 方法 :
execute:function () {
if (this._callFunc != null) //CallFunc, N, ND
this._callFunc.call(this._selectorTarget, this.target, this._data);
else if(this._function)
this._function.call(null, this.target);
},
在執(zhí)行這個(gè)回調(diào)的時(shí)候?qū)?this._data 傳入了原方法中,這樣我們就可以將當(dāng)前動(dòng)作精靈指針傳入回調(diào)函數(shù),并在回調(diào)中取得它。
先構(gòu)造一個(gè)動(dòng)作隊(duì)列并運(yùn)行,代碼如下:
var actionSprite = new cc.Sprite("res/me.png");
actionSprite.setAnchorPoint(0, 0);
actionSprite.x = 0;
actionSprite.y = 0;
this.addChild(actionSprite, 1);
var moveAction0 = cc.MoveBy(0.5, cc.p(cc.winSize.width/2, 0));
var moveAction1 = cc.MoveBy(0.5, cc.p(0, cc.winSize.height/2));
var moveAction2 = cc.MoveBy(0.5, cc.p(-cc.winSize.width/2, 0));
var moveAction3 = cc.MoveBy(0.5, cc.p(0, -cc.winSize.height/2));
var actionCallbackFunction = cc.CallFunc(this.actionCallbackFunction, this);
var actionFinishCallbackFunction = cc.CallFunc(this.actionFinishCallFunction, this);
var actionArray = [];
actionArray.push(moveAction0);
actionArray.push(actionCallbackFunction);
actionArray.push(moveAction1);
actionArray.push(actionCallbackFunction);
actionArray.push(moveAction2);
actionArray.push(actionCallbackFunction);
actionArray.push(moveAction3);
actionArray.push(actionFinishCallbackFunction);
var actionSequence = cc.Sequence(actionArray);
actionSprite.runAction(actionSequence);
},
actionCallbackFunction : function(){
cc.log("Action Callback Function");
},
actionFinishCallFunction : function(){
cc.log("Action Finish Callback Function");
},
下面對(duì)以上代碼做一下小修改,來取得執(zhí)行動(dòng)作的精靈。
首先我們?cè)跇?gòu)造回調(diào)函數(shù)時(shí)要將精靈的指針作為 data 參數(shù)傳入:
var actionCallbackFunction = cc.CallFunc(this.actionCallbackFunction, this, actionSprite);
var actionFinishCallbackFunction = cc.CallFunc(this.actionFinishCallFunction, this, actionSprite);
其次我們要在定義回調(diào)方法的參數(shù)表中加入 data ,以便在函數(shù)實(shí)現(xiàn)中使用它:
actionCallbackFunction : function(data){
cc.log("Action Callback Function");
if (data != null && data != "undefine"){
cc.log("Get Data");
cc.log(typeof data);
cc.log(data.x);
cc.log(data.y);
}
},
actionFinishCallFunction : function(data){
cc.log("Action Finish Callback Function");
if (data != null && data != "undefine"){
cc.log("Get Data");
cc.log(typeof data);
cc.log(data.x);
cc.log(data.y);
}
data.removeFromParent();
},
運(yùn)行試試看~
控制臺(tái)這一部分輸出為:
JS: Action Callback Function
JS: Get Data
JS: object
JS: 400
JS: 0
JS: Action Callback Function
JS: Get Data
JS: object
JS: 400
JS: 225
JS: Action Callback Function
JS: Get Data
JS: object
JS: 0
JS: 225
JS: Action Finish Callback Function
JS: Get Data
JS: object
JS: 0
JS: 0
看到在每一次動(dòng)作執(zhí)行完畢后輸出 data 類型為 object 和精靈當(dāng)前的坐標(biāo),最后的 removeFromParent() 也成功了。
接下來試一下來構(gòu)造一個(gè)函數(shù),返回一個(gè)動(dòng)作隊(duì)列。這樣,只要?jiǎng)?chuàng)建動(dòng)作隊(duì)列然后在精靈上 runAction 就自動(dòng)實(shí)現(xiàn)了精靈動(dòng)作并在動(dòng)作結(jié)束之后自動(dòng)清掉這個(gè)精靈。
創(chuàng)建動(dòng)作隊(duì)列的代碼如下:
createActionSequence : function(actionSpritePointer){
var moveAction0 = cc.MoveBy(0.5, cc.p(cc.winSize.width/2, 0));
var moveAction1 = cc.MoveBy(0.5, cc.p(0, cc.winSize.height/2));
var moveAction2 = cc.MoveBy(0.5, cc.p(-cc.winSize.width/2, 0));
var moveAction3 = cc.MoveBy(0.5, cc.p(0, -cc.winSize.height/2));
var actionCallbackFunction = cc.CallFunc(this.actionCallbackFunction, this, actionSpritePointer);
var actionFinishCallbackFunction = cc.CallFunc(this.actionFinishCallFunction, this, actionSpritePointer);
var actionArray = [];
actionArray.push(moveAction0);
actionArray.push(actionCallbackFunction);
actionArray.push(moveAction1);
actionArray.push(actionCallbackFunction);
actionArray.push(moveAction2);
actionArray.push(actionCallbackFunction);
actionArray.push(moveAction3);
actionArray.push(actionFinishCallbackFunction);
var actionSequence = cc.Sequence(actionArray);
return actionSequence;
}
參數(shù) actionSpritePointer 要在創(chuàng)建時(shí)傳入要執(zhí)行這個(gè)動(dòng)作隊(duì)列的精靈,這樣,就能把這個(gè)精靈的指針傳入回調(diào)函數(shù)中。
創(chuàng)建動(dòng)作隊(duì)列并執(zhí)行的代碼如下:
var actionSprite0 = new cc.Sprite("res/me.png");
var actionSprite1 = new cc.Sprite("res/me.png");
actionSprite0.setAnchorPoint(0, 0);
actionSprite1.setAnchorPoint(1, 0);
actionSprite0.x = 0;
actionSprite0.y = 0;
actionSprite1.x = cc.winSize.width/2;
actionSprite1.y = 0;
this.addChild(actionSprite0);
this.addChild(actionSprite1);
var actionSequence0 = this.createActionSequence(actionSprite0);
var actionSequence1 = this.createActionSequence(actionSprite1);
cc.log(typeof actionSequence0);
actionSprite0.runAction(actionSequence0);
actionSprite1.runAction(actionSequence1);
謝謝觀賞,如果有錯(cuò)誤,歡迎指正~