首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Cocos2d-iPhone:實現動畫延遲執行的正確方法(CCDelayTime + CCCallBlock)

     編輯:程式設計綜合問答

場景描述

在 Cocos2d 遊戲開發中,碰撞檢測觸發後需延遲 3-4 秒播放角色動畫。開發者嘗試使用 [sprite stopActionByTag:1] 控制但無效,原因是動作標籤機制不支持延遲啟動邏輯。

核心解決方案:動作序列(CCSequence)組合延遲與回調

Cocos2d 提供 CCDelayTime 延遲動作和 CCCallBlock 回調動作,通過 CCSequence 串聯即可實現「延遲 N 秒後執行代碼塊」的邏輯。

完整實現代碼

// 假設在碰撸檢測回調中
if (CGRectIntersectsRect(food.sprite.boundingBox, playerRect)) {
    [food.sprite stopAllActions];
    
    // 1. 構建動畫幀
    NSMutableArray *walkAnimFrames = [NSMutableArray array];
    [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"newpackman2.png"]];
    [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"newpackman3.png"]];
    
    CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.2f];
    CCAction *walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
    walkAction.tag = 1; // 標籤用於後續停止
    
    // 2. 創建延遲動作(3.5 秒)
    CCDelayTime *delayAction = [CCDelayTime actionWithDuration:3.5f];
    
    // 3. 創建回調動作:啟動動畫
    CCCallBlock *startAnimBlock = [CCCallBlock actionWithBlock:^{
        [chef runAction:walkAction]; // chef 為目標精靈
    }];
    
    // 4. 串聯序列:延遲 -> 啟動動畫
    CCSequence *sequence = [CCSequence actions:delayAction, startAnimBlock, nil];
    
    // 5. 在任意節點運行序列(推薦在場景或專用節點)
    [self runAction:sequence];
    
    // 或者綁定在 chef 上(需注意 chef 是否可能被移除)
    // [chef runAction:sequence];
}

關鍵類說明

類用途典型用法
CCDelayTime純延遲,不執行任何視覺效果[CCDelayTime actionWithDuration:3.5f]
CCCallBlock執行 Objective-C Block 代碼塊[CCCallBlock actionWithBlock:^{ ... }]
CCSequence順序執行多個動作[CCSequence actions:action1, action2, nil]
CCSpawn並行執行多個動作[CCSpawn actions:action1, action2, nil]

進階:可取消的延遲動畫

若需在延遲期間取消(如玩家離開區域),需持有動作引用並調用 stopAction::

// 類成員變量
@property (nonatomic, strong) CCAction *pendingAnimSequence;

// 設置時
self.pendingAnimSequence = [CCSequence actions:delayAction, startAnimBlock, nil];
[self runAction:self.pendingAnimSequence];

// 取消時
if (self.pendingAnimSequence) {
    [self stopAction:self.pendingAnimSequence];
    self.pendingAnimSequence = nil;
}

常見誤區

  • ❌ [sprite stopActionByTag:1] 只能停止已在運行的帶標籤動作,無法阻止尚未開始的延遲序列。
  • ❌ 在 CCDelayTime 的 block 中直接寫動畫邏輯(舊版本不支持 block 參數)。
  • ✅ 使用 CCSequence 組合 CCDelayTime + CCCallBlock 是標準模式。
  • ✅ 動作運行目標建議為場景或持久節點,避免目標節點提前釋放導致動作不執行。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved