无法创建SKSpriteNode的子类

时间:2016-10-18 21:37:45

标签: swift sprite-kit subclassing

尝试将SKSpriteNode子类化,以使我的游戏代码更清晰,我显然不理解某些东西。这是一个非常简单的示例:我创建了一个名为Alien.swift的新Swift文件,其中包含以下内容:

import SpriteKit

class Alien: SKSpriteNode {

}

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

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

我得到了:

  

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

即使是Xcode也说它是一个外星人精灵':

enter image description here

为什么在运行时打印不是“异形精灵”?

编辑:在这里加入我的一条评论 - 我实际上是从我的.sks文件中获取精灵,我将它放在场景编辑器中并设置其自定义类。我尝试用它来接你:

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

但是我收到了错误:

Cannot cast SKSpriteNode to alientSprite

3 个答案:

答案 0 :(得分:3)

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

现在,如果有人试图找出为什么不保存类名,请确保按Enter键或保留文本字段并转到另一个文本字段以确保类名保存,否则它将恢复为旧版本状态。

enter image description here

答案 1 :(得分:2)

您没有使用变量名称

宣布

 let alienSprite: Alien = Alien()

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

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

<强>原始

  1. 打印alienSprite的类型:

    print("It's an \(type(of: alienSprite))")
    
  2. 设置Alien的名称并打印:

    alienSprite.name = "Alien"
    print("It's an \(alienSprite.name)")
    
  3. <强> 16年10月25日

    如果您想要@ Knight0fDragon之类的东西,您可以执行以下操作:

    print("It's an \(type(of: alienSprite)) \(alienSprite)")
    

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

答案 2 :(得分:1)

当您打印对象时,就像在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来控制调试器打印的内容。