내 적 (Enemy) 클래스에는 여러 가지 방법이 있습니다. walkAnimation
및 deathAnimation
은 SKAction의 인스턴스를 반환합니다. 이러한 SKAction은 Enemy 노드의 많은 하위 노드에 대한 기본 동작을 조정해야하기 때문에 runAction:onChildWithName:
이이를 관리하는 방법 인 것 같습니다.SKAction과 동기화하는 방법 -runAction : onChildWithName :?
그러나 설명서 (및 실험)에 따르면 SKAction -runAction:onChildWithName:
은 즉각적입니다. 즉, 이러한 동작이 시퀀스에있는 경우 해당 자식 동작이 완료되기를 기다리는 대신 즉시 실행됩니다. 마찬가지로 완료 핸들러가 있으면 즉시 호출됩니다. 따라서 runAction:onChildWithName:
은 처럼 runBlock:
작업의 바로 가기에 지나지 않습니다.
내가 직면 한 문제의 구체적인 예로, 내가 복합 죽음 애니메이션을 가지고 있다고 가정 해보십시오. 내 적을 뒷받침하는 스프라이트가 빨간색으로 깜박이고, 적 자체가 장면에서 제거됩니다. 그 행동은 SKSpriteNode 인스턴스에서만 작동하기 때문에 colorizeWithColor:colorBlendFactor:duration:
을 직접 적에 사용할 수 없습니다. Enemy의 Sprite 노드에 removeFromParent
을 사용할 수 없습니다.이 Enemy 인스턴스는 장면에서 완전히 제거되지 않기 때문입니다. 그래서 runAction:onChildWithName:
이 필요합니다.
-(SKAction *)deathAnimation {
SKAction *flashRed = [SKAction colorizeWithColor:[UIColor redColor] colorBlendFactor:1.0 duration:0.2];
return [SKAction sequence:@[
[SKAction runAction:flashRed onChildWithName:@"Sprite"],
[SKAction removeFromParent],
]];
}
이 SKAction을 실행하면 내 적 노드가 빨간색으로 깜박이지 않고 바로 사라집니다. 그 이유는 runAction:onChildWithName:
이 이 아니고이 아닌 시간이 0.2
일 때입니다. 지속 시간은 순식간입니다. 마찬가지로 SKScene이 [enemy runAction:[enemy deathAnimation] completion:^{ ... }];
을 사용한다면 해당 완료 블록이 즉시 호출됩니다.
덜 디자인으로 전환하는 것을 싫어합니다. My Enemy 클래스는 SKAction
인스턴스를 반환하여 SKScene에 이러한 작업의 조정 및 구성을 정확하게 제어합니다. 이것에 대한 중요한 측면은 그러한 행동의 완료를 통보받는 것입니다. runAction:onChildWithName:
은 분명히 그 표준에 미치지 못합니다.
하나의 해킹 해결책은 runAction:onChildWithName:
과 removeFromParent
사이의 시퀀스에 [SKAction waitForDuration:0.2]
을 포함하는 것입니다. 그래도 이상하지 않습니다. waitForDuration
및 flashRed
동작이 실행 루프의 다른 반복에서 끝날 수 있습니까? 이 경우에는 별 문제가되지 않지만 여러 완료 핸들러를 사용하여 여러 작업을 수행하는 즉시 경쟁 조건이 발생할 수 있다고 걱정합니다.
waitForDuration:
외에 다른 옵션이 있습니까?
'Sprite' 노드에서'flashRed'를 직접 실행하는 것이 좋지 않습니까? 그런 다음 지속 시간을 갖습니다. –