Cocos2D-JS 動(dòng)作回調(diào)取得當(dāng)前動(dòng)作精靈

今天碰到一個(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ò)誤,歡迎指正~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 弄懂js異步 講異步之前,我們必須掌握一個(gè)基礎(chǔ)知識(shí)-event-loop。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,889評(píng)論 0 5
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性。 1....
    LaBaby_閱讀 1,513評(píng)論 0 2
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性。 1....
    LaBaby_閱讀 1,277評(píng)論 0 1
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,691評(píng)論 0 4
  • 曾經(jīng)多少次迷惘 曾經(jīng)多少次惆悵 如今已成過往 我不再倔強(qiáng),倔強(qiáng) 是否是命運(yùn)的安排 是否是自我的無奈 還是我在徘徊 ...
    蟄伏的愛lby閱讀 365評(píng)論 0 0

友情鏈接更多精彩內(nèi)容