2017-12-31 21 views
1

Mit SpriteKit versuche ich ein Pause-Menü zu erstellen, das den Bildschirm animiert (bewegt), wenn der Spieler das Spiel wieder aufnimmt.SKAction läuft nur nach dem Ruhemodus oder während der Ausführung des Debuggers

Ich erstelle eine SKAction und führen Sie es innerhalb berührt begann wie so:

let duration = TimeInterval(0.5) 
let moveAction = SKAction.move(to: CGPoint(x: 0, y: 495) , duration: 
duration) 
pauseScroll?.run(moveAction) 

Die pauseScroll als initialisiert:

weak var pauseScroll: SKSpriteNode? 

override init(size: CGSize) { 
    ... 
    let pauseScene = SKScene(fileNamed: "PauseMenu")! 
    pauseScroll = pauseScene.childNode(withName: "PauseScroll") as? 
    SKSpriteNode 
    pauseScroll?.position = CGPoint(x: 0, y: 495) 
    pauseScroll?.zPosition = 1000 
    pauseScroll?.move(toParent: self) 
} 

Was ich hier tut, um die Benutzeroberfläche des Auslegen pauseScroll in einer anderen spritekit.scene-Datei als das eigentliche GameScene, wo dies alles läuft, ist alles im Code getan. Ich bringe es dann zu und füge es dem GameScene hinzu, indem ich .move (toParent: self) anrufe.

Die Sache ist, ich kann die pauseScroll ganz gut verweisen, ich kann es z. ändere seine Position, gebe ihm einen Physikkörper und eine Kollisionsmaske, registriere Taps auf Knoten, die in der pauseScroll enthalten sind usw. Scheinbar alles außer SKActions darauf laufen zu lassen.

Ich SKActions für andere SKSpriteNodes bei gleichzeitig laufen und sie arbeiten gut, sie natürlich anders initialisiert werden, da sie alle in Code eingerichtet sind, innerhalb des .init zB:

var background: SKSpriteNode! 

override init(size: CGSize) { 
    ... 
    background = SKSpriteNode(imageNamed: "GameBackground") 
    background.size = size 
    addChild(background) 
} 

I dann ihnen die gleiche Art und Weise animieren ich innerhalb berührt etwas anderes tun begann:

let colorAction = SKAction.colorize(withColorBlendFactor: 0.4, 
duration: duration) 
background?.run(colorAction) 

Interessanterweise Wenn ich Schlaf laufen (1) irgendwo sonst in der Funktion, in der SKAction auf der pauseScroll ausgeführt wird; Die Animation wird animiert und bewegt sich vom Bildschirm weg. Daher scheint es eine Wettlaufbedingung zu sein, aber ich habe nicht den leisesten Hinweis darauf, worauf es wartet.

Beim Drucken der Werte von pauseScroll und moveAction bekomme ich das gleiche Ergebnis ob ich schlafe (1) oder nicht.

Hier ist der Fehler in Aktion:

enter image description here

Wenn ich hinzufügen Schlaf (1) an einer beliebigen Stelle innerhalb berührt begann dann das gleiche für 1 Sekunde bis auf die ganze app wartet geschieht, bevor die Scroll-off bewegt sich nach oben oben auf dem Bildschirm, wie es sein soll.

Ich bin glücklich, mehr Code bei Bedarf zur Verfügung stellen.

+0

Bevor Sie sleep() verwenden, warum finden Sie nicht heraus, was es tut? Du verwendest keinen Schlaf in SpriteKit, wenn du nicht genau weißt, was du bekommen sollst. –

+0

lassen waitAction = SKAction.wait (forDuration: Dauer) lassen completionAction = SKAction.run { } –

+0

Aufruf self.run (waitAction, Fertigstellung: {? self.pauseScroll .run (moveAction) }) nicht habe den gleichen Effekt wie Schlaf (1). Obwohl moveAction immer noch wartet, bleibt die Bildfolge im Gegensatz zum Schlaf an ihrem Platz. –

Antwort

1

Wenn Sie die untergeordneten Elemente unter Verwendung der .move(toParent: self) auf die neue übergeordnete Gruppe verschieben, versuchen Sie, die Einstellung isPaused für jedes Kind auf false zu setzen. Ich vermute, dass alle Kinder pausiert sind, wenn Sie sie aus einer Szene laden, und vielleicht setzt SpriteKit isPause auf false automatisch, wenn die Szene zum ersten Mal erscheint.

tempScene.children.forEach() { child in 
      child.isPaused = false 
      child.move(toParent: newParentNode) 
} 
+0

Das hat funktioniert! Ich danke dir sehr. –

Verwandte Themen