Ich bin mit dem Ausführen von SKActions vertraut und hatte nie Probleme damit.

Aber hier ist das Problem: Mein Hauptspiel ist in ARKit mit SceneKit und ich füge oben ein SpriteKit-Overlay hinzu, um ein HUD anzuzeigen:

sceneView.overlaySKScene = scene
sceneView.overlaySKScene?.isUserInteractionEnabled = false
sceneView.overlaySKScene?.scaleMode = .aspectFit

Das 2D-HUD wird korrekt angezeigt und ich kann Positionen, Rotationen und Skalen nach Code verschieben, aber ich kann keine Animation ausführen (selbst wenn Knoten aus Code erstellt und als untergeordnetes Element hinzugefügt werden):

class OverlaySKScene: SKScene {

    override func didMove(to view: SKView) {
        someSprite = childNode(withName: "someSprite") as! SKSpriteNode
        someSprite.run(SKAction.rotate(byAngle: CGFloat.pi, duration: 1.0))     
    }
}
1
michael-martinez 18 Apr. 2018 im 00:30

4 Antworten

Beste Antwort

Laut den Dokumenten sollte SKScene.isPaused auf false gesetzt werden:

Wenn der Wert wahr ist, wird der Inhalt der Szene auf dem Bildschirm festgelegt. Es werden keine Aktionen ausgeführt und keine Physiksimulation durchgeführt. Wenn eine Anwendung von einem aktiven in einen inaktiven Zustand wechselt, wird isPaused automatisch auf true gesetzt. Wenn eine Anwendung in einen aktiven Zustand zurückkehrt, wird isPaused automatisch auf den vorherigen Wert gesetzt.

Das erklärt irgendwie, warum es die Aktionen ausgeführt hat, wenn Sie die Szene in Xcode anhalten / aufheben ... dieser "aktive Zustand" ändert sich.

Nachdem Sie Ihre overlaySKScene festgelegt haben, müssen Sie daran denken, die Eigenschaft isPaused auf false zu setzen. Das bringt Aktionen zum Laufen, aber jetzt sind die Probleme sehr seltsam geworden. Ich habe einen grundlegenden SKSpriteNode in meiner Scene.swift als frigidityBar deklariert. Typisches Setup mit einem SKSpriteNode namens "frigidityBar" in Scene.sks.

 var frigidityBar: SKSpriteNode!

Das Ausführen einer solchen Aktion funktioniert nicht:

    frigidityBar!.run(SKAction.colorize(with: SKColor.orange, colorBlendFactor: 1.0, duration: 1.0)) {
        print("Colorize action did run!")
    }

Aber das tut es.

    displayNode.childNode(withName: "frigidityBar").run(SKAction.colorize(with: SKColor.orange, colorBlendFactor: 1.0, duration: 1.0)) {
        print("Colorize action did run!")
    }

Wie das:

    (frigidityBar as SKNode).run(SKAction.colorize(with: SKColor.orange, colorBlendFactor: 1.0, duration: 1.0)) {
        print("Colorize action did run!")
    }

Selbst das Casting als direkter SKSpriteNode schlägt fehl:

  (frigidityBar as SKSpriteNode).run(SKAction.colorize(with: SKColor.orange, colorBlendFactor: 1.0, duration: 1.0)) {
        print("Colorize action did run!")
    }

Ich erwarte hier keine Silberkugeln, aber Ideen, Vermutungen oder Vermutungen sind willkommen.

3
leerie simpson 4 Mai 2018 im 18:55

Ich habe das gleiche Problem, wenn jemand eine Antwort hat, wäre es gerne willkommen.

Ich stelle fest, dass die Aktionen wie erwartet ausgeführt werden, wenn ich die App in Xcode anhalte und dann fortsetze.

1
leerie simpson 19 Apr. 2018 im 22:44

In meinem Fall war der Schuldige die .isPlaying -Eigenschaft von SCNView, die auf false festgelegt wurde (die Standardeinstellung laut Dokumentation. Autsch!).

Nachdem ich es explizit auf true gesetzt hatte, begannen alle SpriteKit-Aktionen in meiner Overlay-Szene zu funktionieren.

(Die akzeptierte Antwort, in der SKScene .isPaused erwähnt und bestätigt wurde, dass dies in meinem Code nicht der Fall ist, hat mich veranlasst, in SCNView nach einem ähnlichen Flag zu suchen ...)

Ich hoffe wirklich , dass meine Verschwendung eines halben Tages, wenn ich meinen Kopf gegen die Wand stoße, jemandem hilft.

1
Nicolas Miari 9 Mai 2020 im 04:43

Wird Ihr Setup-Code aufgerufen? Ich glaube nicht, dass -didMoveToView: im Fall einer Overlay-Szene aufgerufen wird (wie würde das Argument SKView lauten?)

Der gleiche Code kann wahrscheinlich an den Ort verschoben werden, an dem die Überlagerungsszene festgelegt ist.

0
mnuages 18 Apr. 2018 im 10:55