Nun, ich hätte es wahrscheinlich in ähnlicher Weise getan, und ich denke, mit SKAction.Follow ist hier eine Lösung.
Aber es gibt ein paar Verbesserungen, die Sie in Ihrem Code tun könnten. Die erste ist, dass Sie nicht brauchen, um Ihre SKAction als eine Folge zu schreiben, weil es nur eine Aktion zusammengesetzt ist, so können Sie Ihren Code dies zu vereinfachen:
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)
nun eine andere Sache, die wichtig ist, ist, Um Ihren Speicherverbrauch zu sparen, anstatt jedes Mal ein neues Gericht zu erstellen (20 Mal), können Sie einfach copy()
auf Ihrem SKSpriteNode
verwenden, um viele verschiedene Kopien davon zu erstellen. Je nachdem, was Sie erreichen müssen, können Sie natürlich jede Kopie anpassen, ihre Farbe oder Position ändern usw. Dies wäre viel effizienter.
Sie können eine Kopie Ihrer SKSpriteNode erstellen wie folgt:
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)
}
Für die Position jedes Gericht zu kopieren, können Sie natürlich Ihre eigenen Werte einstellen, aber hier habe ich GameplayKit und seine sehr nützlich Zufalls Wertegenerator.
Update:
Wenn Sie einen eindeutigen Namen für jede Ihrer Gerichte festlegen möchten, während immer noch Kopie() verwenden, haben Sie mehrere Möglichkeiten.
Eine Möglichkeit wäre, einen eindeutigen Namen mit einem Zähler zu generieren, den Sie inkrementieren würden, eine andere Möglichkeit wäre currentTime in der Update-Methode zum Beispiel zu verwenden.
Aber eine andere elegantere Art, dies zu tun, und zu verfolgen, wo all Ihre Kopien sind, ist ein Array zu erstellen, das sie alle speichert.
An der Spitze der Szene Unterklasse, erklären Ihre Gerichte Array wie folgt:
var dishes = [SKSpriteNode]()
Im Moment ist es noch leer ist, so dass Sie jede Kopie an das Array an der Zeit, die Sie erzeugen jeweils hinzufügen müssen sie aus:
// 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)
}
Wenn Sie viele Kopien wie diese erstellen möchten, können Sie einen for loop
verwenden, oder Sie können mit dem update(_ currentTime:)
Methode spielen, indem sie angeben, dass Sie ein neues Sushi Teller alle 5 Sekunden zum Beispiel erstellen möchten :).
Und gut, wenn Sie jederzeit auf eine dieser Kopien zugreifen müssen, tun Sie dies, indem Sie auf das dishes
Array zugreifen.
Zum Beispiel ist dies, wie Sie alle Kopien entfernen würden (Sie müßten mit dem ursprünglichen Gericht behandeln, wenn Sie es in die Szene allerdings hinzugefügt):
// And just iterate through all of your dish copies:
for dish in dishes {
dish.removeFromParent()
// Do whatever you need here :)
}
Es ist ziemlich einfach und ermöglicht es Ihnen, um alle Objekte und/oder Kopien, die Sie zu Ihrer hinzugefügt haben, perfekt zu steuern.
Lassen Sie mich einfach wissen, wenn Sie weitere Fragen haben, ich würde gerne helfen!
Übrigens werde ich heute tatsächlich zu dem Sushi-Restaurant gehen, über das du in deiner Frage sprichst, das mit dem kleinen Zug .. Netter Zufall! : D
Vielen Dank. Sehr hilfreich. Ich habe mit copy() gesucht. Da aber jede Gerichtsstrecke tatsächlich Sushi als Kindknoten haben muss, war ich nicht sicher, ob die kopierte Instanz einen Kindknoten hätte. Jedes Gericht muss auch einen eindeutigen Identifikator haben, damit der Spieler es auswählen und Sushi auffüllen kann, so dass ich mich fragte, wie ich seine ID kennen könnte, wenn es sich um kopierte Instanzen handelte. –
Sie sind herzlich willkommen @SeongLeem, ich aktualisierte meine Antwort zu geben Sie mehr Details darüber, wie Sie das in Ihrer App implementieren könnten – Alex
Das ist großartig. Vielen Dank! Was ist der Anwendungsfall für den Weltknoten hier anstelle der Szene?Jeder Gerichtkopieknoten muss einen Kindknoten wie Lachs, Thunfisch usw. haben. Ich denke also, ich kann Lachskindknoten für die ersten 5 Gerichte unter Verwendung einer Schleife wie in für _ in 0 zuordnen. <5 {füge Kindknoten hinzu}. Und ich denke, in jeder Programmiersprache kann ein Array mehrere Ebenen nach unten oder oben haben. –