无法创建 SKSpriteNode 的子类

6

我正在尝试对SKSpriteNode进行子类化,以使我的游戏代码更加简洁,但显然我没有理解其中的某些内容。以下是一个非常简单的示例:我创建了一个名为Alien.swift的新Swift文件,其内容如下:

import SpriteKit

class Alien: SKSpriteNode {

}

在我的游戏中,我做:

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

我得到了以下输出:

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

Xcode甚至说它是“aliensSprite”:

enter image description here

为什么在运行时没有打印出它是'alienSprite'?

编辑:将我的一个评论合并到这里 - 我实际上从我的.sks文件中提取精灵,在场景编辑器中放置它并设置其自定义类。我尝试用以下方式提取它:

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

但是我收到了错误提示:
Cannot cast SKSpriteNode to alientSprite

这太基础了 - 我一定是做了些愚蠢的事情。我已经检查了我所遵循的教程,看起来都一样。我认为在这个阶段我不需要覆盖任何初始化器,只需要得到一个基本的子类。 - Steve Ives
2
那只是SKSpriteNode的标准描述方法,不要让它困扰你。你可以在运行时使用print(type(of: alienSprite))(Swift 3)或print(alienSprite.dynamictype)(Swift 2)来检查类。 - Martin R
@MartinR。感谢您关于显示类的提示,尽管Swift2版本无法工作(没有dynamicType属性)。 - Steve Ives
1
我的上一条评论中有一个错别字,正确的是 print(alienSprite.dynamicType) 适用于 Swift 2。- 投票关闭此问题,因为它已经无法再现。 - Martin R
1
在设置精灵自定义类后,Steve,请按下cmd + s键(确保按下回车键以退出文本编辑模式)。 - Knight0fDragon
显示剩余6条评论
3个回答

3
请注意您的场景文件状态。如果它是阴影的,这意味着它还没有保存。如果您在场景编辑器中编译代码,保存不会发生,因此请确保在编译之前按 cmd + s 进行保存。 在此输入图片描述 现在,如果有人试图弄清楚为什么类名没有保存,请确保按 ENTER 或离开文本字段并转到另一个文本字段以确保类名保存,否则它将恢复到旧状态。

enter image description here


这解决了问题 - 场景编辑器似乎不愿意保留我为自定义类设置的值。 - Steve Ives

2

您没有使用变量的名称

当您声明时

 let alienSprite: Alien = Alien()

你基本上正在创建一个空的SKSpriteNode。这意味着当你进行字符串插值时,你会打印出实际的SKSpriteNode及其属性。
为了解决这个问题,你有两个选项。
  1. Print the type of alienSprite:

    print("It's an \(type(of: alienSprite))")
    
  2. Set the name of the Alien and print that:

    alienSprite.name = "Alien"
    print("It's an \(alienSprite.name)")
    

2016年10月25日

如果您想要像@Knight0fDragon那样的东西,您可以按照以下步骤操作:

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

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

不,这将创建一个空的“Alien”,我想打印实例及其属性,因为我认为这也会打印实例的类型,但似乎并不是这样。 “name”属性完全不同且与类无关。我无法让您的type()函数正常工作。 - Steve Ives
抱歉,我不知道在StackExchange上一个反斜杠会被删除。现在请再试一次。 - Jack
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Knight0fDragon

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可控制调试器打印的内容。

这只针对Swift 3吗? - Steve Ives
仅适用于 Swift 3 的是 type(of:),对于旧版本,您可以使用类似于 self.dynamicType(可能不太精确,但很容易找到)。descriptiondebugDescription 是标准机制。 - Jean-Baptiste Yunès

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接