swift - 如何使节点移动到您在 SpriteKit 中触摸屏幕的位置
问题描述
我已经尝试了很多 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
}
}
解决方案
您的代码是正确的,除非您使用Head
的是大写 H 而不是驼峰式的playerHead
. 所以这意味着您指的是类定义而不是实例变量。你需要Head
在你的GameScene.swift
文件中创建一个类的实例,你应该在你的代码中引用它而不是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。player
现在我可以在这个GameScene
文件的其他地方使用该引用。
接下来,在didMove(to:)
方法中,我将player
对象添加到场景中,以便在场景加载后它会立即出现在屏幕上。最后,在触摸方法中,我引用了player
对象并对其进行了实时更新。在这里,我正在做同样的事情,以两种方法更改节点的位置,只是为了让示例运行更顺畅一些。
我把它做成了 GitHub 上的一个演示项目,你可以下载并在 Xcode 中打开它,看看文件结构是如何组织的。
推荐阅读
- liquibase - 多个变更集的 Liquibase 单一前提条件
- python - 从多个文件夹中批量提取和重命名 csv 文件 - Python
- node.js - 安装 npm 模块时行为不一致
- java - 如何在 Mockito 中使用 stub() 方法?
- mips - 手动执行 lb MIPS 指令
- scroll - 停止滚动(当菜单折叠时)
- websocket - Hubot Web 套接字与 Slack 的连接是否安全?
- python-2.7 - 将混合嵌套列表(混合元组和二维列表)转换为 1 个暗淡列表
- python - 嵌入层后的 LSTM - 值错误:不是符号张量吗?
- php - 如何使用 Htaccess 从 .html/ 重定向到 .html?