2017-06-29 13 views
0

私はspritekitシーンを持っていて、spriteSceneNodeの1つに何らかの一連のアクションを追加しました。 たとえば、point1に移動するnode1というspriteSceneNodeは、point2、point3などに移動します。これは、 "SKAction.moveTo"関数を使用して実装されます。私の質問があるspriteSceneNodeがios SpriteKitのポイントに到達したときに関数をトリガする方法

は、それが各ポイント(ポイント1またはポイント2またはPOINT3)に到達したときにカスタム関数を呼び出すことが可能ですか。?

ここにコードを追加してください。

func MoveObjectToAnotherPosition(arrayOfPoints : [CGPoint],object: SKSpriteNode ) { 
    let from = object.position 


    var curPoint1 = object.position 


    let move = SKAction.move(to: from ,duration: 0.5) 
    var arrayOfMove : [SKAction] = [] 
    arrayOfMove.append(move) 
    for point in (arrayOfPoints) { 
     let move2 = SKAction.move(to: point,duration: 2.5) 

     let deltaX = point.x - curPoint1.x 
     let deltaY = point.y - curPoint1.y 
     let angle = atan2(deltaY, deltaX) 
     // let graph = childNode(withName: "Graph1")? 
     print(angle) 
     let ang = point.angle(to: curPoint1) 
     print(ang) 
     let codeToRunWhenReachingPointX = SKAction.run { 
      let anglevalue = angle + 90 * self.DegreesToRadians 
      self.movObject.zPosition = anglevalue 
      print(anglevalue) 
     } 


     //print(anglevalue) 
     let rotate = SKAction.rotate(byAngle: -angle, duration: 0.0) 
     arrayOfMove.append(codeToRunWhenReachingPointX) 
     arrayOfMove.append(move2) 
     curPoint1 = point 
    } 


    let moveToSequence = SKAction.sequence(arrayOfMove) 

    object.run(moveToSequence) 
} 

助けが必要ですか?

答えて

1

はい、SKActionが完了すると、任意のコードを呼び出すことができます。これを行うには、run(_:)を使用して任意のコードを実行するSKActionを作成できます。

あなたはX点に到達したときにいくつかのコードを呼び出すようにしたいので、私は、各点のXのため、このようなものを追加します。

let moveToPointX = SKAction.move(to: pointX, duration: someDuration) 
arrayOfMove.append(moveToPointX) 

let codeToRunWhenReachingPointX = SKAction.run { 
    // add whatever code you need, e.g. a closure passed to this function 
} 
arrayOfMove.append(codeToRunWhenReachingPointX) 

あなたが今

を呼び出すことであるとして、あなたはアクションのシーケンスを実行することができます
let moveToSequence = SKAction.sequence(arrayOfMove) 
object.run(moveToSequence) 

アクションシーケンスを実行しても、次のポイントに移動する前にcodeToRunWhenReachingPointXが完了するのを待つことはありません。あなたがSKActions [m1、c1、m2、c2]の配列を持っているとしましょう。mはあなたの移動アクションで、cはあなたの "実行コード"アクションです。このシーケンスを実行すると、m1が実行され、完了するとc1が実行され、c1が完了するのを待たずにm2が実行され、m2が完了するとc2が実行されます。

同様に機能するrun(_:completion:)メソッドも見てください。

希望すると便利です。

+0

「一連のアクションを実行するとcodeToRunWhenReachingPointXが完了するのを待つことはない」とはどういう意味ですか?あなたが別のスレッドにそれを投げない限り、ブロックは1フレームですべてを実行します。ブロックが完了していない場合、あなたのアプリケーションはロックされ遅れるでしょう – Knight0fDragon

+0

私はこれに間違っているかもしれませんが、そのブロック(または他の関数を呼び出す関数、他のアニメーションなど)で実行する大きな関数を入れてください。 「大きな機能」が完了する前に、ノードの開始点が2番目の点に移動していることがわかります。少なくとも、これは私の単純なスプライトキットプロジェクトで見たものです。たぶん私は間違っています。より良い方法がありますか? – JohnV

+0

私はこの問題に遭遇していたので、それを試してみる必要があります(私はこの問題に遭遇したため、次のアクションに移動するためにcustomAnimationを使用しなければなりません) – Knight0fDragon

関連する問題