是否可以平铺纹理SKShapeNode

时间:2016-01-15 17:27:28

标签: ios sprite-kit textures skshapenode

我正在使用Sprite Kit并使用bezier路径创建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从零更改为看到纹理和YES正在工作,但不是我预期的!因此,我们通过这种方式看到纹理,但photo.png宽度和高度被拉伸到myNode的宽度。

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

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

我正在使用xcode 6.4

1 个答案:

答案 0 :(得分:0)

首先,您可以使用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)
}