SKAction不适用于overlaySKScene?

时间:2018-04-17 21:30:17

标签: swift sprite-kit scenekit

我熟悉运行SKActions并且从未遇到过问题。

但问题是,我的主要游戏是使用SceneKit在ARKit中,我在顶部添加一个SpriteKit叠加层以显示一些HUD:

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

2D HUD正确显示,我可以通过代码移动位置,旋转,缩放,但我无法运行任何动画(即使从代码创建节点并将其添加为子节点):

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 个答案:

答案 0 :(得分:2)

根据docs,SKScene.isPaused应设为false:

  

如果值为true,则场景的内容在屏幕上固定。不执行任何操作,也不执行物理模拟。   当应用程序从活动状态转换为非活动状态时,isPaused将自动设置为true。当应用程序返回活动状态时,isPaused将自动设置为其先前的值。

这有点解释了为什么如果你在Xcode中暂停/取消暂停场景,它会运行动作......“活动状态”会发生变化。

因此,在设置overlaySKScene后,您必须记住将其 isPaused 属性设置为false。这会让行动开始,但现在问题变得非常奇怪了。我在Scene.swift中将一个基本的SKSpriteNode声明为frigidityBar。使用Scene.sks中名为“frigidityBar”的SKSpriteNode进行典型设置。

public class Book extends SugarRecord {
    @Override
    public String toString() {
        return App.getGson().toJson(this);
    }
}

像这样对它执行操作不起作用:

 var frigidityBar: SKSpriteNode!

但确实如此。

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

就像这样:

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

即使作为彻底的SKSpriteNode进行投射也会失败:

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

我不希望这里有任何银子弹,但欢迎任何想法,预感或猜测。

答案 1 :(得分:1)

我有同样的问题,如果其他人有答案,我会很乐意欢迎。

我注意到如果我在Xcode中暂停应用程序然后继续操作,则操作会按预期运行。

答案 2 :(得分:1)

在我的案例中,罪魁祸首是SCNView的.isPlaying属性,该属性设置为false(根据文档,默认设置。糟糕!)。

一旦我将其明确设置为true,覆盖场景上的所有SpriteKit动作便开始起作用。

(强而有力的答案提到了SKScene的.isPaused,并确认我的代码中不是这种情况,导致我对SCNView进一步寻找了类似的标志...) < / p>

真的希望我浪费了半天的时间把头撞在墙上对别人有帮助。

答案 3 :(得分:0)

您的设置代码是否被调用?我不认为在覆盖场景的情况下调用-didMoveToView:(它的SKView参数是什么?)

相同的代码可能可以移动到设置叠加场景的地方。