2016-05-31 8 views
2

同期アニメーション(分割された小さなパズルジグソーパズルのフレームで分解された大きなビデオ)を作成しようとしています。このゲームはビデオパズルです。ここで私は、一例として三つの部分に使用するコードは次のとおりです。ios Swift - グループ化されたスプライトと同期アニメーション

func Anim_Puzzle13 (Node13 : SKPuzzle) { 

    let puzzle13 = SKAction.animateWithTextures(sheet_puzzle13.Puzzle13_(), timePerFrame: 0.066) 
    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.066) 
    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.066) 
    NPuzzle30 = Node30 
    NPuzzle30.runAction(SKAction.repeatActionForever(puzzle30)) 
    NPuzzle30.position = CGPoint(x: 700, y: 600) 
    NPuzzle30.zPosition = 1 

} 

それはうまく動作しますが、それは、アニメーションの間で同期しないと映像が何の整合性を持っていません。私はアニメーションを同期させるための解決策を探し求めました。最初に、すべてのジグソーパズルパーツを内部に持つユニークなSKNode()を作成することができますが、個々のジグソーパズルパーツを独立して移動でき、この方法で同期化されたアニメーションを得ることはできませんでした。

他の方法は、すべてのアニメーションをまとめてグループを作成することですが、これは機能しないため、アプリケーションが停止します。ここで

は、私が使用するすべてのコードです:

import SpriteKit 
import UIKit 
import AVFoundation 
import AVKit 
import CoreFoundation 

private let kpuzzleNodeName = "puzzle" 
private let kdancing = "dancing" 


class SKPuzzle: SKSpriteNode { 
var name2:String = ""; 
} 

class GameScene: SKScene { 



var background = SKVideoNode(videoFileNamed: "Video_Socle.mov") 
var selectedNode = SKPuzzle() 
var player:AVPlayer? 
var videoNode:SKVideoNode? 

var NPuzzle13 = SKPuzzle() 
var NPuzzle19 = SKPuzzle() 
var NPuzzle30 = SKPuzzle() 
var NPuzzle11 = SKPuzzle() 
var NPuzzle29 = SKPuzzle() 
var NPuzzle35 = SKPuzzle() 
var puzzle13 = SKAction() 
var puzzle19 = SKAction() 
var puzzle30 = SKAction() 
var puzzle11 = SKAction() 
var puzzle29 = SKAction() 
var puzzle35 = SKAction() 

let sheet_puzzle13 = Puzzle13() 
let sheet_puzzle19 = Puzzle19() 
let sheet_puzzle30 = Puzzle30() 
let sheet_puzzle11 = Puzzle11() 
let sheet_puzzle29 = Puzzle29() 
let sheet_puzzle35 = Puzzle35() 



override init(size: CGSize) { 
    super.init(size: size) 



    // 1 
    self.background.name = kdancing 
    self.background.anchorPoint = CGPointZero 
    background.zPosition = 0 
    self.addChild(background) 


    // 2 
    let sheet = Statiques() 

    let sprite_dancing1 = SKSpriteNode(texture: sheet.Dancing1()) 
    let sprite_dancing2 = SKSpriteNode(texture: sheet.Dancing2()) 
    sprite_dancing1.name = kdancing 
    sprite_dancing2.name = kdancing 


    sprite_dancing1.position = CGPoint(x: 837, y: 752) 
    sprite_dancing1.zPosition = 2 
    sprite_dancing2.position = CGPoint(x: 1241, y: 752) 
    sprite_dancing2.zPosition = 2 

    background.addChild(sprite_dancing1) 

    background.addChild(sprite_dancing2) 



    let imageNames = [sheet.Puzzle13() , sheet.Puzzle19(), sheet.Puzzle30(), sheet.Puzzle11(), sheet.Puzzle29(), sheet.Puzzle35() ] 

    for i in 0..<imageNames.count { 
     let imageName = imageNames[i] 

     let sprite = SKPuzzle(texture: imageName) 

     sprite.name = kpuzzleNodeName 
     sprite.name2 = "\(i)" 

     let offsetFraction = (CGFloat(i) + 1.0)/(CGFloat(imageNames.count) + 1.0) 

     sprite.position = CGPoint(x: size.width * offsetFraction, y: size.height/2) 
     sprite.zPosition = 3 

     background.addChild(sprite) 

    } 



} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    for touch: AnyObject in touches { 
     let positionInScene = touch.locationInNode(self) 
     selectNodeForTouch(positionInScene) 
    } 
} 

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.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.066) 
    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.066) 
    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.066) 
    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.066) 
    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.066) 
    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.066) 
    NPuzzle35 = Node35 
    NPuzzle35.runAction(SKAction.repeatActionForever(puzzle35)) 
    NPuzzle35.position = CGPoint(x: 1000, y: 900) 
    NPuzzle35.zPosition = 1 

} 

}

私はそれがこのようなアニメーション同期させることが可能かどうかわからない:それはする必要がありますので、いくつかの分離部分でSKAction()とをそれらを個別に選択することができます。

UPDATE:私はアクション・グループの方法に従うことを試みたが、私は代わりに、各スプライト(同期6つの異なるアニメーション:6つの異なるスプライト):用の同期異なるアニメーションの各スプライトに遊ん同じアニメーションを持って

let sheet13 = Puzzle13() 
    let sheet19 = Puzzle19() 
    let sheet30 = Puzzle30() 
    let sheet11 = Puzzle11() 
    let sheet29 = Puzzle29() 
    let sheet35 = Puzzle35() 

    let imageAnims = [sheet13.Puzzle13_0000() , sheet19.Puzzle19_0000(), sheet30.Puzzle30_0000(), sheet11.Puzzle11_0000(), sheet29.Puzzle29_0000(), sheet35.Puzzle35_0000() ] 

    let puzzle13 = SKAction.animateWithTextures(sheet13.Puzzle13_(), timePerFrame: 0.066) 
    let puzzle19 = SKAction.animateWithTextures(sheet19.Puzzle19_(), timePerFrame: 0.066) 
    let puzzle30 = SKAction.animateWithTextures(sheet30.Puzzle30_(), timePerFrame: 0.066) 
    let puzzle11 = SKAction.animateWithTextures(sheet11.Puzzle11_(), timePerFrame: 0.066) 
    let puzzle29 = SKAction.animateWithTextures(sheet29.Puzzle29_(), timePerFrame: 0.066) 
    let puzzle35 = SKAction.animateWithTextures(sheet35.Puzzle35_(), timePerFrame: 0.066) 

    let group = SKAction.group([puzzle13,puzzle19,puzzle30,puzzle11,puzzle29,puzzle35]) 

    for i in 0..<imageAnims.count { 
     let imageAnim = imageAnims[i] 

     let spriteAnim = SKPuzzle(texture: imageAnim) 

     spriteAnim.name = kanimNodeName 
     spriteAnim.name2 = "\(i)" 

     let offsetFraction = (CGFloat(i) + 1.0)/(CGFloat(imageAnims.count) + 1.0) 

     spriteAnim.position = CGPoint(x: ((size.width)*2) * offsetFraction, y: size.height * 1.5) 
     spriteAnim.zPosition = 3 

     spriteAnim.runAction(SKAction.repeatActionForever(group)) 


     background.addChild(spriteAnim) 

    } 

答えて

1

私はあなたのSKActionを作成するために、2つの貴様の方法をリストしたいまず第一に:

SKAction.groupを使用して、並列行動を皮切り:

let sprite = SKSpriteNode(imageNamed:"Spaceship") 
let scale = SKAction.scaleTo(0.1, duration: 0.5) 
let fade = SKAction.fadeOutWithDuration(0.5) 
let group = SKAction.group([scale, fade]) 
sprite.runAction(group) 

SKActionが終わったときに知ることができるので、他の有用な方法は、完了することができます:

extension SKNode 
{ 
    func runAction(action: SKAction!, withKey: String!, optionalCompletion: dispatch_block_t?) 
    { 
     if let completion = optionalCompletion 
     { 
      let completionAction = SKAction.runBlock(completion) 
      let compositeAction = SKAction.sequence([ action, completionAction ]) 
      runAction(compositeAction, withKey: withKey) 
     } 
     else 
     { 
      runAction(action, withKey: withKey) 
     } 
    } 
} 

使用:その後

node.runAction(move,withKey:"swipeMove",optionalCompletion: { 
    // here the action is finished, do whatever you want 
}) 

、あなたのプロジェクトについて、私が見てきました多くのnode.runAction ..、あなたはあなたの行動をsinchronizeするためにこの戦略を採用することもできます:

var myAction30 :SKAction! 
var myAction31 :SKAction! 

self.myAction30 = SKAction.repeatActionForever(puzzle30) 
self.myAction31 = SKAction.repeatActionForever(puzzle31) 
let group = SKAction.group([self.myAction30, self.myAction31]) 
self.runAction(group) 

UPDATE:私はあなたの更新部分を見てきました。あなたが「同期している」と言ったときに、おそらく「並行して実行中」のアクションを意味するものではありません。あなたは別の後にアクションを実行したい場合は

ので、もあります:

self.myAction30 = SKAction.repeatActionForever(puzzle30) 
self.myAction31 = SKAction.repeatActionForever(puzzle31) 
let sequence = SKAction.sequence([self.myAction30, self.myAction31]) 
self.runAction(sequence) 
+0

私は、グループアクション道に従うことを試みたが、すべてのスプライトは同じアニメーションではなく、各それらのに従ってください(1スプライトによるアニメーション、合計6つのアニメーション) – PGibouin

+0

この要素をタッチすると、たとえば6回実行されます。この実行中に別の要素に触れると、最後のアニメーションと最初のアニメーションとの時間が「同期」しますか?私は正しく理解していますか? –

+0

ありがとうございました。実際、私は解決策を見つけました。シーンにアニメーション化されたスプライトを個別に作成し、それらを非表示にして、正しいスプライトが交差しているときに表示させることです。それらは正確に同時に作成されているため、正しく同期されています。 – PGibouin

関連する問題