2016-07-25 14 views
0

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.

+0

Ist das Code * Ihre * 'Update'-Methode oder Apples? Wir müssen * dir * sehen, um zu helfen. – andyvn22

+0

Ich habe meinen Beitrag aktualisiert, um Ihre Frage zu beantworten. Es ist * mein * Code. –

+0

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

Antwort

1

Die Agenten fahren mit ihrer letzten bekannten gültigen Geschwindigkeit fort, wenn ein anderes Ziel sie nicht ändert. Wenn Sie möchten, dass die Agenten aufhören, können Sie versuchen, GKGoals goalToReachTargetSpeed: zu verwenden.

0

Für diejenigen, wo die GKGoal goalToReachTargetSpeed: nicht funktioniert.

meinen MovementComponent aus der Einheit entfernen für mich gearbeitet:

let movementComponent = entity.component(ofType: MovementComponent.self)! 
entity.removeComponent(ofType: MovementComponent.self) 
componentSystem.removeComponent(moveComponent) 

Wenn Sie Ihr Spiel wieder aufnehmen, stellen Sie sicher, dass Sie Ihre Bewegungskomponente eine neue Instanz erstellen und es das Unternehmen erneut hinzufügen:

let movementComponent = MovementComponent() 
entity.addComponent(movementComponent) 
componentSystem.addComponent(moveComponent) 

Wenn eine GKComponentSystem mit Ihrem Bewegungskomponente zu aktualisieren, auch sicherstellen, dass Sie die Bewegungskomponente entsprechend entfernen und hinzufügen.