您的代码是正确的,除非您使用带有大写 H 的 Head 而不是像 playerHead 这样的驼峰式代码。所以这意味着您指的是类定义而不是实例变量。您需要在 GameScene.swift 文件中创建 Head 类的实例,并且您应该在代码中引用它而不是 Head。
这是我在项目中的做法。我在项目中有一个单独的 Swift 文件,名为 Player.swift:
import SpriteKit
class Player: SKSpriteNode {
let playerTexture = SKTexture(imageNamed: "playergraphic")
init() {
super.init(texture: playerTexture, color: .clear, size: playerTexture.size())
}
// Satisfy the NSCoder required init.
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
所以我建立了一个名为Player 的类(您可以使用不同的名称,但请确保像我一样将其大写),它是SKSpriteNode 的一种类型,我已经为其分配了一个纹理,即图像我为玩家角色的图形创建的文件。然后我对其进行初始化并添加所需的 coder init。
现在,转到GameScene 文件:
import SpriteKit
class GameScene: SKScene {
let player = Player()
override func didMove(to view: SKView) {
addChild(player)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
player.position = t.location(in: self)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
player.position = t.location(in: self)
}
}
}
首先我通过创建Player 类的实例来声明player 变量。我决定将其命名为player,但您可以随意命名,但您应该使用 camelCase。现在我可以在这个GameScene 文件的其他地方使用对player 的引用。
接下来,在didMove(to:) 方法中,我将player 对象添加到场景中,以便在场景加载后它会立即出现在屏幕上。最后,在触摸方法中,我引用了player 对象并对它进行了实时更新。在这里,我做同样的事情,用两种方法改变节点的位置,只是为了让例子运行起来更流畅一点。
我把它做成了a demo project on GitHub,你可以下载它并在 Xcode 中打开它来查看文件结构是如何组织的。