Animationsatlas und dynamische PhysikBody in Swift 3

8

Ich habe ein kleines Testprojekt mit der "Hello World" Sprite-Kit-Vorlage gemacht, wo es eine Atlas-Animation gibt, die aus diesen Bildern besteht:

-

Ich möchte diesen Ritter und seine Animation zeigen.

Ich möchte einen DYNAMISCHEN Physikkörper festlegen.

Also habe ich ein Tool benutzt, um einzelne Frames zu trennen und ich habe einen atlasc Ordner erstellt Also sollte der Code sein:

%Vor%

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?

    
Alessandro Ornano 22.12.2016, 21:51
quelle

3 Antworten

3

Lösung für 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:

  • KEINE CHILDS
  • KEINE ANDEREN GHOST SPRITES
  • KEINE VERLÄNGERUNG
  • KEINE ANIMATE METHODE RECREATED

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.

    
Alessandro Ornano 10.01.2017, 15:45
quelle
3

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%     
Knight0fDragon 22.12.2016 23:13
quelle
2

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%     
Alessandro Ornano 23.12.2016 10:44
quelle