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

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

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

【问题讨论】:

    标签: ios swift sprite-kit 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>

    参考资料:

    关注我,我觉得很有趣!

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

    【讨论】:

      【解决方案3】:

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

          let newSprite = SKSpriteNode(texture: yourSKTexture)
      

      【讨论】:

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