如何根据名称编辑精灵?

时间:2016-01-01 04:45:23

标签: swift sprite-kit

所以在我的游戏中我有一个产生硬币的功能,它们被命名为" 硬币",现在我无法参考硬币,例如杀死它们或移动它们。所以我试图做的是引用能够在我的代码中使用它来改变它的zPosition。

每次我运行我的应用程序并运行使用 coinRef [ex。要更改zPosition,应用程序崩溃并出现错误:

  

'线程1 EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码= 0x0)'

继承我的代码:

let coinRef: SKSpriteNode = self.childNodeWithName("coin")! as! SKSpriteNode

    func hideCoins() {
        coinRef.zPosition = -1
    }
    func showCoins() {
        coinRef.zPosition = 101
    }
    func killCoins() {
        coinRef.removeFromParent()
    }

2 个答案:

答案 0 :(得分:1)

看看你写的是什么

  

所以在我的游戏中,我有一个产生硬币的功能,它们被命名为“硬币”

看起来场景中有多个硬币。您可以想象,单个名称coin不足以明确识别超过1枚硬币:)

我们需要一种方法来识别多个硬币。

1。硬币类

class Coin: SKSpriteNode {
    private static var lastID: UInt = 0
    let id:UInt

    init() {
        self.id = Coin.lastID++
        let texture = SKTexture(imageNamed: "coin")
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
        self.name = "coin"
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

正如您所看到的,Coin有一个内部机制,可以为每个新实例分配一个新的id。您可以使用此id来引用场景中的coins

let coin0 = Coin()
coin0.id // 0

let coin1 = Coin()
coin1.id // 1

let coin2 = Coin()
coin2.id // 2

2。管理你的硬币

class GameScene: SKScene {

    func retrieveCoin(id:UInt) -> Coin? {
        return children.filter { ($0 as? Coin)?.id == id }.first as? Coin
    }

    func hideCoin(id:UInt) {
        retrieveCoin(id)?.hidden = true
    }

    func showCoin(id:UInt) {
        retrieveCoin(id)?.hidden = true
    }

    func deleteCoin(id:UInt) {
        retrieveCoin(id)?.removeFromParent()
    }
}

retrieveCoin方法返回(如果存在)具有指定ID的硬币。否则返回nil

hideCoinshowCoin会更改hidden属性以更改其可见性。

最后deleteCoin从指定Coin的{​​{1}}移出场景。

答案 1 :(得分:0)

试试这个。在coinRef函数之前初始化didMoveToView,然后在coinRef函数中为其didMoveToView提供值。

class scene : SKScene {

 let coinRef: SKSpriteNode = SKSpriteNode()

override func didMoveToView(view: SKView) {

     coinRef: SKSpriteNode = self.childNodeWithName("coin")! as! SKSpriteNode
}



func hideCoins() {
coinRef.zPosition = -1
}
func showCoins() {
coinRef.zPosition = 101
}
func killCoins() {
coinRef.removeFromParent()
}


}