Wie kann man ein Spiel in Spritekit effektiv pausieren?

8

Das scheint so ein Grundkonzept zu sein, aber es gibt wirklich keine gute Antwort.

Ich habe momentan ein ziemlich einfaches Setup, in meiner Spielszene habe ich eine enum gameState , die momentan entweder inGame oder gamePaused ist.

Ich habe meinen Button eingerichtet, und ich habe es so gedrückt, einfach schaltet gameState .

Damit es funktioniert, habe ich zwei verschiedene Update-Methoden: Eine für wenn gamePaused , eine für wenn inGame .

Das funktioniert für 95% meines Spiels, da die Updates in meinem Spiel ohne Probleme problemlos gestartet und gestoppt werden können. Es gibt einige Probleme, die ich jedoch nicht angehen kann.

In erster Linie sind Aktionen. Ich benutze SKActions für ein bisschen von meinem Projekt (etwas Bewegung, Skalierung, Fading ...) und diese Methode hält sie NICHT an. Dies kann in bestimmten Punkten katastrophal sein. Zweitens behandelt dies nicht Partikel, Physik und einige andere Dinge, die nicht direkt mit meinen Update-Methoden verbunden sind.

Der einzige Hinweis, den ich habe, ist self.view.paused = YES , aber das wird auch nicht funktionieren.

Erstens, das repariert meine Aktionen, Partikel und Physikprobleme ... irgendwie. Aber Diese Frage deutet darauf hin, dass SKActions sind nicht wirklich davon betroffen, aber tatsächlich komplett gestoppt. Ist das wahr? Wenn es so ist, dann wird es auch nicht reibungslos funktionieren, weil meine Handlungen aus dem Gleichgewicht geraten sind.

Auch das Anhalten der Ansicht scheint zu tun, was sie sagt: Stoppt alles. ALLES. Newbie Frage hier, aber wie soll ich irgendeinen Code bekommen, um an diesem Punkt zu laufen? Es ist alles abgeschnitten. Ist das wo ich subViews brauche? Ich habe noch nie ein subView verwendet, aber es klingt wie das, was ich in diesem Fall will.

Einfach gesagt, es gibt eine Menge unbeantworteter Fragen für mich, und ich weiß nicht weiter. Ich hoffe, dass es eine 'Standardprozedur' zum Anhalten in Sprite Kit gibt, aber mit dem Anhalten der Ansichtshalteaktionen habe ich wirklich keine Ahnung, wo ich weitermachen soll.

Sollte ich mich von Aktionen entfernen? Ist meine Idee von einer Pause subView Sound?

Ich möchte nicht plappern, alles was ich wissen will ist, wie du in deinem durchschnittlichen Sprite Kit -Projekt pausierst. Zusätzliche Informationen werden auf Anfrage zur Verfügung gestellt.

    
IAmTheAg 07.05.2014, 03:47
quelle

6 Antworten

13

Wenn ein Knoten angehalten wird, werden die Aktionen des Knotens angehalten (nicht gestoppt), und ich nehme an, dass die Pause auch auf alle untergeordneten Knoten des angehaltenen Knotens auf die gleiche Weise angewendet wird. Alle anderen nicht-aktiven Knoten führen ihre Aktionen weiterhin vollständig aus.

Sie sollten einen "Game-Layer" -Knoten mit allen Spielknoten haben, die Sie pausieren möchten, und dann diesen "Game-Layer" -Knoten pausieren. Dann haben Sie einen "pause game menu" -Knoten, wo Sie alle benötigten Pausenmenüs hinzufügen, die auch dann normal funktionieren, wenn die Spielebene pausiert ist.

Seien Sie sehr sicher, dass Sie nicht performSelector oder NSTimer oder GCD oder andere Scheduling-Methoden neben Aktionen oder der update: Methode der Szene verwenden, da diese sich nicht an den pausierten Status eines Knotens halten.

Wenn Sie die Ansicht anhalten, frieren Sie alles darin ein und pausieren Sie die Szene, da einige das Update nicht pausieren würden: Anrufe - aber ich habe das selbst nicht verifiziert. Wenn dies der Fall ist, können Sie in der Aktualisierungsmethode immer überprüfen, ob ein bestimmter Knoten, an den Sie eine Nachricht senden, pausiert ist, und wenn ja, entscheiden Sie sich, bestimmte Nachrichten nicht an diesen Knoten zu senden.

    
LearnCocos2D 07.05.2014, 06:16
quelle
2

Ich habe gerade eine Map-Funktion für alle untergeordneten Elemente der Szene aufgerufen und die paused-Eigenschaft auf true

gesetzt %Vor%

Wenn Sie es auf "true" setzen, können Sie das Einfrieren einfach rückgängig machen.

BEARBEITEN: Verwenden Sie besser eine For-Schleife, um über die Kinder zu iterieren.

%Vor%     
Nick Podratz 22.12.2014 18:45
quelle
1

Ich kann dir sagen, was ich in meinem Spiel gemacht habe:

  1. Pausiert die SKView für -applicationWillResignActive: (oder gleichwertig, mit NSNotification s),

  2. Un-pause die SKView auf -applicationDidBecomeActive: (oder gleichwertig, mit NSNotification s),

Nur für die tatsächliche Spielszene habe ich ein boolesches Flag _isPaused gesetzt, wenn ich aktiv kündige, und wenn es wahr ist, überspringe ich einfach die Methode -update: (Frame-Updates). (Ich zeige auch das "pausierte" Menü, wenn der Benutzer die App wieder aufnimmt).

... Aber mein Spiel ist ein einfaches Puzzle-Spiel, und es gibt keine langen Aktionen, die nach der Pause / Wiederaufnahme weitergehen sollten. Ich kann jetzt nicht bestätigen, dass alle Aktionen abgebrochen wurden, aber ich denke, es ist nicht der Fall.

    
Nicolas Miari 07.05.2014 04:02
quelle
0

Ich habe auch self.children.map{(self.scene?.view?.paused = true as SKNode).paused = false} verwendet und es funktioniert, wenn Sie einen var-Layer vom Typ SKSpriteNode erstellen und ihn über der Szene hinzufügen. Aber ich habe auch einen NSTimer, mit dem ich Sprites in der Szene spawne. Alles, was gerade in der Szene ist, ist pausiert, aber Sprites erscheinen immer wieder und bewegen sich über den Bildschirm. Das Laichen wird nicht pausiert.

Ich habe versucht, den NSTimer anzuhalten, wenn ich den obigen Code aufruft, indem ich repeats auf "false" setze, und dann auf "true" setze, wenn ich den Layer entferne, aber das funktioniert nicht. Ich habe auch %code% ausprobiert, aber das friert alles ein und die Ebene, die ich erstellt habe, erscheint nicht einmal auf dem Bildschirm.

    
eaavendano 20.07.2015 02:10
quelle
0

Sie müssen den Delegaten für die Ansicht festlegen!

%Vor%     
Kevin Weselski 24.09.2015 16:01
quelle
0

Diese Funktion funktioniert perfekt, wenn Sie% code_% nicht zum Aufruf einer Funktion verwenden. Wenn Sie NSTimer verwenden, wird Ihre Ansicht perfekt pausieren, aber wenn Sie das Spiel erneut spielen, sehen Sie, dass alle Funktionen, die die NSTimer-Funktion verwenden, im Backend laufen und Ihr Bildschirm mit NSTimer voll ist. Wenn Sie also sprite-kits in der Funktion verwenden, müssen Sie zuerst die NSTimer-Funktionen anhalten, auch nachdem diese Funktion perfekt funktioniert.

%Vor%     
Rex 31.07.2015 08:56
quelle

Tags und Links