如何将 SKSpriteNode 合并到 SKTexture 以在 Swift 3 中形成新的 SKSpriteNode?

Posted

技术标签:

【中文标题】如何将 SKSpriteNode 合并到 SKTexture 以在 Swift 3 中形成新的 SKSpriteNode?【英文标题】:How to merge SKSpriteNode into a SKTexture to form new SKSpriteNode in Swift 3? 【发布时间】:2017-04-14 15:12:52 【问题描述】:

我正在开发一个 ios 应用程序。我在屏幕上有一个 SKSpriteNode,我从用户那里得到一张我存储为 SKTexture 的绘图。我想将这两者结合起来,并将它们作为新的 SKSpriteNode 引入。

问题:我找不到有关如何将 SKSpriteNode 合并到 SKTexture 的文档。我确信有办法做到这一点。有人会为此提供示例代码吗?

【问题讨论】:

【参考方案1】:

您可以使用一个可以容纳两个精灵的容器,并使用 SKView 的 texture(from:) 方法从中创建纹理,如下所示:

override func didMove(to view: SKView) 

        backgroundColor = .black

        let container = SKNode()

        let left = SKSpriteNode(color: .purple, size: CGSize(width: 100, height: 100))
        let right = SKSpriteNode(color: .yellow, size: CGSize(width: 100, height: 100))

        container.addChild(left)
        container.addChild(right)

        left.position.x = 50
        right.position.x = -50

        addChild(container)

        if let texture = view.texture(from: container) 
            let sprite = SKSpriteNode(texture:texture)
            addChild(sprite)
            sprite.run(SKAction.moveTo(y: 300, duration: 5))
        

    

如果你想从节点的一部分内容创建纹理,那么你可以使用 SKView 的texture(from:crop:) 方法进行一些裁剪。

【讨论】:

如果我理解正确,我必须将它添加到场景中才能工作?我想我不想那样做。 @user594883 如果您已经在使用精灵,我认为它们已经添加到场景中。如果它们不是场景的一部分,你为什么要使用它们?【参考方案2】:

您可能必须使用 CoreGraphics 来执行此操作。使用SKTexture.cgImage() 方法将SKTextures 转换为CGImage,使用CoreGraphics 组合它们,然后从结果中创建一个新纹理。 SKTexture.init(cgImage:) 方法让你使用 CGImage 对象来构造纹理。

我没有太多使用Core Graphics,但这里有一些相关阅读的链接。我想你会想要使用 CGLayer 类来告诉 CoreGraphics 如何堆叠纹理并随着时间的推移重用精灵纹理,以便 CoreGraphics 可以缓存它以加快速度。

Core Graphics 使用 Quartz 2D 进行快速的 2D 图形操作。我没有玩太多,但我认为它应该是您正在寻找的。​​p>

参考资料:

SKTexture 相关: cgImage() Method init(cgImage:) Method 核心显卡相关: Core Graphics framework CGLayer class 额外参考: A series of tutorials on CG, part 2 is about offscreen rendering

关注我,我觉得很有趣!

编辑 1: 您还必须在精灵上使用SKMutableTexture。该类允许动态更改纹理数据。

【讨论】:

【参考方案3】:

不确定您所说的“合并”是什么意思。如果您想使用现有的 SKTexture 创建一个新的 SKSpriteNode,那么这可能是您正在寻找的代码:

    let newSprite = SKSpriteNode(texture: yourSKTexture)

【讨论】:

我想将新的SKTexture 与现有的SKSpriteNode 结合起来,所以我想我基本上需要将两个纹理合二为一。 也许用新的 SKTexture 创建一个新的 SKSpriteNode 并将该精灵节点添加为现有精灵节点的子节点。根据您想要组合这两个纹理的方式,您可能需要设置 z 位置、alpha、混合因子等。不确定这是否是您正在寻找的效果。也许其他人可以提出更好的建议。 效果是一样的,但我在游戏场景中多次迭代我的节点树。如果我将纹理添加为单独的 SKSpriteNodes,它会很昂贵。不过感谢您的建议! 也许这会有所帮助:***.com/questions/23091001/how-to-combine-sktextures。它是目标 c,但应该很容易翻译成 Swift。他们所做的是将图像合并到 UIImage 中,然后将该 UIImage 用作精灵节点的纹理。

以上是关于如何将 SKSpriteNode 合并到 SKTexture 以在 Swift 3 中形成新的 SKSpriteNode?的主要内容,如果未能解决你的问题,请参考以下文章

如何将SKSpriteNode作为PNG图像保存到相机胶卷?

如何在转到角度之前将 SKSpriteNode 旋转 360°

如何将 SKSpriteNode 放在前面?

将任意信息附加到 SKSpriteNode

无法将孩子添加到 GameScene,只能添加到 SKSpriteNode

无法将 PhysicsBody 添加到 SKSpriteNode(游戏崩溃)