CCCallFunc, CCCallFuncN, CCCallFuncND 三者的區別

來源:互聯網
上載者:User

1.CCCallFunc 只能調用不帶參數的回調方法

2.CCCallFuncN 可以帶一個 參數:

(id)sender
3.CCCallFuncND 可以帶兩個參數 (第二個參數的類型可以是任意類型):

(id)sender batchNode:(CCSpriteBatchNode*)batchNode

 

直接上用例(sprite動畫一次性播放以後將自己從父節點移除並銷毀):

- (CCSprite*) addOneOffAnimSprite:(CCNode*)parent
                         position:(CGPoint)position
                         animName:(NSString*)animName
                       startIndex:(int)startIndex
                         endIndex:(int)endIndex
                            delay:(float)delay
{
    CCSpriteFrameCache *frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
   
    // 1.緩衝sprite幀和紋理
    NSString *spriteFrameCacheName = [NSString stringWithFormat:@"%@.plist", animName];
    [frameCache addSpriteFramesWithFile:spriteFrameCacheName];
   
    // 2.建立一個精靈批處理結點
    NSString *spriteSheetName = [NSString stringWithFormat:@"%@.png", animName];
    CCSpriteBatchNode *spriteBatchNode = [CCSpriteBatchNode batchNodeWithFile:spriteSheetName];
    [parent addChild:spriteBatchNode z:2];
   
    // 3.收集幀列表
    NSMutableArray *frames = [NSMutableArray array];
    for(int i = startIndex; i < endIndex+1; ++ i) {
        NSString *frameName = [NSString stringWithFormat:@"%@%d.png", animName, i];
        CCSpriteFrame *spriteFrame = [frameCache spriteFrameByName: frameName];
        [frames addObject: spriteFrame];
    }
   
    // 4.建立動畫對象
    CCAnimation *animation = [CCAnimation animationWithFrames:frames delay:delay];
    id action = [CCAnimate actionWithAnimation:animation restoreOriginalFrame:NO];
    id callFunc = [CCCallFuncND actionWithTarget:self selector:@selector(removeSprite:batchNode:) data:spriteBatchNode];
    id animSequence = [CCSequence actions:action, callFunc, nil];
   
    // 5.建立 sprite 並且讓它 run 動畫 action~
    NSString *fristFrameName = [NSString stringWithFormat:@"%@%d.png", animName, startIndex];
    CCSprite *animSprite = [CCSprite spriteWithSpriteFrameName:fristFrameName];
    [animSprite setPosition:position];
   
    [animSprite runAction:animSequence];
    [spriteBatchNode addChild:animSprite];
    return animSprite;
}
- (void) removeSprite:(id)sender batchNode:(CCSpriteBatchNode*)batchNode {    // 由 CCCallFuncND 調用~
    CCSprite *animSprite = (CCSprite*)sender;
    [batchNode removeChild:animSprite cleanup:YES];
}


摘自 yang3wei的專欄

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.