2017-04-10 8 views
0

身体の部分が体(胴体、脚、頭部など)に分割されているプレーヤーがあります。これで、プレーヤーの動きを制御するボタン右に押すと、右に移動し、その部分は正常に動作します。問題はwalk()メソッドが呼び出され、それが何をするのかはプレーヤーの足をアニメーション化してその歩行のように見せることですが、動きが止まらなければ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というブール値を追加しました。アニメーションがオフ(false)でブール値がon(true)に設定されている場合にのみ、walk()を呼び出す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

関連する問題