2

我有大约 120SKSpriteNode秒。

我有一个每个精灵位置的矩阵,在这个矩阵中我存储了精灵的名称。我需要将精灵移动到新位置。

如何按名称获取以下精灵:

let sprite = SKSpriteNode(imageNamed:"BlueSquare")
sprite.name = "BlueSquare1"


// ... in another function
let newsprite = // ???? GET SKSpriteNode by name BlueSquare1????

如何按名称获取节点并SKAction.moveTo在该精灵上使用该函数?

4

1 回答 1

1

调用子节点:

如果您已将您的添加spriteSKScene,您将可以稍后调用它以供使用。

self.addChild(sprite)

如果你想用另一种方法调用它,你可以使用这个:

let sprite = self.childNodeWithName("BlueSpuare1") as? SKSpriteNode

注意使用强制转换SKNodeSKSpriteNode. 您只需要在访问 SKSpriteNode 独有的属性(即texturecolorBlendFactor)时执行此操作。这意味着使用该SKAction.moveTo方法可以在 a 上使用SKNode并且不需要强制转换。


如何移动精灵:

import SpriteKit
class GameScene: SKScene {
    func didMove(to: SKView) {
        let sprite = SKSpriteNode(imageNamed:"BlueSquare")
        sprite.name = "BlueSquare1"
        addChild(sprite)
        moveSquare("BlueSquare1") // Place this line anywhere you want it called
    }

    func moveSquare(_ square: String) {
        let moveTo: CGPoint = // to position
        let time: Double = // duration
        childNode(withName: square).moveTo(moveTo, duration: time)
    }
}

最后提示:

  • 请注意,调用孩子的名字不是递归的。斯威夫特不会调查孙辈的名字等。
  • 如果 2 个子节点具有相同的名称,Swift 会在数组中找到第一个节点,children就像你写的一样:self.children.first { $0.name == "BlueSquare1" }
  • 如果你不给你的节点一个名字,它的默认值是nil. 这意味着它永远不能使用childNode(withName: String). 相反,使用self.children.first { $0.name == nil }.
于 2020-09-18T23:16:44.063 回答