ios - 如何使用 swift 将 TouchsBegan 事件委托(delegate)给实体组件?

标签 ios swift delegates sprite-kit gesture-recognition

我正在使用 swift 为 ios 创建游戏。我已经实现了 Apple GameplayKit 中的组件实体系统,与 this tutorial 中所示的非常相似。 .

我添加了一个正方形网格,我想对点击手势做出不同的响应。当点击 UI 元素时,我将使用状态机更改游戏状态,但我还想更改每个方 block 对点击手势的 react 方式。根据我目前有限的理解,最好的方法是更改​​点击手势委托(delegate)。然而,我还没有找到任何简单的例子来说明如何做到这一点。这些正方形是 SKSpriteNode。

代码可根据要求提供;但是,我正在寻找一个断章取义的示例,说明如何以最简单的方式完成此操作。

有谁知道如何做到这一点或者可以提出“更好”的方法。为了避免主观性,我将“更好”定义为在架构方面“结构化更好”。 (例如,在单个手势处理程序中使用多个 if 语句似乎是错误的方法。)

最佳答案

根据我得到的各种帮助和想法,我找到了解决问题的有效解决方案,但我仍然对替代解决方案持非常开放的态度。

这个问题提出的主要问题是如何从 spritenode 引用回实体。 通过阅读SKSpriteNode的文档,我发现它的父类SKNode有一个userData attribute ,它允许您在该节点中存储数据。

将实体实例附加到节点需要在 SpriteComponent 中发生,因为这是构造节点的地方,但是它不能在构造函数中发生,因此它必须在 SpriteComponent 中的函数中。

func addToNodeKey() {
    self.node.userData = NSMutableDictionary()
    self.node.userData?.setObject(self.entity!, forKey: "entity")
  }

然后在将组件添加到自身后,在实体类构造中调用该函数。

addComponent(spriteComponent)
spriteComponent.addToNodeKey()

现在可以通过触摸事件访问 Enity 实例,我需要一种方法来在该实例上执行功能,但是您不知道该实例是否是 GKEntity 的子类,也不知道是哪种类型。

因此,我创建了另一个组件,TouchableSpriteComponent。经过一番尝试,init 函数将单个函数作为其参数,然后从场景触摸事件中调用该函数,这允许创建 TouchableSpriteComponent 的实体定义它如何处理该事件。

我创建了 gist for this solution ,因为这里可能需要放置太多代码。这是一个永久链接。

我真的很想知道这是否是一个“好的”解决方案,或者是否有一条更清晰的路线可以达到相同的效果(无需循环遍历所有实体或节点)。

关于ios - 如何使用 swift 将 TouchsBegan 事件委托(delegate)给实体组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35012889/

相关文章:

ios - 尝试将字符串转换为大数时出现错误

iphone - 为什么必须导入我的委托(delegate)头文件?

c# - 使用 Func 将条件组作为参数传递

iOS/Swift 无法将文件写入为将文件路径视为目录路径

后端iOS动态应用流控

ios - 更新 iOS 核心数据版本以避免崩溃

ios - 通过 layoutIfNeeded() 动画特定的约束变化

swift - 如何在 SwiftUI 中绘制直线后的曲线路径

ios - 使大图像适合小尺寸的 ImageView

asp.net - .Net 中的后台处理 - 需要建议