无法创建 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 及其属性。

要解决此问题,您有两种选择。

原创

  1. 打印外星精灵的类型:

    print("It's an \(type(of: alienSprite))")
    
  2. 设置外星人的名字并打印:

    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 名称保存,否则它将恢复到旧状态。