gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:37:30 24 4
gpt4 key购买 nike

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

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

代码可应要求提供;但是,我正在寻找一个脱离上下文的示例,说明如何以最简单的方式完成此操作。

有谁知道如何做到这一点或可以提出“更好”的方法。为了避免主观性,我在架构方面将更好定义为结构更好。 (例如,单个手势处理程序中的多个 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 将 touchesbegan 事件委托(delegate)给实体组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35012889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com