无法创建 SKSpriteNode 的子类
Cannot create subclass of SKSpriteNode
尝试子class SKSpriteNode 使我的游戏代码更清晰,但我显然不理解某些东西。这是一个非常简单的示例:我创建了一个名为 Alien.swift
的新 Swift 文件,其中包含以下内容:
import SpriteKit
class Alien: SKSpriteNode {
}
在我的游戏中,我这样做:
let alienSprite: Alien = Alien()
print("It's an \(alienSprite)")
我得到:
It's an (SKSpriteNode) name:'(null)...'
连Xcode都说是'aliensSprite':
为什么在 运行 时,它不打印它是一个 'alienSprite'?
编辑:在此处合并我的评论之一 - 我实际上是从我的 .sks 文件中提取精灵,我将其放置在场景编辑器中并设置其自定义 class。我尝试通过以下方式获取它:
let alien = childNodeWithName("alien") as! alienSprite
但我收到错误消息:
Cannot cast SKSpriteNode to alientSprite
您没有使用变量名
当你申报时
let alienSprite: Alien = Alien()
您基本上是在创建一个空的 SKSpriteNode。这意味着当您进行字符串插值时,您正在打印 实际的 SKSpriteNode 及其属性。
要解决此问题,您有两种选择。
原创
打印外星精灵的类型:
print("It's an \(type(of: alienSprite))")
设置外星人的名字并打印:
alienSprite.name = "Alien"
print("It's an \(alienSprite.name)")
10/25/16
如果你想要类似@Knight0fDragon 的东西,你可以执行以下操作:
print("It's an \(type(of: alienSprite)) \(alienSprite)")
这基本上是对我原来答案的补充。
当您打印一个对象时,如print("It's an \(alienSprite)")
,您只需要查看它的description
属性。默认情况下,对于 SKNode
,此 属性 仅打印对象的 name
属性,因为您没有重新定义此行为,您会收到消息 (SKSpriteNode) name: null
。如果您想重新定义它,请将新 class 中的描述更改为更方便的内容,这样的内容应该有效:
class Alien : SKSpriteNode {
override var description: String {
return "\(String(describing: type(of:self)))"
}
}
提醒你也有一个类似的debugDescription
来控制调试器打印的内容。
注意场景文件的状态。如果你看到它有阴影,这意味着它还没有保存。如果您仍在场景编辑器中编译代码,则不会进行保存,因此请务必在编译前按 cmd + s 进行保存。
现在,如果有人想弄清楚为什么 class 名称没有保存,请确保您按下 ENTER 键或离开文本字段并转到另一个文本字段以确保 class 名称保存,否则它将恢复到旧状态。
尝试子class SKSpriteNode 使我的游戏代码更清晰,但我显然不理解某些东西。这是一个非常简单的示例:我创建了一个名为 Alien.swift
的新 Swift 文件,其中包含以下内容:
import SpriteKit
class Alien: SKSpriteNode {
}
在我的游戏中,我这样做:
let alienSprite: Alien = Alien()
print("It's an \(alienSprite)")
我得到:
It's an (SKSpriteNode) name:'(null)...'
连Xcode都说是'aliensSprite':
为什么在 运行 时,它不打印它是一个 'alienSprite'?
编辑:在此处合并我的评论之一 - 我实际上是从我的 .sks 文件中提取精灵,我将其放置在场景编辑器中并设置其自定义 class。我尝试通过以下方式获取它:
let alien = childNodeWithName("alien") as! alienSprite
但我收到错误消息:
Cannot cast SKSpriteNode to alientSprite
您没有使用变量名
当你申报时
let alienSprite: Alien = Alien()
您基本上是在创建一个空的 SKSpriteNode。这意味着当您进行字符串插值时,您正在打印 实际的 SKSpriteNode 及其属性。
要解决此问题,您有两种选择。
原创
打印外星精灵的类型:
print("It's an \(type(of: alienSprite))")
设置外星人的名字并打印:
alienSprite.name = "Alien" print("It's an \(alienSprite.name)")
10/25/16
如果你想要类似@Knight0fDragon 的东西,你可以执行以下操作:
print("It's an \(type(of: alienSprite)) \(alienSprite)")
这基本上是对我原来答案的补充。
当您打印一个对象时,如print("It's an \(alienSprite)")
,您只需要查看它的description
属性。默认情况下,对于 SKNode
,此 属性 仅打印对象的 name
属性,因为您没有重新定义此行为,您会收到消息 (SKSpriteNode) name: null
。如果您想重新定义它,请将新 class 中的描述更改为更方便的内容,这样的内容应该有效:
class Alien : SKSpriteNode {
override var description: String {
return "\(String(describing: type(of:self)))"
}
}
提醒你也有一个类似的debugDescription
来控制调试器打印的内容。
注意场景文件的状态。如果你看到它有阴影,这意味着它还没有保存。如果您仍在场景编辑器中编译代码,则不会进行保存,因此请务必在编译前按 cmd + s 进行保存。
现在,如果有人想弄清楚为什么 class 名称没有保存,请确保您按下 ENTER 键或离开文本字段并转到另一个文本字段以确保 class 名称保存,否则它将恢复到旧状态。