【问题标题】:Swift 3 (SpriteKit): Create a texture from a node treeSwift 3 (SpriteKit):从节点树创建纹理
【发布时间】:2017-01-09 02:38:06
【问题描述】:

我一直在尝试将节点树渲染为SKTexture,作为另一个问题here 的可能解决方案。我试图寻找这个问题的答案,我遇到了 Apple 的开发者页面之一(查看它here)。它说将节点树转换为SKTexture 的命令是这样的:

func texture(from node: SKNode) -> SKTexture?

尽管代码不完整,因为没有代码执行将节点树转换为SKTexture。我是不是做错了什么,或者我应该使用什么代码将节点树渲染为SKTexture

感谢您的任何建议、帮助和答案!

【问题讨论】:

    标签: swift tree sprite-kit sknode sktexture


    【解决方案1】:

    texture(from:)SKView 的一个实例方法,它将一个节点(具有零个或多个子节点)作为参数并返回一个可选的SKTexture。由于返回的值是可选的,因此您需要在使用前将其解包。

    didMove(to:),您可以使用view 参数创建纹理

    if let texture = view.texture(from: node) {
        let sprite = SKSpriteNode(texture:texture)
        addChild(sprite)
    }
    

    SKScene 子类中的其他方法,使用可选链接

    if let texture = self.view?.texture(from: node) {
        let sprite = SKSpriteNode(texture:texture)
        addChild(sprite)
    }
    

    您还可以在矩形内渲染节点树的部分内容

    let rect = CGRect(x:-width/2, y:-height/2, width:width, height:height)
    if let texture = self.view?.texture(from: node, crop: rect) {
        let sprite = SKSpriteNode(texture:texture)
        addChild(sprite)
    }
    

    【讨论】:

    • 这工作谢谢!无论如何在运行时更改纹理的内容,而不是总是在每帧创建一个新纹理。现在,帧速率非常低,因为我每帧都创建一个新纹理。
    • 由于节点树不需要在场景中,您可以在初始化期间预先计算纹理或在运行时在后台线程中将节点树渲染为纹理。如果您的节点树是高度动态的,那么您可能需要使用texture(from:) 以外的其他内容。这取决于您要完成的工作。
    • 纹理在整个程序中发生变化,我想总是用这个纹理制作一个物理体。如何在运行时将节点树渲染为后台线程中的纹理?
    • 我需要了解更多关于节点树及其子节点的信息,特别是节点树的内容如何随时间变化。
    • 如果您单击我原始帖子中的第一个超链接导致我提出另一个问题,则有一个带有父母和孩子的示例代码,并且父母和孩子具有与我实际相同的属性代码。虽然,我没有解释的是每个孩子每帧向后移动相同的量,当最后一个孩子离开屏幕时,一个新的孩子被添加到所有其他孩子的前面(看起来像移动的地形)。这些移动的孩子创造了纹理,正如你所知,它改变了每一帧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2023-03-17
    • 2017-02-02
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多