Wasser simulieren / Sprite auf Wasser im Spritekit "schweben" lassen

7

Ich versuche, meinem Spiel Wasser hinzuzufügen. Außer einer anderen Hintergrundfarbe gibt es nicht viel. Allerdings möchte ich, dass player-sprite darüber schwebt (oder halbwegs). Wenn der Spieler von unten in das Wasser läuft, möchte ich, dass er nach oben schwimmt. Wenn er hinfällt, möchte ich, dass er langsam die Richtung ändert und wieder hochfährt.

Ich habe versucht, die Schwerkraft negativ zu machen, wenn er im Wasser ist, aber das gibt mir ein paar leicht unerwünschte Effekte. Wenn er (der Spieler) zum Beispiel auftaucht, wird ihn die normale Schwerkraft zurückstoßen, das Wasser wird ihn hochschieben und so weiter. Letztendlich "springt" der Spieler im Wasser und wird von einem Ende zum anderen geschoben. Ich möchte, dass er ruhig oben auf dem Wasser bleibt, wenn er auftaucht. Wie kann ich das erreichen?

Hier ist der Code, den ich in meinem update-loop :

habe %Vor%

Grundsätzlich ändert sich meine Gravitation in 2 , wenn der Spieler im Wasser ist, und ändert sich ansonsten in -4 , es sei denn, es ist bereits -4 .

Danke!

    
Aleksander 16.08.2014, 23:04
quelle

2 Antworten

20

Es gibt drei mögliche Optionen, die Sie bezüglich der Simulation von Wasser haben.

1) Wie in den Kommentaren erwähnt, könnten Sie versuchen, SKFieldNode (iOS 8+) zu verwenden. Aber aus eigener Erfahrung hat der Feldknoten es nicht wirklich für mich gemacht, weil man mit ihm nur wenig Kontrolle über seine Simulation hat, es sei denn, man passe es stark an. In diesem Fall kann man seine eigenen Berechnungen von Grund auf durchführen und reduzieren Komplexität.

2) Sie können die lineare und rotatorische Dämpfung Ihres Sprites im Wasser einstellen. Tatsächlich erwähnt sogar Apple dies im Zitat ihrer Dokumentation. Das wird dir jedoch keinen Auftrieb geben.

  

Mit den Eigenschaften linearDamping und angularDamping wird berechnet   Reibung am Körper, während er sich durch die Welt bewegt. Zum Beispiel, dies   könnte verwendet werden, um Luft- oder Wasserreibung zu simulieren.

3) Führen Sie die Berechnungen selbst durch. Überprüfen Sie in der Update-Methode, wenn der Körper Sie "Wasser" eingibt, und wenn dies der Fall ist, können Sie die Viskosität und / oder den Auftrieb berechnen und die Geschwindigkeit Ihres Knotens entsprechend anpassen. Dies ist meiner Meinung nach die beste Option, aber auch die schwierigere.

Bearbeiten : Ich habe gerade ein schnelles Beispiel für Option 3 in Swift geschrieben. Ich denke, es ist das, wonach du suchst. Ich habe die Faktor-Konstanten oben hinzugefügt, damit du sie anpassen kannst, um genau das zu bekommen, was du willst. Die Bewegung wird dynamisch angewendet, so dass die aktuelle Geschwindigkeit nicht beeinträchtigt wird (d. H. Du kannst deinen Charakter im Wasser kontrollieren). Unten ist der Code für die Szene und ein GIF. Beachten Sie, dass die Deltazeit 60 Frames pro Sekunde (1/60) beträgt und keine Geschwindigkeitsklemmung vorliegt. Dies sind Funktionen, die Sie je nach Spiel verwenden können oder wollen.

Schnell

%Vor%

Ziel-C

%Vor%     
Epic Byte 17.08.2014, 19:53
quelle
0

Wenn dein Spieler Kontakt mit dem Wasser hat, schieb ihn hoch, bis er nicht mehr mit dem Wasser in Berührung kommt. Ändere zu diesem Zeitpunkt die Kontaktbitmaske des Spielers, um mit dem Wasser zu kollidieren und ihn "auf Wasser laufen zu lassen".

Alternativ können Sie die Modifizierung der Wasserkontaktbitmaske durch einen strategisch platzierten unsichtbaren Knoten auslösen, anstatt auf den Kontakt mit Wasser zu warten.

Um die Kontaktbitmaske des Players wieder auf normal zurückzusetzen, verwenden Sie einen anderen vorher festgelegten Kontakt, den der Spieler machen wird, wie zum Beispiel Land oder ein unsichtbarer Knoten als Auslöser.

    
sangony 17.08.2014 23:27
quelle

Tags und Links