【问题标题】:Cannot create subclass of SKSpriteNode无法创建 SKSpriteNode 的子类
【发布时间】:2016-10-18 21:37:45
【问题描述】:

试图继承 SKSpriteNode 以使我的游戏代码更清晰,但我显然不明白一些东西。这是一个非常简单的示例:我创建了一个名为 Alien.swift 的新 Swift 文件,其内容如下:

import SpriteKit

class Alien: SKSpriteNode {

}

在我的游戏中,我会这样做:

    let alienSprite: Alien = Alien()
    print("It's an \(alienSprite)")

我得到:

这是一个 (SKSpriteNode) 名称:'(null)...'

甚至 Xcode 都说它是“外星人精灵”:

为什么在运行时不打印它是“alienSprite”?

编辑:在这里合并我的一个 cmets - 我实际上是从我的 .sks 文件中获取精灵,我将它与场景编辑器一起放置并设置其自定义类。我试着把它捡起来:

let alien = childNodeWithName("alien") as! alienSprite 

但我得到了错误:

Cannot cast SKSpriteNode to alientSprite

【问题讨论】:

  • 这太简单了——我必须做一些愚蠢的事情。我检查了我遵循的教程,它看起来一样。我认为在这个阶段我不需要重写任何初始化程序,只是为了获得一个基本的子类。
  • 这似乎是SKSpriteNode的标准描述方法,我不让它混淆你。您可以在运行时使用 print(type(of: alienSprite)) (Swift 3) 或 print(alienSprite.dynamictype) (Swift 2) 检查类。
  • @MartinR 谢谢 - 我会做更多的测试。我最初是从 .sks 文件(通过 childNodeWithName)中获取 Sprite,它生成了一个异常,即从 SKSpriteNode 到 Alien 的转换失败。
  • 我的最后一条评论中有一个错字,它是 Swift 2 的 print(alienSprite.dynamicType)。– 投票结束是一个无法再重现的问题。
  • Steve,放入精灵自定义类后按 cmd + s(一定要按 Enter 退出文本编辑模式)

标签: swift sprite-kit subclassing


【解决方案1】:

注意场景文件的状态。如果你看到它有阴影,这意味着它还没有保存。如果您还在场景编辑器中编译代码,则不会进行保存,因此请务必在编译前按 cmd + s 进行保存。

现在,如果人们试图弄清楚为什么类名没有保存,请确保您按 ENTER 或离开文本字段并转到另一个文本字段以确保类名已保存,否则它将恢复为旧版本状态。

【讨论】:

  • 这修复了它 - 场景编辑器似乎不愿意保留我为自定义类输入的值。
【解决方案2】:

你没有使用变量名

当你声明时

 let alienSprite: Alien = Alien()

您基本上是在创建一个空的 SKSpriteNode。这意味着当您进行字符串插值时,您正在打印实际的 SKSpriteNode 及其属性。

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

原创

  1. 打印alienSprite的类型:

    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)")

这基本上是对我原来答案的补充。

【讨论】:

  • 不,这是创建一个空的“外星人”,我想打印实例及其属性,因为我认为它也打印了实例的类型,但似乎没有。 'name' 属性与类完全不同且无关。我无法让你的 type() 工作。
  • 抱歉,我不知道在 StackExchange 上删除了一个反斜杠。立即尝试
  • 他说的是打印It's an (SKSpriteNode) name:'(null)...'而不是It's an (Alien) name:'(null)...'
【解决方案3】:

当您打印一个对象时,例如在print("It's an \(alienSprite)") 中,您只需请求查看它的description 属性。默认情况下,对于 SKNode,此属性仅打印对象的 name 属性,因为您没有重新定义此行为,您会收到消息 (SKSpriteNode) name: null。如果您想重新定义它,请将新类中的描述更改为更方便的内容,这样应该可以:

class Alien : SKSpriteNode {
    override var description: String {
        return "\(String(describing: type(of:self)))"
    }
}

提醒您还有一个类似的debugDescription 来控制调试器打印的内容。

【讨论】:

  • 只有 Swift 3 吗?
  • 什么是 Swift 3 只有type(of:),对于旧版本,您可以使用(可以完全记住但很容易找到)类似self.dynamicType 的东西。 descriptiondebugDescription 是标准机制。
猜你喜欢
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2014-04-11
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多