Ich habe ein GKAgent2D, das die Bewegung eines SKNode-Gegners steuert, der sich auf ein Ziel zu bewegt.GameplayKit nicht pausiert, wenn die Szene pausiert
Wenn ich die SKScene pausiere, in der sich der Agent befindet, scheint sich der feindliche Knoten weiter zu bewegen, ohne eine solche Bewegung zu zeigen. Alle sichtbaren Bewegungen stoppen (AKA der Feind hört auf sich zu bewegen). Wenn ich 5 Sekunden warte, pausiere ich die Szene, es ist so, als ob der Feind nie aufgehört hätte, sich zu bewegen, und es kommt dorthin, wo es gewesen wäre, hätte ich die Szene nicht pausiert und bewegt sich von diesem Punkt aus normal weiter.
Ich schaute in das Beispiel-Demo-Spiel, das Apple für Benutzer erstellt hatte, um DemoBots genannt zu verwenden, und sie implementieren ein "Fix" ähnlich dem, was ich verwende, einfach die update:(NSTimeInterval *)currentTime
Methode mit einer Rückkehr verlassen. Hier ist, was zur Zeit mein Code wie folgt aussieht:
- (void)update:(NSTimeInterval)currentTime {
[super update:currentTime];
if (_lastUpdateTime == 0) _lastUpdateTime = currentTime;
float delta = currentTime - _lastUpdateTime;
_lastUpdateTime = currentTime;
// Stop updating if the `worldNode` is paused.
if (worldNode.paused) { return };
for (GKComponentSystem *componentSystem in componentSystems) {
[componentSystem updateWithDeltaTime:deltaTime];
}
}
Aber ich bin nicht in der Lage, tiefer zu tauchen und herauszufinden, was sie sonst noch, dass die GKGoal
Ziele zu gewährleisten tun, die derzeit in Kraft sind, werden direkt gestoppt, wenn die Pause passiert. Ich habe sogar die agentDidUpdate-Methode protokolliert und sie hört auf zu brennen, wenn ich die Szene pausiere, also bin ich mir wirklich nicht sicher, wie es weitergeht.
Wenn jemand die Antwort kennt, lass es mich wissen. Vielen Dank!
UPDATE: Ich habe sogar versucht, die einzelnen Knoten pausieren, die die Ziele festgelegt haben zu bewegen:
- (void)didPauseScene {
worldNode.paused = YES;
/*
<<Animations>>
*/
for (OEnemy *enemy /*my subclass*/ in enemyArray) {
enemy.paused = YES;
}
}
Aber dies noch nicht die GKGoals
aus fort hörte, wie sie es ohne die Szene Pause ..
UPDATE 2: die einzige Lösung, die die Agenten Kälte hält buchstäblich die Agentensysteme Zweck Entfernung:
if (worldNode.paused) {
self.agentSystem = nil;
return;
}
Dies ist eine sehr traurige Lösung, da ich hoffe, dass es eine elegantere/geeignetere Möglichkeit gibt, die Ziele zu stoppen, ohne alles vollständig aus der Szene zu entfernen. Das andere Problem ist jedoch, selbst wenn das Zurücksetzen der Ziele nach dem Pausieren das gleiche Problem des Springens zu der Position erzeugt, in der sie sich befinden würden, wenn keine Pausen aufgetreten wären.
Ist das Code * Ihre * 'Update'-Methode oder Apples? Wir müssen * dir * sehen, um zu helfen. – andyvn22
Ich habe meinen Beitrag aktualisiert, um Ihre Frage zu beantworten. Es ist * mein * Code. –
Die Sprite-Kit-Pause ist abgehört, ich werde den gleichen Bug erraten, der im Gameplay-Kit enthalten ist. Wenn Ihre Szene pausiert und pausiert wird, werden alle Ihre Kinder pausiert und pausiert. Überschreiben Sie die pausierte Variable in Ihrer Szene, und setzen Sie den Setter nicht auf den Wert der Eigenschaft – Knight0fDragon