【发布时间】:2023-03-26 12:02:01
【问题描述】:
我正在尝试制作一款游戏,让玩家在特定时间在屏幕上绘制图案。我的解决方案是在屏幕上添加多个节点,这些节点可以通过 SKSpriteNode 的扩展来触摸。 当玩家触摸一个节点时,我想调用 touchesmoved,并将所有触摸到的节点添加到一个数组中。 然后,当玩家停止触摸屏幕时,我想将该数组匹配到另一个数组,然后发生了一些事情。
我一直在玩更新函数,并尝试在每个更新循环中运行一个函数,但效果不佳。我还尝试让 gameScene 类成为我的 touchableShapeNode 类的代表,但我很难让它发挥作用。
class TouchableShapeNode: SKShapeNode {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if (name != nil) {
print("\(name ?? "node") touched")
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if (name != nil) {
print("\(name ?? "node") touched")
}
}
}
我的问题是,现在唯一被选中的节点是我触摸的第一个节点,而不是玩家手指移动过的节点。现在我只是打印触摸节点的名称。
【问题讨论】:
-
嗨,Dan - 我不确定从该代码中如何检测到第一个节点被触摸,因为您的
touchesBegan中没有任何内容可以在触摸时建立节点。但是,为什么不使用 touchesMoved` 来简单地检查每个触摸位置的节点并将其添加到数组中呢?这是在touchesBegan中将节点标记为“已触摸”的一些代码 - 我认为您需要做的就是将类似的代码添加到touchesMovedstackoverflow.com/a/56490384/1430420 -
你不能这样做。您需要在场景级别进行操作。没有 touchBegin 就不会发生 touchMoved 事件,而获得 touchBegin 的唯一方法是将所有节点堆叠在一起并确保它们都不吸收触摸
-
@SteveIves 感谢您的回复!我不确定我是否遵循:) 按照您的链接,我的问题是,当我调用 touchesMoved 时,当我将手指移到除第一个节点之外的任何节点上时,什么都没有发生。这是我尝试过的:覆盖 func touchesMoved(_ touches: Set
, with event: UIEvent?) { if nodeIsTouched { for touch in touches { print("(nodes(at: touch.location(in: self)) )") } } } 但我仍然只将我触摸的第一个节点打印到控制台 -
@DanielUllenius 我添加了一个答案,其中包含一个可能有帮助的小程序。试试看,如果我误解了您的问题,请告诉我,我会尽力解决。
标签: swift sprite-kit 2d-games