我正在使用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
答案 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)
}