2016-05-30 1 views
1

Я пытаюсь управлять несколькими анимациями для каждого из моих спрайтов. Проблема в том, что когда я выбираю один спрайт, его анимировать правильно, но когда я выбираю другой спрайт, анимация первого останавливается, а анимация начинается со второго. Но я хотел бы, чтобы анимация продолжалась на эвристском собеседнике, касающемся пальцем. Вот 3 функции с быстрым кодом:SpriteKit Swift анимация только на один спрайт сразу - iOS

override func didMoveToView(view: SKView) { 

    let urlStr = NSBundle.mainBundle().pathForResource("Video_Socle", ofType: "mov") 
    let url = NSURL(fileURLWithPath: urlStr!) 

    player = AVPlayer(URL: url) 
    NSNotificationCenter.defaultCenter().addObserverForName(AVPlayerItemDidPlayToEndTimeNotification, object: player!.currentItem, queue: nil) 
    { notification in 
     let t1 = CMTimeMake(5, 100); 
     self.player!.seekToTime(t1) 
     self.player!.play() 
    } 


    videoNode = SKVideoNode(AVPlayer: player!) 
    videoNode!.position = CGPointMake(frame.size.width/2, frame.size.height/2) 
    videoNode!.size = CGSize(width: 2048, height: 1536) 
    videoNode!.zPosition = 0 


    background.addChild(videoNode!) 
    videoNode!.play() 



    let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(GameScene.handlePanFrom(_:))) 
    self.view!.addGestureRecognizer(gestureRecognizer) 
} 


func handlePanFrom(recognizer : UIPanGestureRecognizer) { 
    if recognizer.state == .Began { 
     var touchLocation = recognizer.locationInView(recognizer.view) 
     touchLocation = self.convertPointFromView(touchLocation) 

     self.selectNodeForTouch(touchLocation) 
    } else if recognizer.state == .Changed { 
     var translation = recognizer.translationInView(recognizer.view!) 
     translation = CGPoint(x: translation.x, y: -translation.y) 

     self.panForTranslation(translation) 

     recognizer.setTranslation(CGPointZero, inView: recognizer.view) 
    } else if recognizer.state == .Ended { 

    } 
} 

func degToRad(degree: Double) -> CGFloat { 
    return CGFloat(degree/180.0 * M_PI) 
} 

func selectNodeForTouch(touchLocation : CGPoint) { 
    // 1 
    let touchedNode = self.nodeAtPoint(touchLocation) 

    if touchedNode is SKPuzzle { 
     // 2 
     if !selectedNode.isEqual(touchedNode) { 
      selectedNode.removeAllActions() 
      selectedNode.runAction(SKAction.rotateToAngle(0.0, duration: 0.1)) 

      selectedNode = touchedNode as! SKPuzzle 

      // 3 
      if touchedNode.name! == kpuzzleNodeName { 
       let sequence = SKAction.sequence([SKAction.rotateByAngle(degToRad(-4.0), duration: 0.1), 
        SKAction.rotateByAngle(0.0, duration: 0.1), 
        SKAction.rotateByAngle(degToRad(4.0), duration: 0.1)]) 
       selectedNode.runAction(SKAction.repeatActionForever(sequence)) 
      } 
     } 
    } 
} 



func panForTranslation(translation : CGPoint) { 
    let position = selectedNode.position 

    if selectedNode.name! == kpuzzleNodeName { 
     selectedNode.position = CGPoint(x: position.x + translation.x * 2, y: position.y + translation.y * 2) 

     print (selectedNode.name) 
     print (selectedNode.name2) 
     if selectedNode.name2 == "0" { 

      Anim_Puzzle13(selectedNode) 
     } 

     print (selectedNode.name2) 
     if selectedNode.name2 == "1" { 
      Anim_Puzzle19(selectedNode) 
     } 

     print (selectedNode.name2) 
     if selectedNode.name2 == "2" { 
      Anim_Puzzle30(selectedNode) 
     } 

     print (selectedNode.name2) 
     if selectedNode.name2 == "3" { 
      Anim_Puzzle11(selectedNode) 
     } 

     print (selectedNode.name2) 
     if selectedNode.name2 == "4" { 
      Anim_Puzzle29(selectedNode) 
     } 

     print (selectedNode.name2) 
     if selectedNode.name2 == "5" { 
      Anim_Puzzle35(selectedNode) 
     } 

     } 

} 




func Anim_Puzzle13 (Node13 : SKPuzzle) { 

    let puzzle13 = SKAction.animateWithTextures(sheet_puzzle13.Puzzle13_(), timePerFrame: 0.033) 
    NPuzzle13 = Node13 
    NPuzzle13.runAction(SKAction.repeatActionForever(puzzle13)) 
    NPuzzle13.position = CGPoint(x: 500, y: 400) 
    NPuzzle13.zPosition = 1 

} 

func Anim_Puzzle19 (Node19 : SKPuzzle) { 


    let puzzle19 = SKAction.animateWithTextures(sheet_puzzle19.Puzzle19_(), timePerFrame: 0.033) 
    NPuzzle19 = Node19 
    NPuzzle19.runAction(SKAction.repeatActionForever(puzzle19)) 
    NPuzzle19.position = CGPoint(x: 600, y: 500) 
    NPuzzle19.zPosition = 1 

} 

func Anim_Puzzle30 (Node30 : SKPuzzle) { 


    let puzzle30 = SKAction.animateWithTextures(sheet_puzzle30.Puzzle30_(), timePerFrame: 0.033) 
    NPuzzle30 = Node30 
    NPuzzle30.runAction(SKAction.repeatActionForever(puzzle30)) 
    NPuzzle30.position = CGPoint(x: 700, y: 600) 
    NPuzzle30.zPosition = 1 

} 

func Anim_Puzzle11 (Node11 : SKPuzzle) { 


    let puzzle11 = SKAction.animateWithTextures(sheet_puzzle11.Puzzle11_(), timePerFrame: 0.033) 
    NPuzzle11 = Node11 
    NPuzzle11.runAction(SKAction.repeatActionForever(puzzle11)) 
    NPuzzle11.position = CGPoint(x: 800, y: 700) 
    NPuzzle11.zPosition = 1 

} 

func Anim_Puzzle29 (Node29 : SKPuzzle) { 


    let puzzle29 = SKAction.animateWithTextures(sheet_puzzle29.Puzzle29_(), timePerFrame: 0.033) 
    NPuzzle29 = Node29 
    NPuzzle29.runAction(SKAction.repeatActionForever(puzzle29)) 
    NPuzzle29.position = CGPoint(x: 900, y: 800) 
    NPuzzle29.zPosition = 1 

} 

func Anim_Puzzle35 (Node35 : SKPuzzle) { 


    let puzzle35 = SKAction.animateWithTextures(sheet_puzzle35.Puzzle35_(), timePerFrame: 0.033) 
    NPuzzle35 = Node35 
    NPuzzle35.runAction(SKAction.repeatActionForever(puzzle35)) 
    NPuzzle35.position = CGPoint(x: 1000, y: 900) 
    NPuzzle35.zPosition = 1 

} 

}

Как управлять для анимации продолжить Эври спрайтов потрогать и не останавливаться каждый раз, когда я коснуться другой спрайт? Я могу сделать анимацию снова, выбрав снова любой спрайт, но только один, в то время, никогда больше ...

Спасибо за вашу помощь,

ответ

0

Ваш код правильный. Проблема может быть на вашем touchesBegan, если вы используете этот метод делегата или по UIPanGestureRecognizer, возможно, вы запускаете какой-либо метод для удаления ваших узлов (node.removeFromParent() или что-то вроде node.removeAllActions()). Это похоже на то, как вы нажимаете на свой экран, и repeatForEver немедленно останавливается из-за удаления узла родителем, или все действия были немедленно остановлены.

Если вы хотите, чтобы остановить какое-то действие, что лучше дать в runAction конкретный ключ:

NPuzzle30.runAction(SKAction.repeatActionForever(puzzle30),withKey: "NPuzzle30repeatForEver") 

, а затем, остановить его:

NPuzzle30.removeActionForKey("NPuzzle30repeatForEver") 

EDIT: (после того, как ваш последнее обновление кода)

if touchedNode is SKPuzzle { 
     // 2 
     if !selectedNode.isEqual(touchedNode) { 
      selectedNode.removeAllActions() 
      ... 
      // here you remove all actions about your selectedNode, also repeatActionForever.. 
    } 
} 
+0

Спасибо за вашу помощь. Анимация останавливается только при выборе другого спрайта на экране. Но я могу запустить его снова, если снова выбрать спрайт, но у меня не может быть больше одного спрайта ... Вот более значительная часть моего кода: – PGibouin

+0

Я думаю, вы должны искать в своем коде все строки о "removeAllActions() "и начать отлаживать его. ;) –

+0

Алессандро, спасибо большое! Оно работает !! Я начинаю с Swift на iOS, отлично, чтобы помочь более опытным пользователям. – PGibouin