【问题标题】:Is that possible to tile texture SKShapeNode是否可以平铺纹理SKShapeNode
【发布时间】:2016-01-15 17:27:28
【问题描述】:

我正在使用 Sprite Kit 并使用贝塞尔路径制作了 SKShapeNode。 绘制路径效果很好。 然后我想使用fillTexture 对形状节点进行纹理处理。

SKTexture *tex = [SKTexture textureWithRect:CGRectMake(0, 0, 20, 20) inTexture:[SKTexture textureWithImageNamed:@"photo.png"]];
myNode.fillTexture = [SKTexture textureWithRect:CGRectMake(0, 0, 20, 20) inTexture:tex];

但是我没有运气在我的节点上显示纹理,就像我的节点上没有纹理一样。几周后,我发现了一个技巧,我们必须将 fillColor 设置为 whiteColor 以将 alpha 从零更改以查看纹理,是的,这是有效的,但不像我预期的那样!所以这样我们看到了纹理,但是photo.png 的宽度和高度被拉伸到了myNode 的宽度。

我们有一个大的photo.png,而不是平铺纹理!

这是平铺节点纹理的好方法吗?如果是的话,我错过了什么?

我使用的是 xcode 6.4

【问题讨论】:

  • 您看到的内容与SKShapeNode 文档中对fillTexture 的描述有什么不同吗?
  • 文档说“你可以使用纯色或自定义纹理”,没有更多信息。所以我可以看到我的自定义图像的纹理填充了 SKShapeNode,但只有一张图像被拉伸以填充它,而且我没有平铺纹理。

标签: ios sprite-kit textures skshapenode


【解决方案1】:

首先,您可以使用 SKColor.clearColor(),而不是更改为白色/alpha=0。

至于要点:您的节点被您指定的图像填充,所以这是想要/期望的行为。

[下面的代码是针对 OSX 的; iOS 的工作方式可能略有不同;尤其是焦点锁定部分,但原理是一样的]

虽然 NSColor 有一个 init(patternImage) 属性,可用于填充 NSView,但这不适用于 SKView。但是,它可用于在屏幕外合成图像,然后您可以将其设置为节点的纹理。

要合成图像,您需要创建一个具有节点大小的新图像,将焦点锁定在它上面,然后用平铺纹理填充它。然后您解锁焦点并使用您的新图像作为纹理。

let nodeFill: NSImage = createTiledBackground(myImage, size: NSSize(width: 400, height: 600))

func createTiledBackground(tileImage: NSImage, size: NSSize)->NSImage{
    let tileFill: NSImage = NSImage(size: size)
    tileFill.lockFocus()
    let currentContext = NSGraphicsContext.currentContext()
    currentContext?.imageInterpolation = .High
    tileDrawing(tileImage, size: size)
    tileFill.unlockFocus()
    return tileFill
}

func tileDrawing(tileImage: NSImage, size: NSSize){
    let tileColor = NSColor(patternImage: tileImage)
    tileColor.set()
    let rect = NSRect(x: 0, y: 0, width: size.width, height: size.height)
    NSBezierPath.fillRect(rect)
}

【讨论】:

  • 你能把代码翻译成objective-c,这样我就能更好地理解发生了什么?因为我没有使用 swift。
  • 我会尝试,但这需要几天时间——自从引入 Swift 以来,我还没有编写过 ObjectiveC,也从未为 iOS 编写过 ObjectiveC。
  • 我还没有开始;同时,看看informit.com/articles/article.aspx?p=2234246 - Erika Sadun 的方法与我的方法有些不同 - 但她为 iOS/Objective C 编写了所有正确的代码,所以你应该能够从那里解决它。
  • 好的,我会检查它,但仍在等待您的代码翻译:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多