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))
}
}
4 Antworten
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.
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.
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.
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.
Neue Fragen
swift
Swift ist eine sichere, schnelle und ausdrucksstarke Allzweck-Programmiersprache, die von Apple Inc. für seine Plattformen und Linux entwickelt wurde. Swift ist Open Source. Verwenden Sie das Tag nur für Fragen zu Sprachfunktionen oder wenn Sie Code in Swift benötigen. Verwenden Sie die Tags [ios], [ipados], [macos], [watch-os], [tvos], [cocoa-touch] und [cocoa] für (sprachunabhängige) Fragen zu den Plattformen oder Frameworks.