尝试将SKSpriteNode子类化,以使我的游戏代码更清晰,我显然不理解某些东西。这是一个非常简单的示例:我创建了一个名为Alien.swift
的新Swift文件,其中包含以下内容:
import SpriteKit
class Alien: SKSpriteNode {
}
在我的游戏中,我这样做:
let alienSprite: Alien = Alien()
print("It's an \(alienSprite)")
我得到了:
它是一个(SKSpriteNode)名称:'(null)...'
即使是Xcode也说它是一个外星人精灵':
为什么在运行时打印不是“异形精灵”?
编辑:在这里加入我的一条评论 - 我实际上是从我的.sks文件中获取精灵,我将它放在场景编辑器中并设置其自定义类。我尝试用它来接你:
let alien = childNodeWithName("alien") as! alienSprite
但是我收到了错误:
Cannot cast SKSpriteNode to alientSprite
答案 0 :(得分:3)
注意场景文件的状态。如果你看到阴影,这意味着它还没有保存。如果您仍然在场景编辑器中编译代码,则不会进行保存,因此请确保在编译之前按cmd + s进行保存。
现在,如果有人试图找出为什么不保存类名,请确保按Enter键或保留文本字段并转到另一个文本字段以确保类名保存,否则它将恢复为旧版本状态。
答案 1 :(得分:2)
您没有使用变量名称
宣布
时 let alienSprite: Alien = Alien()
您基本上是在创建一个空的SKSpriteNode。这意味着当您进行字符串插值时,您将打印实际的SKSpriteNode及其属性。
要解决此问题,您有两种选择。
<强>原始强>
打印alienSprite的类型:
print("It's an \(type(of: alienSprite))")
设置Alien的名称并打印:
alienSprite.name = "Alien"
print("It's an \(alienSprite.name)")
<强> 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
来控制调试器打印的内容。