无法将类型“[SKNode]”的值分配给类型 'SKSpriteNode!'
Cannot assign value of type '[SKNode]' to type 'SKSpriteNode!'
我正在使用 SpriteKit 在 Swift 3 中编写一个 Galaga 风格的游戏,但我一直收到一个错误
Cannot assign value of type '[SKNode]' to type 'SKSpriteNode!'
谁能解释一下这是什么意思,以便我以后自己修复它,并给我一个可能的解决方案?
这是我得到错误的函数:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = (touch as UITouch).location(in: self)
if fireButton = self.nodes(at: location) {
shoot()
} else {
let touchLocation = touch.location(in: self)
spaceship.position.x = touchLocation.x
}
}
}
我在 if fireButton = self.nodes(at: location)
行收到错误
函数 self.nodes(at: location)
returns 与 location
相交的所有 SKNode 的数组。发生错误是因为您试图将整个 SKNodes 数组(即 [SKNode]
)分配给仅引用单个节点的变量。
另请注意,由于self.nodes(at: location)
returns 所有与特定位置相交的节点,您将需要遍历节点数组以找到您要查找的节点。
要遍历数组,我建议替换行
if fireButton = self.nodes(at: location) {
shoot()
}
和
let nodes = self.nodes(at: location)
for node in nodes {
if node.name == "fireButton" {
shoot()
}
}
然后在你声明的地方 fireButton
给它起一个名字
fireButton.name = "fireButton"
// just an exmaple, rather store these names as constants somewhere in your code
这是最简单的方法,但您需要记住您为精灵指定的所有名称。一种替代方法是创建一个 FireButton
class 作为 SKSpriteNode 的子 class,将 fireButton
声明为 FireButton
的实例,而不是检查名称,你可以做到
if node is FireButton {
shoot()
}
希望对您有所帮助!
我正在使用 SpriteKit 在 Swift 3 中编写一个 Galaga 风格的游戏,但我一直收到一个错误
Cannot assign value of type '[SKNode]' to type 'SKSpriteNode!'
谁能解释一下这是什么意思,以便我以后自己修复它,并给我一个可能的解决方案?
这是我得到错误的函数:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = (touch as UITouch).location(in: self)
if fireButton = self.nodes(at: location) {
shoot()
} else {
let touchLocation = touch.location(in: self)
spaceship.position.x = touchLocation.x
}
}
}
我在 if fireButton = self.nodes(at: location)
函数 self.nodes(at: location)
returns 与 location
相交的所有 SKNode 的数组。发生错误是因为您试图将整个 SKNodes 数组(即 [SKNode]
)分配给仅引用单个节点的变量。
另请注意,由于self.nodes(at: location)
returns 所有与特定位置相交的节点,您将需要遍历节点数组以找到您要查找的节点。
要遍历数组,我建议替换行
if fireButton = self.nodes(at: location) {
shoot()
}
和
let nodes = self.nodes(at: location)
for node in nodes {
if node.name == "fireButton" {
shoot()
}
}
然后在你声明的地方 fireButton
给它起一个名字
fireButton.name = "fireButton"
// just an exmaple, rather store these names as constants somewhere in your code
这是最简单的方法,但您需要记住您为精灵指定的所有名称。一种替代方法是创建一个 FireButton
class 作为 SKSpriteNode 的子 class,将 fireButton
声明为 FireButton
的实例,而不是检查名称,你可以做到
if node is FireButton {
shoot()
}
希望对您有所帮助!