2014-01-10 3 views
1

내 적 (Enemy) 클래스에는 여러 가지 방법이 있습니다. walkAnimationdeathAnimation은 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]을 포함하는 것입니다. 그래도 이상하지 않습니다. waitForDurationflashRed 동작이 실행 루프의 다른 반복에서 끝날 수 있습니까? 이 경우에는 별 문제가되지 않지만 여러 완료 핸들러를 사용하여 여러 작업을 수행하는 즉시 경쟁 조건이 발생할 수 있다고 걱정합니다.

waitForDuration: 외에 다른 옵션이 있습니까?

+0

'Sprite' 노드에서'flashRed'를 직접 실행하는 것이 좋지 않습니까? 그런 다음 지속 시간을 갖습니다. –

답변

0

여기서 잘못된 시퀀스를 사용하고 있습니다. 실제로 방해가됩니다.

Sprite라는 자식 노드를 가져옵니다. 완성 처리기로 플래시 빨간색 동작을 실행하면 동일한 처리 방법이 아니라 removeFromParent 메서드를 사용하여 스프라이트 (또는 스프라이트의 부모)를 제거합니다.

+0

어떻게 시퀀스를 잘못 사용하고 있는지 자세히 설명해 주시겠습니까? 그것은 SKActions의 목록을 취하고 runAction : onChildWithName :은 SKAction입니다. 또한이 질문에서 SKScene이 행동을 취할 책임이 있음을 알았습니다. 모든 노드 하위 클래스가 아닙니다. – sartak

+0

"두 번의 즉석 동작에 사용할 필요가 없습니다"에서처럼 잘못되었습니다. 순서의 유무에 관계없이 두 동작 모두 동일한 (바람직하지 않은) 효과를 갖습니다. 디자인의 관점에서 볼 때 장면에서 모든 작업을 관리하지는 않지만 대신 특정 작업을 수행해야하는 개별 노드에 메시지를 보내고 적절한 작업 집합을 선택하게하십시오.장기적으로이 접근법은 개별 노드가 자체 작업을 담당하기 때문에 더 잘 작동합니다. – LearnCocos2D