Ich habe ein kleines Testprojekt mit der "Hello World" Sprite-Kit-Vorlage gemacht, wo es eine Atlas-Animation gibt, die aus diesen Bildern besteht:
-
Also habe ich ein Tool benutzt, um einzelne Frames zu trennen und ich habe einen atlasc
Ordner erstellt
Also sollte der Code sein:
Die Ausgabe lautet:
Wie Sie sehen können, ist physicsBody
STATISCH, respektiert die Animation nicht : das ist normal, weil während der Animation die Textur die Dimension / Größe ändert und wir die% nicht ändern. co_de%, die während der Aktion gleich bleiben.
Nach den Quellen gibt es keine Methoden, die während physicsBody
erlauben, SKAction.animate
zu ändern.
Obwohl wir verwenden:
%Vor%Um Körper für jeden Frame unserer Animation zu erstellen, bleiben diese Körper alle zusammen in der Szene und erzeugen eine hässliche bizarre Situation wie dieses Bild:
Der richtige Weg sollte also sein, Frames während der Animation abzufangen und physicsBody
im laufenden Betrieb zu ändern.
Wir können auch die physicsBody
-Methode von update()
verwenden, aber ich habe über eine Erweiterung nachgedacht.
Meine Idee ist es, die Aktion SKScene
mit animation
zu kombinieren, eine weitere benutzerdefinierte Aktion zu erstellen, die die Ausführung der ersten Aktion überprüft, Frames abfängt, die mit dem aktuellen SKAction.group
übereinstimmen, und das Feld knight.texture
zu ändern textures
startet eine externe Methode, in diesem Fall physicsBody
.
Dann habe ich diesen hier geschrieben:
%Vor%Durch Hinzufügen dieser Erweiterung ändern wir den Animationsteil des Codes mit:
%Vor%Dies funktioniert schließlich, die Ausgabe ist:
Kennst du einen besseren Weg oder eine elegantere Methode, um dieses Ergebnis zu erhalten?
isDynamic = false
. * Aktualisierung bis 2017 unter
Nach einigen Testtagen mit meiner Antwort kamen die Antworten von Knight0fDragon und einige andere Ideen von anderen SO-Antworten (Verwirrte und Wirbelwind-Vorschläge ...) Ich habe gesehen, dass ein neues Problem besteht : physicsBody
kann ihre Eigenschaften nicht an andere Körper weitergeben
angemessen und richtig. Mit anderen Worten kopieren Sie alle Eigenschaften von einem Körper in einen anderen Körper es ist nicht genug . Das liegt daran, dass Apple den Zugriff auf einige Methoden und Eigenschaften der ursprünglichen Klasse physicsBody
einschränkt.
Es kann vorkommen, dass wenn Sie eine physicsBody.applyImpulse
korrekt starten, die velocity
die Schwerkraft noch nicht korrekt berücksichtigt. Das ist wirklich unheimlich zu sehen ... und offensichtlich ist das falsch.
Das Hauptziel ist also: Ändere das physicBody
nicht, indem du es neu erstellst. Mit anderen Worten: ERHEBE ES NICHT !
Ich dachte, dass Sie anstelle von Sprite-Children ein Ghost-Sprite erstellen könnten, das die Arbeit anstelle des Haupt-Sprites erledigt, und das Haupt-Sprite nutzt die Ghost-Änderungen, aber NUR das Haupt-Sprite hat ein physicsBody. p>
Das scheint zu funktionieren!
%Vor%Ausgabe :
Offensichtlich können Sie ausblenden, indem Sie alpha
auf 0.0 setzen und den Geist so verschieben, wie Sie ihn verschwinden lassen möchten.
Update 2017 :
Nach stundenlangem Testen habe ich versucht, den Code zu verbessern, schließlich habe ich es geschafft, das Geister-Sprite zu entfernen, aber um gut zu funktionieren, ist eine Bedingung sehr wichtig: Sie sollten SKAction.animate
nicht mit resize
in true verwenden. Dies, weil diese Methode die Größe der Sprites ändert und die Skalierung nicht respektiert (ich verstehe wirklich nicht warum, hoffe auf einige zukünftige Apple-Verbesserungen ...). Dies ist das Beste, was ich bisher erhalten habe:
Code:
%Vor%Wichtiges Detail :
Über isDynamic = true
ist das nicht möglich, weil Apple bei den häufigen Größenänderungen häufig auch die ritter physicsBody zurücksetzt, aber nicht das Erbe der letzten physicsBody
-Eigenschaften auf die neu zurückgesetzte physicsBody
anwendet ist wirklich eine Schande, Sie können es in update Drucken der knight.physicsBody?.velocity
(ist immer Null, aber sollte sich aufgrund der Schwerkraft ändern ...). Dies ist wahrscheinlich der Grund, warum Apple empfohlen hat, Sprites während der Physik nicht zu skalieren. Aus meiner Sicht ist eine Sprite-Kit Einschränkung.
Wie ich bereits in den Kommentaren erwähnt habe, fügen Sie Ihrem Springer ein Kind SKSpriteNode hinzu, das den Kontaktteil der Physik behandelt und nur auf der Grundlage des Springer-Rahmens skaliert:
(Hinweis: Dies ist nur für Demozwecke, ich bin mir sicher, dass Sie eine elegantere Möglichkeit haben, dies mit mehreren Sprites zu bewältigen)
%Vor%Um texturbasierte Körper zu behandeln. Ich würde eine benutzerdefinierte Animation schreiben, um damit umzugehen:
%Vor% Eine andere Idee könnte der Vorschlag sein, dass didEvaluateActions()
eine allgemeinere Methode sucht, um eine "Variable" physicsBody
zu erhalten, die der tatsächlichen aktuellen Springertextur folgt OR Physik-Einstellungen als ein Rechteck Körper wie in diesem Fall:
Update : (Danke an Knight0fDragon und 0x141E Interventionen)
%Vor%Tags und Links swift sprite-kit skphysicsbody texture-atlas