所以在我的游戏中我有一个产生硬币的功能,它们被命名为" 硬币",现在我无法参考硬币,例如杀死它们或移动它们。所以我试图做的是引用能够在我的代码中使用它来改变它的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()
}
答案 0 :(得分:1)
看看你写的是什么
所以在我的游戏中,我有一个产生硬币的功能,它们被命名为“硬币”
看起来场景中有多个硬币。您可以想象,单个名称coin
不足以明确识别超过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
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
。
hideCoin
和showCoin
会更改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()
}
}