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