2014-01-08 5 views
2

명령시 SKNode를 화면 위로 이동하려고합니다. 다음과 같은 SKAction 체인을 설정하여 1) 노드가 위로 움직이고 화면을 벗어난 다음 2) 노드가 시작 지점으로 이동 한 다음 3) 이동이 시작됩니다. 나는이 시도하고 구현하려면 다음 코드를 사용했습니다 :iOS SpriteKit SKAction 완료 통화가 작동하지 않거나 이상한 결과가 발생합니다.

SKAction *moveUp = [SKAction moveTo: shipIntroSpot1 duration:3.0]; 
    SKAction *moveDown = [SKAction moveTo:shipSpot1 duration:ship1MovementSpeed]; 

    [self enumerateChildNodesWithName:@"ship1" usingBlock:^(SKNode *node, BOOL *stop) { 
     NSLog(@"RUNNING MOVE UP"); 
     [node runAction: moveUp]; 

     [node runAction:moveUp completion:^{ 
      NSLog(@"RUNNING MOVE DOWN"); 
      [node setHidden: NO]; 
      [node runAction: moveDown]; 
     }]; 

     [node runAction:moveDown completion:^{ 

      NSLog(@"STARTING MOVEMENT"); 
     }]; 

그러나, SKActions가 올바른 순서로 발사 할 수 표시되지 않습니다. 한 단계가 완료되면 다음 단계가 시작되도록 코드를 사용했습니다. 그러나 SKAction은 다음 SKAction이 작동하기 전에 노드를 충분히 빠르게 이동시키지 못합니다. 완료 통화를 사용하면 이전 작업이 완료 될 때까지 다음 작업이 시작되지 않는다는 인상을 받고있었습니다. 그것은 여기에있는 것처럼 보이지 않습니다. 또한 1 단계 (MOVING UP) 동안 오래 지속되면 2 단계 (건너 뛰기)로 건너 뛰고 3 단계 (시작 동작) 실행을 시작합니다. 나는 이것이 어떻게 가능한지 전혀 모른다. 누군가가 서로 다른 행동을 적절하게 함께 연결하는 방법을 이해하는 데있어서 실수를 지적 할 수 있다면 감사하게 생각합니다.

(나는 통해 "숨기기 취소"노드 반쯤. 내가 너무 그것에 대해 틀렸다하지 않는 한 내가 순서대로 그것을 넣을 수 있다고 생각하지 않습니다하기 때문에 나는 SKAction 순서를하지 않았다.)

+0

동작 시퀀스를 다른 동작 (순서대로) 후에 실행하려는 경우 동작 시퀀스를 찾습니다. – LearnCocos2D

답변

10

runAction이 어떻게 실행되는지 이해하지 못하는 것 같습니다. 사용

[node runAction:moveUp completion:^{ 
     NSLog(@"RUNNING MOVE DOWN"); 
     [node setHidden: NO]; 
     [node runAction: moveDown]; 
    }]; 

단지 완료를 정의하지 않습니다 액션의 끝에서 수행 할 수 있지만이 완료 작업을 실행 한 후 호출, 그래서 첫 번째 [노드 runAction : moveUp] 필요 제거 할.

두 번째로 하나의 함수/블록에서 만들어진 두 개의 runAction 호출이 동시에 호출되며 [노드 runAction : moveUp], [노드 runAction : moveUp 완료 :] 및 [노드 runAction : moveDown 완료 : ]을 모두 같은 블록에 넣으면 모두 동시에 실행됩니다. 작업이 완료

SKAction *moveUp = [SKAction moveTo: shipIntroSpot1 duration:3.0]; 
SKAction *moveDown = [SKAction moveTo:shipSpot1 duration:ship1MovementSpeed]; 

[self enumerateChildNodesWithName:@"ship1" usingBlock:^(SKNode *node, BOOL *stop) { 
    NSLog(@"RUNNING MOVE UP"); 

    [node runAction:moveUp completion:^{ 
     NSLog(@"RUNNING MOVE DOWN"); 
     [node setHidden: NO]; 
     [node runAction:moveDown completion:^{ 

      NSLog(@"STARTING MOVEMENT"); 
     }]; 
    }]; 
+1

고맙습니다. 이것은 트릭을했다. 이 코드를 사용하여이 구별을하지 못했다는 간단한 자습서를 보았습니다. – MarcZero

1

완료 블록 실행 후 :

당신이 찾고있는 코드입니다. 그런 다음, 아래로 이동 한 후, 이동 이동할 싶다면, 다음과 같은 코드를 작성해야 : 당신은 당신이 연속으로 세 runAction의를 호출하기 때문에 작동하지 않습니다 지금 무엇을 가지고

[node runAction:moveUp completion:^{ 
     [node runAction:moveDown completion:^{ 
      NSLog(@"STARTING MOVEMENT"); 
     }]; 
    }]; 

. 먼저 moveUp이라고 말하지만, 즉시 moveDown을 실행하는 완료 블록으로 다른 moveUp으로 해당 작업을 재정의하십시오. 그런 다음 moveDown을 사용하여 해당 작업을 즉시 재정의합니다. 따라서 본질적으로 노드에 moveDown을 알리면 모든 것이 불필요합니다.

1

나는 답변으로 표시되었지만 대안을 제시하고 있음을 알고 있습니다.루프에서 다음

NSArray *actions = @[moveUp, [SKAction unhide], moveDown]; 
SKAction *action = [SKAction sequence:actions]; 

:

또 다른 옵션은 단순히 (예를 들어, 당신이 원하는 경우 단지 하나의 라이너로 기록 될 수있다)

한 완료 핸들러와 액션 시퀀스 것 다음과 같이 작성하면됩니다.

[node runAction:action withCompletion^{ 
     NSLog(@"STARTING MOVEMENT"); 
    }]; 

누군가가 유용하게 사용되기를 바랍니다.