SpriteKit动画无法可靠执行

时间:2018-11-04 10:48:08

标签: ios swift xcode sprite-kit

我正在使用xCode开发基于SpriteKit / Swift的iOS游戏,目前正在尝试制作动画。

我创建了一个类PlayerSprite作为SKSpriteNode的子类,并定义了一种方法moveRight并执行以下操作:

    run(
        SKAction.moveBy(x: 32.0, y: 0.0, duration: 0.25), completion: {
            debugPrint("Action completed.")
        }
    )

只有PlayerSprite类的一个播放器实例属于节点树(SKScene-> SKTileMap-> PlayerSprite)。关键是,上述动作无法可靠执行:

  1. 当我“第一次”启动应用程序时,它会执行。
  2. 当我停止应用程序并再次启动它时,它没有执行。
  3. 当我在调试器中按“暂停”并再次按“播放”时,将执行该操作!

这适用于模拟器以及在连接的iPhone上启动应用程序。停止应用程序是指在xCode中按下停止按钮,然后从xCode重新开始运行。

更新循环是SKScene子类(在本例中为LevelSceneView)的一部分,看起来像这样(到目前为止一直在玩):

override func update(_ currentTime: TimeInterval) {

    debugPrint("Update called")

    if !player.hasActions() {
        player.moveRight()
    }

}

正确调用了更新循环,但未执行操作(根据日志控制台)。

有人经历过这种行为吗?任何想法将不胜感激。我希望我已经充分描述了这个问题。如有任何疑问,请随时提出。

3 个答案:

答案 0 :(得分:0)

您的动画在哪里?

如果它在didMove函数中,则仅在加载/加载应用程序时,您的操作才会运行。

我认为问题可能是当您停止应用程序时,它将在手机内存中保留一段时间。

这可能会导致问题,我建议不要在可能的情况下在didMove函数中放置任何类型的动作。

答案 1 :(得分:0)

我使用SKSpriteNode的简单子类,但没有发现问题。也许您可以从这里重新启动。

class MySpriteNode: SKSpriteNode {

func moveRight(){
    run(
        SKAction.moveBy(x: 3, y: 0.0, duration: 0.25), completion: {
            debugPrint("Action completed.")
    }
    )
  }
  }



       import SpriteKit
        import GameplayKit

        class GameScene: SKScene {

        //    private var label : SKLabelNode?
        //    private var spinnyNode : SKShapeNode?
         private var myNode : MySpriteNode?



        override func update(_ currentTime: TimeInterval) {
            // Called before each frame is rendered
            debugPrint("Update called")

            if !(myNode?.hasActions())! {
                myNode?.moveRight()
            }

        }


        override func didMove(to view: SKView) {

            myNode = MySpriteNode.init(texture: nil, color: UIColor.red, size: CGSize.init(width: 200, height: 200))
            self.addChild(myNode!)
            }}

答案 2 :(得分:0)

因此,如果我理解正确,动画是否总是会运行?前一段时间,我确实使用xCode 9遇到了这样的问题。我解决该问题的方法是切换场景的isPaused属性。因此,在更新调用结束时,我有两行代码如下:

self.isPaused = true
self.isPaused = false

这样,每次调用update()时,都会先暂停然后暂停。从那时起,我就一直没有运行动画的问题。希望这有助于解决问题。