问题描述
我已经尝试了许多YouTube教程,但是我找不到真正有效的教程。我正在使用Apple的框架SpriteKit
,并且想使节点移动到我接触的地方。任何帮助将不胜感激,这是我的场景中的一些代码:
let Head = SKNode()
override func touchesMoved(_ touches: Set<UITouch>,with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
Head.position.x = location.x
}
}
解决方法
您的代码是正确的,除了您使用带有大写字母H的Head
而非驼峰式playerHead
之类的东西。因此,这意味着您引用的是类定义,而不是实例变量。您需要在Head
文件中创建GameScene.swift
类的实例,并且应该在代码中引用该实例,而不是Head
。
这就是我在项目中的方法。我在项目Player.swift
中有一个单独的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
的类型,并且为它分配了一个纹理这是我为玩家角色的图形创建的图像文件。然后,我对其进行初始化,并添加所需的编码器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。现在,我可以在此player
文件中的其他地方使用对GameScene
的引用。
接下来,在didMove(to:)
方法中,我将player
对象添加到场景中,以便在场景加载后它立即出现在屏幕上。最后,在触摸方法中,我引用了player
对象并对其进行更改,这些更改将实时更新。在这里,我正在用两种方法改变节点的位置,只是为了使示例运行起来更平滑。
我将其放入a demo project on GitHub中,您可以下载该文件并在Xcode中打开以查看文件结构的组织方式。