Допустимо ли создавать SKShapeNode в делегате обновления? - PullRequest
0 голосов
/ 05 марта 2020

Я создаю SKShapeNode в SpriteKit's update delegate, и он работает именно так, как я хочу. Меня беспокоит только то, что update вызывается каждую десятую секунды. Значит ли это, что мой код также часто запускается? Это не очень удобно для исполнения. Есть ли способ обойти это? Или это нормально, если код на update?

Почему код в update стоит на первом месте? Хорошо, если я положу его в didMove или sceneDidLoad, тогда, когда я поверну device, node не будет следовать сразу же, он останется на своем старом месте на полсекунды, прежде чем переместится в свою новую позицию, делая похоже, что он прыгает. Плохой. Update решает это. Вот код:

    override func update(_ currentTime: TimeInterval) {
        let mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
        mySquare.fillColor = SKColor.blue
        mySquare.lineWidth = 1

        mySquare.position = CGPoint(x: 0, y: 0)
        self.addChild(mySquare)
    }
}

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Делать что-либо с обновлением весело c - плохая идея

Документация Apple:

Не вызывайте этот метод напрямую; он вызывается системой ровно один раз за кадр, при условии, что сцена представлена ​​в виде и не приостановлена. Это первый метод, который вызывается при анимации сцены, перед тем, как оцениваются какие-либо действия и перед тем, как симулируется любая физика.

Если вы хотите создавать объекты и управлять ими, вы должны использовать didMove весело c например. И вы можете создать действие, подобное этому , например :

self.run(
    SKAction.repeatForever(
        SKAction.customAction(withDuration: 0.0, actionBlock: { (_, _) in
            // Create and add new node...
        })
    )
)

Но, вероятно, создание нескольких узлов бесконечно - плохая идея.

1 голос
/ 05 марта 2020

Да, вы можете создать. единственная проблема, которая у вас есть, - это создание нового узла каждый раз, когда вызывается обновление. В настоящий момент вы не можете видеть несколько узлов, потому что вы размещаете их друг над другом, если вы пытаетесь изменить положение mySquare при каждом вызове обновления, вы увидите, что у вас есть несколько узлов. созданный, который не эффективен, скоро у вас кончатся частоты кадров. поскольку у вас нет анимации при движении, вы не видите разницы.

override func update(_ currentTime: TimeInterval) {
    let mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
    mySquare.fillColor = SKColor.blue
    mySquare.lineWidth = 1

    mySquare.position = CGPoint(x: randomX, y: randomY)
    self.addChild(mySquare)
}

Изменение положения X и Y даст вам возможность увидеть добавление узлов в другое положение. на экране.

если по какой-либо причине вы хотите создать свой узел mySquare в обновлении , вы можете сохранить ссылку на узел или выполнить поиск узла в родительском узле, если он доступен затем не добавляйте

var mySquare: SKShapeNode

Затем в обновлении проверьте, если ваш квадратный узел не равен нулю или имеет тот же

override func update(_ currentTime: TimeInterval) {
    if mySquire == nil {
      mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
      mySquire.name = "your square name"
      mySquare.fillColor = SKColor.blue
      mySquare.lineWidth = 1

       mySquare.position = CGPoint(x: randomX, y: randomY)
       self.addChild(mySquare)
   }
}

Примечание: вы можете даже проверить имя как

if mySquare.name == "your square name"

тогда не добавляйте его

...