【问题标题】:Accessing SKView methods from an SKNode从 SKNode 访问 SKView 方法
【发布时间】:2018-08-01 16:44:48
【问题描述】:

在 SpriteKit 开发中,应该如何访问 SKView?

例如;假设我创建了一个名为 Player 的自定义 SKNode 类,以便在我的游戏中使用:

class Player: SKNode {

  /*...*/

}

在这个类中,如果我想从一个 SKShapeNode 生成一个 SKSpriteNode(为了提高性能)我需要使用SKView.texture() 方法。但是我无法访问我的 Player 所在的 SKView,除非我将视图从实例化它的人那里传递给 Player

有什么方法可以获取附加了 SKNode 的当前视图,这样我就不必在我的应用程序周围传递对视图的引用?这只是框架的异常吗?处理这个问题的首选方法是什么?

我使用的是 Swift 语言。

更新

Ron Myschuk 的回答是正确的,我接受了它,因为它可能对社区最有用。但是,我想要从节点内访问视图的用例是为了使用纹理方法从 SKShapeNode 创建 SKSpriteNode。

以下是我想要访问的方法的描述:

渲染节点内容的一部分并将渲染图像作为 SpriteKit 纹理返回。

https://developer.apple.com/documentation/spritekit/skview/1519994-texture

这个方法在视图之外似乎很有用。例如,在初始化/填充尚未添加到显示树的 SKNode 时。

我对这个特定问题的解决方案是简单地动态创建一个 SKView 并将其用于我的需要,允许引擎对它进行垃圾收集。

let view = SKView()
let texture = view.texture(from: someSkShapeNode)
let sprite = SKSprite(texture: texture)

// we don't need view anymore

希望这对某人有所帮助。

【问题讨论】:

标签: ios swift xcode sprite-kit


【解决方案1】:

假设您已将 player 实例添加到场景中,并且您没有在 Player 的初始化程序中执行他的操作,您可以使用 .scene 属性

self.scene?.view

【讨论】:

  • 但我如何确定节点已添加到场景中?是否有我可以使用的 SKNode 的 didMove 等效项?
  • 如果场景还没有添加到场景中,场景将返回 nil,所以只需做一个简单的 nil 检查
  • 当然;但此时代码不会执行。除非我可以在类的构造函数中使用场景,或者在实例化类添加到场景时响应事件,否则我仍然无法使用这种技术。
  • 我想我希望有更多的约定来处理想要使用(看起来是)SKView的实用方法的问题,而不必以某种方式从更远的模式启动显示链。从字里行间看,听起来你在说这是不可能的。
  • 我决定接受您的回答,因为它确实回答了我问题的主要部分,并且可能最好地为社区服务。我已经用针对我的特定用例的解决方案更新了我的问题。
【解决方案2】:

您可以从UIImageCGImage 构建SKTexture,并且可以从您想要的每个复杂路径/绘图创建图像(例如,参见SKTexture from pathDrawing and Creating images)。

【讨论】:

  • 我似乎找不到从您的任何一个链接中的路径创建 SKTexture 的示例。您可以将示例代码添加到您的答案中吗?
  • 有一个创建图像的例子,然后使用来自SKTexture的相应构造函数。
  • 您能否按照最佳实践将示例代码添加到您的答案中?
  • 据我从您的链接中可以看出,没有创建 UIImage 而无需指定文件或填充像素数据的示例。因此,从矢量路径创建纹理的示例不在链接中的任何位置...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2017-02-09
  • 2013-04-21
  • 2018-08-05
相关资源
最近更新 更多