Анимация SpriteKit не выполнена надежно - PullRequest
0 голосов
/ 04 ноября 2018

Я работаю над игрой для iOS на основе SpriteKit / Swift с использованием xCode, в настоящее время экспериментирую с анимацией.

Я создал класс 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. Когда я нажимаю «pause» в отладчике и затем «play» снова, действие выполняется!

Это относится как к симулятору, так и к запуску приложения на подключенном iPhone. Под остановкой приложения понимается нажатие кнопки остановки в xCode и возобновление его запуска из xCode.

Цикл обновления является частью подкласса SKScene (в данном случае называется LevelSceneView) и выглядит следующим образом (пока просто играем):

override func update(_ currentTime: TimeInterval) {

    debugPrint("Update called")

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

}

Цикл обновления вызывается правильно, но действие не выполняется (согласно консоли журнала).

Кто-нибудь еще испытывал такое поведение? Любые идеи будут очень цениться. Я надеюсь, что я описал проблему адекватно. В случае каких-либо вопросов, не стесняйтесь спрашивать.

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Я использую простой подкласс из 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!)
            }}
0 голосов
/ 05 ноября 2018

Итак, если я правильно понимаю, анимация не всегда запускается? Я столкнулся с такой проблемой некоторое время назад, используя xCode 9. Я исправил это, переключив свойства сцены isPaused. Таким образом, в конце моего вызова обновления у меня есть две строки кода, которые читаются так:

self.isPaused = true
self.isPaused = false

Таким образом, каждый раз, когда update () вызывается, сцена приостанавливается, а затем приостанавливается. С тех пор у меня никогда не было проблем с запуском анимации. Надеюсь, это поможет обойти проблему.

0 голосов
/ 04 ноября 2018

Где находится ваша анимация?

Если это функция didMove, то ваше действие будет выполняться только при загрузке / загрузке вашего приложения.

Я думаю, что проблема может заключаться в том, что когда вы останавливаете приложение, оно некоторое время остается в памяти телефона.

Это, вероятно, вызовет проблему. Я бы порекомендовал сделать , а не , если это возможно, поместить в функцию didMove какие-либо действия.

...