2017-04-10 7 views
0

신체 부위가 몸통 (몸통, 다리, 머리, 요법)으로 분할 된 플레이어가 있습니다. 이제 플레이어의 움직임을 제어하는 ​​스크린에 버튼이 있습니다. 오른쪽으로 누르면 플레이어가 오른쪽으로 이동하고 해당 부분은 올바르게 작동합니다. 문제는 운동이 바뀔 때마다입니다. walk() 메서드가 호출되고 플레이어의 다리가 움직이는 것처럼 보이도록 애니메이션이 움직입니다. 그러나 움직임이 멈추지 않으면 walk()를 호출하지 않고 계속 호출합니다. 애니메이션이므로 앞뒤로 붙어있는 것처럼 보입니다. 내가 뭘 하려는지 플레이어가 끊임없이 걸을 수 있지만 산책() (애니메이션 메서드) 한 번 호출 할 완료, 다시 호출 할 수 있습니다. (걷는 단추가 여전히 눌러져있는 한). 여기에 내가 지금까지 무엇을 :터치를 사용하지 않고 SpriteNode에서 실행되는 액션 완료

func walk(){ 
    let leftFootWalk = SKAction.run { 
     let action = SKAction.moveBy(x: 1, y: 0.1, duration: 0.1) 
     let actionReversed = action.reversed() 
     let seq = SKAction.sequence([action, actionReversed]) 
     self.leftUpperLeg.run(seq) 
     self.leftLowerLeg.run(seq) 
    } 

    let rightFootWalk = SKAction.run { 
     let action = SKAction.moveBy(x: 0.4, y: 0.1, duration: 0.1) 
     let actionReversed = action.reversed() 
     let seq = SKAction.sequence([action, actionReversed]) 
     self.rightUpperLeg.run(seq) 
     self.rightLowerLeg.run(seq) 
    } 

    let group = SKAction.sequence([leftFootWalk, SKAction.wait(forDuration: 0.2), rightFootWalk]) 

    run(group) 
} 


extension GameScene: InputControlProtocol { 
func directionChangedWithMagnitude(position: CGPoint) { 
    if isPaused { 
     return 
    } 

    if let fighter = self.childNode(withName: "fighter") as? SKSpriteNode, let fighterPhysicsBody = fighter.physicsBody { 

     fighterPhysicsBody.velocity.dx = position.x * CGFloat(300) 
     walk() 

     if position.y > 0{ 
      fighterPhysicsBody.applyImpulse(CGVector(dx: position.x * CGFloat(1200),dy: position.y * CGFloat(1200))) 
     }else{ 
      print("DUCK") //TODO: duck animation 
     } 
    } 
} 

답변

0

내가 그러나 나는 아직도 거기에 더 나은 방법이 있는지 해요,이 문제를 해결 할 수 있었다 당신이 그것을 말할 반드시 알고 있다면 그렇게. 여기에 내가 한 일이있다. 처음에는 걷는 애니메이션이 켜져 있는지 (true) 또는 꺼져 있는지 (false) 알고 false로 설정했는지 isWalking이라는 Boolean을 추가했다. 애니메이션이 꺼져있는 경우에만 walk()을 호출하고 if (true)를 부울로 설정하는 if 문을 추가했습니다.

func directionChangedWithMagnitude(position: CGPoint) { 
    if isPaused { 
     return 
    } 

    if let fighter = self.childNode(withName: "fighter") as? SKSpriteNode, let fighterPhysicsBody = fighter.physicsBody { 

     fighterPhysicsBody.velocity.dx = position.x * CGFloat(300) 
     print(fighterPhysicsBody.velocity.dx) 

     if !isWalking{ 
      isWalking = true 
      walk() 
     } 
    } 
} 

그리고 난 다시

모든
func walk(){ 
    let walkAction = SKAction.moveBy(x: 5, y: 5, duration: 0.05) 
    let walk = SKAction.sequence([walkAction, walkAction.reversed()]) 

    leftUpperLeg.run(walk) { 
     self.rightUpperLeg.run(walk) 
    } 

    leftLowerLeg.run(walk) { 
     self.rightLowerLeg.run(walk, completion: { 
      self.isWalking = false 
     }) 
    } 
} 
0

먼저 당신이 당신의 행동 순서의 마지막 작업으로 SKAction.runBlock({ self.doSomething() }) 을 사용할 수 있습니다 오프 (false)를 부울을 완료 블록을 사용하고 설정하는 도보() 변경 완료를 사용하는 대신.

질문에 대해서는 hasAction을 사용하여 SKNode에 현재 어떤 작업이 실행되고 있는지 확인하고 더 나은 작업 관리를 위해 키 메커니즘을 사용할 수 있습니다.

다음 Q를 참조 & checking if an SKNode is running a SKAction