2014-04-07 15 views
2

여러 자식이있는 노드에 대해 SpriteKit 애니메이션을 만들고 그룹의 여러 부분에서 동작을 애니메이션으로 만들 수있는 방법은 무엇입니까?iOS7 SpriteKit 두 개 이상의 스프라이트 노드 하위의 애니메이션을 그룹화하는 방법은 무엇입니까?

I 다음 노드 구조가 있습니다

  • 조류 몸, 꼬리, 머리 아이 노드가를 등
  • 머리 위 부리, 낮은 부리 등의 자식 노드가

아래 예제에서는 모든 자식이 아래로 구부러져 종자를 집어 올리며 전체 새를 움직이기를 원합니다. 아래로 구부리는 동안, 새는 그 부리를 열어 씨앗을 먹습니다. 부리는 새의 자식이 아니라 머리 노드의 자식입니다. 여기

//body does this action 
    SKAction* bendDown = [SKAction rotateToAngle:M_PI*0.3 duration:lookUpTiming]; 

//beak does this action 
    SKAction* openBeak = [SKAction rotateToAngle:-M_PI*0.175 duration:beakDuration + arc4random()%20/100.0]; 

//I need both actions to be played together as a group: 
    SKAction* bendAndOpenBeak = [SKAction group:@[bendDown, openBeak]]; 


    //if I call this, the body will perform both actions. 
    [self runAction:bendAndOpenBeak completion:^{ 

    }]; 

내가 헤드 노드에서 실행할 수있는 코드는 내가 몸 (부모의 부모) 노드

와 그룹으로이 작업을 실행해야합니다, 그것은 아이들이 그러나 runAction:onChildWithName:를 사용하여 작업을 수행이다 가지고 있어요
-(SKAction*)openBeak 
{ 
    float angleUp = -M_PI*0.175; 
    float duration = beakDuration + arc4random()%20/100.0; 

    SKAction* rotateUp = [SKAction rotateToAngle:angleUp duration:duration]; 
    rotateUp.timingMode = SKActionTimingEaseOut; 

    SKAction* rotateDown = [SKAction rotateToAngle:-angleUp duration: duration]; 
    rotateUp.timingMode = SKActionTimingEaseOut; 


    return [SKAction group:@[[SKAction runAction:rotateUp onChildWithName:@"beakUpper"], 
         [SKAction runAction:rotateDown onChildWithName:@"beakLower"] ]]; 

} 
+0

무엇이 자기입니까? d –

+0

실제 답변을 얻으려면 더 표시해야합니다 –

+0

자기가 새의 몸입니다 –

답변

1

당신은 하나 하나, 각 노드에서 개별적으로 실행 group를 사용할 필요가 없습니다 :

//body does this action 
SKAction* bendDown = [SKAction rotateToAngle:M_PI*0.3 duration:lookUpTiming]; 

//beak does this action 
SKAction* openBeak = [SKAction rotateToAngle:-M_PI*0.175 duration:beakDuration + arc4random()%20/100.0]; 

[bodyNode runAction:bendDown]; 
[beakNode runAction:openBeak]; 
+0

시퀀스를 3 번 ​​반복해야하므로 병렬로 작업을 실행하는 경우 모든 타이밍을 동기화해야합니다. –

2

[SKAction runAction:onChildWithName:]는 순간 시간이있다 , 그래서 당신의 집단 행동은 그 완성을 기다리지 않을 것입니다.

완료 모든 작업에 대해 대기하는 그룹을 얻을 수있는 간단한 방법은 그룹에 [SKAction waitForDuration:]을 추가하고 코드를 필요로 보이는 당신의 예에 따라서 [SKAction runAction:onChildWithName:]

에 전달 된 작업 기간 속성을 사용하는 것입니다 이

-(SKAction*)openBeak { 
    float angleUp = -M_PI*0.175; 
    float duration = beakDuration + arc4random()%20/100.0; 

    SKAction* rotateUp = [SKAction rotateToAngle:angleUp duration:duration]; 
    rotateUp.timingMode = SKActionTimingEaseOut; 
    SKAction* waitForRotateUp = [SKAction waitForDuration:rotateUp.duration]; 

    SKAction* rotateDown = [SKAction rotateToAngle:-angleUp duration: duration]; 
    rotateUp.timingMode = SKActionTimingEaseOut; 
    SKAction* waitForRotateDown = [SKAction waitForDuration:rotateDown.duration]; 

    return [SKAction group:@[[SKAction runAction:rotateUp onChildWithName:@"beakUpper"], 
        [SKAction runAction:rotateDown onChildWithName:@"beakLower"], 
        waitForRotateDown, waitForRotateUp]]; 

} 

처럼이 방법으로 사용자의 명시 적으로 설정 기간 값이 기간이 명시 적으로 설정되어 있지 않은 같은 스프라이트 애니메이션 등의 작업에 사용 할 수 있지만 위의 예에서 SKActions 시간 속성을 사용했습니다.

0

다음은 사용자가 요청한 것과 정확히 일치하는 솔루션입니다. 이 답변은 사용 스위프트 3.

import SpriteKit 

class Scene: SKScene { 
    // 1 
    let lookUpTiming = 0.2 
    let beakDuration = 0.2 

    // 2 
    let body = SKNode() 
    let beak = SKNode() 

    override func sceneDidLoad() { 
    // 3 
    let bendDown = SKAction.run { 
     let action = SKAction.rotate(toAngle: .pi * 0.3, duration: self.lookUpTiming) 
     self.body.run(action) 
    } 
    // 4 
    let openBeak = SKAction.run { 
     let duration = self.beakDuration + Double(arc4random_uniform(20))/100 
     let action = SKAction.rotate(toAngle: -.pi * 0.175, duration: duration) 
     self.beak.run(action) 
    } 
    // 5 
    let group = SKAction.group([bendDown, openBeak]) 
    // 6 
    run(group) 
    } 
} 

다음은이 코드에서 일어나고있는 무엇 :

  • 는 만들기 처음 애니메이션에 대한 SKAction 만들기 노드에게
  • 를 초기화 설정
  • 를 초기화

    1. 두 번째 애니메이션 SKAction
    2. 두 작업 그룹 만들기
    3. 장면에서 그룹을 실행하십시오. 두 애니메이션은 서로 다른 노드에 있어도 함께 작동합니다!