2017-02-14 11 views
2

ノードでSKSpriteNodeを作成してSKActionを実行すると、アクションはシミュレータ上で実行されますが、ノードのプロパティは変更されません。 など。次の例では、シミュレータでは、ノードは(50,50)で始まり、1秒間に(0,0)に移動します。しかし、代わりに新しい位置(0,0)Xcode SpriteKit SKActionはSKSpriteNodeのプロパティを変更しませんか?

let test = SKSpriteNode() 

test.position = CGPoint(x: 50.0, y: 50.0) 
test.size = CGSize(width: 20.0, height: 20.0) 
test.color = UIColor.black 
addChild(test) 

test.run(SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0)) 
print("(\(test.position.x), \(test.position.y))") 

の終わりプリント(50,50)で、print文私は考えることができる唯一の理由は、SKActionが実行される前に、print文が実行されるということです。この場合、SKSpriteNodeの位置の値を取得することによって、後でコードを実行するにはどうすればよいですか?

+0

位置を印刷するために 'SKAction'を追加する必要はありません –

答えて

1

あなたのノードの最初の位置は、目的の位置に移動する前に印刷されているので、目的の位置に到達したらノードの位置を出力するだけです。

次のような順序でそれを修正することができます。すでにテスト

let test = SKSpriteNode() 
test.position = CGPoint(x: 50.0, y: 50.0) 
test.size = CGSize(width: 20.0, height: 20.0) 
test.color = UIColor.red 
addChild(test) 

let moveAction = SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0) 
let printAction = SKAction.run { 
    print("(\(test.position.x), \(test.position.y))") 
} 
let sequence = SKAction.sequence([moveAction, printAction]) 

test.run(sequence) 

It'sを、それが

幸運をお役に立てば幸いです! :]

+0

ありがとう!それはまさに私が探していたものです! –

+0

恐ろしい!、喜んで助けてください。 –

1

私が考えることができる唯一の理由は、print文がSKActionが実行される前に実行されるということだけです。

あなたはまさに正しいです!

、その後どのように私はそれがSKSpriteNodeの位置の値を得ることに依存している上、後にコードを実行するのですか?

SKAction.sequenceSKAction.runメソッド呼び出しを組み合わせることによって、

sequenceメソッドは、一連のアクションから構成されたアクションを1つずつ返します。

runメソッドは、実行時にパラメーターとして渡すコードブロックを実行するアクションを返します。

あなたが「移動」終了後の位置を印刷するので、このようなアクションを作成したい:

let runCodeAction = SKAction.run { 
    print("(\(test.position.x), \(test.position.y))") 
} 

その後、sequenceを使用して、アクションのシーケンスを作成します。

let sequence = SKAction.sequence(
    [SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0), runCodeAction]) 

今すぐ実行このシーケンス:

test.run(sequence) 
3

SpriteKitでは、SKActionクラスはm任意のインスタンスメソッドがありますが、SKAction.sequenceのようなコードを追加する必要はありません。また、SKActionのようにコードを追加する必要はありません。

実際にあなたがrun(_:completion)を持って、あなたは

がちょうど終了したことを追加し、アクションは

を完了したときにあなたのコードがあるとして完成されたと呼ば完了ブロックを持っていることを公式ドキュメントhereを見つけることができます

test.run(SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0), completion:{ 
    print("(\(test.position.x), \(test.position.y))") 
}) 
関連する問題