私はおそらく同様の方法でそれをやったでしょう。SKAction.followを使うのがここの解決策だと思います。
しかし、あなたのコードでできることがいくつかあります。最初は、それが1つのアクションだけで構成されているので、あなたがこのようにコードを簡素化することができるようにあなたは、シーケンスとしてごSKActionを記述する必要はないということです。
let squarePath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 200, height: 200))
let followAction = SKAction.follow(path: squarePath.cgPath, duration: 5.0)
dish?.run(followAction)
今重要である他の事をされ、あなたのメモリ使用量を節約するために、新しい料理を毎回作成する代わりに(012回)、SKSpriteNode
にcopy()
を使用して、多くの異なるコピーを作成することができます。あなたが達成する必要があるものに応じて、もちろん、それぞれのコピーをカスタマイズしたり、色や位置などを変えることができます。これはもっと効率的です。あなたがそうのようなあなたのSKSpriteNodeのコピーを作成することができます
:各皿のコピーの位置について
import GameplayKit
if let dishCopy = dish?.copy() as? SKSpriteNode {
dishCopy.position = CGPoint(x: GKRandomDistribution(lowestValue: 0, highestValue: 200).nextInt(), y: GKRandomDistribution(lowestValue: 0, highestValue: 500).nextInt())
self.addChild(dishCopy)
}
、あなたはもちろん、独自の値に調整することができますが、ここで私はGameplayKitと非常に便利なランダムを使用しました値ジェネレータ。
更新:
まだ)(コピーを使用して、あなたはいくつかのオプションを持っていながら、あなたの料理のそれぞれに固有の名前を設定したい場合は。
たとえば、増加するカウンタを使用して一意の名前を生成する可能性があります。たとえば、更新メソッドでcurrentTimeを使用する可能性もあります。
これを行うもっとエレガントなもう1つの方法は、すべてのコピーがどこにあるかをトラックに保存することです。すべてを保存する配列を作成することです。シーンサブクラスの上部に
、そのようなあなたの料理の配列を宣言:現時点で
var dishes = [SKSpriteNode]()
、それは空のままですので、あなたがそれぞれの作成時に配列に各コピーを追加する必要があります
// Create (safely) a dish copy:
if let dishCopy = dish?.copy() as? SKSpriteNode {
// Add the dish copy to the dishes array:
dishes.append(dishCopy)
// And add the dish copy to the world node:
worldNode?.addChild(dishCopy)
}
あなたはこのような多くのコピーを作成したい場合は、for loop
を使用することができ、またはあなたが例えば5秒ごとに新しい寿司皿を作成することを指定することにより、update(_ currentTime:)
方法で遊ぶことができます:それらの:)。
また、これらのコピーにいつでもアクセスする必要がある場合は、dishes
アレイにアクセスしてください。
は例えば、これはあなたが(あなたががシーンにこれを追加しました場合は、元の皿に対処する必要があります)すべてのコピーを削除する方法を次のとおりです。
は
// And just iterate through all of your dish copies:
for dish in dishes {
dish.removeFromParent()
// Do whatever you need here :)
}
それは非常に簡単だし、それはあなたのことができますworldNode
に追加したすべてのオブジェクトやコピーを完全に制御することができます。
他にご質問がありましたらお気軽にお問い合わせください。
今夜私は実際にあなたの質問で話している寿司レストラン、小さな電車のあるものに行きます。いい偶然! :D
ありがとうございました。非常に役立ちます。私はcopy()を使用して見ていた。しかし、各料理の距離は、子ノードとして実際の寿司を持っている必要がありますので、コピーされたインスタンスが子ノードを持つことができるかどうかはわかりませんでした。各料理には、プレイヤーがそれを選択して寿司を補給するためのユニークな識別子もなければならないので、コピーされたインスタンスであればそのIDを知る方法は不思議でした。 –
@SeongLeemを大歓迎します。あなたのアプリでそれをどのように実装できるかについての詳細を提供するために私の答えを更新しました。 – Alex
これは素晴らしいことです。ありがとう!ここでシーンの代わりにワールドノードのユースケースは何ですか?各ディッシュコピーノードは、サーモン、マグロなどの子ノードを持つ必要があります。私は、最初の5つのディッシュにサーモンの子ノードを割り当てることができると思います。そして、私はどのプログラミング言語でも、配列は複数のレベルを上から下に持つことができると思います。 –