超过一定大小时,CGContextDrawTiledImage显示黑色背景

时间:2016-07-31 06:13:19

标签: ios swift sprite-kit

一个完整的新手Swift和SpriteKit所以请保持温柔。

我正在开发一款简单的游戏,目前它只不过是一个游戏世界和一个向下移动直到它到达游戏世界边缘然后死亡的玩家(嘿!我正在这里学习并且到达了解游戏物理等)。

无论如何,我使用以下代码进行背景渲染,我想创建一个半径为2000的圆形地图,并且我想要平铺的背景图像填充空间,下面的代码创建了平铺背景: / p>

let coverageSize = CGSizeMake(8000, 8000)
let textureSize = CGRectMake(0, 0, 599, 519)
let backgroundCGImage = UIImage(named: "background")?.CGImage
UIGraphicsBeginImageContext(CGSizeMake(coverageSize.width, coverageSize.height))
let context = UIGraphicsGetCurrentContext()
CGContextDrawTiledImage(context, textureSize, backgroundCGImage)
let tiledBackground = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

let backgroundTexture = SKTexture(image: tiledBackground)
let backgroundTiles = SKSpriteNode(texture: backgroundTexture)
backgroundTiles.yScale = 0.5
backgroundTiles.xScale = 0.5

let cropNode = SKCropNode()
let mask = SKShapeNode(circleOfRadius: 2000)
mask.fillColor = UIColor(red: 0/255, green: 0/255, blue: 255/255, alpha: 1.0)
cropNode.maskNode = mask
cropNode.addChild(backgroundTiles)
self.world?.addChild(cropNode)

如果我将coverageSize留在停机坪,请注意我必须创建的coverageSize的大小以覆盖圆半径的大小。 2000然后背景图像显示正确,一旦我超过2000然后背景显示为黑色。如果我将coverageSize缩小到2000,那么我会在纹理边缘和圆边之间显示蓝色背景。

谁能看到我做错了什么?是否有更好的方法来绘制在特定半径内平铺的图像?

1 个答案:

答案 0 :(得分:0)

从一个简单的蓝色图像开始,确保你的裁剪首先工作,然后继续组合裁剪和拼贴节点。此外,虽然在CoreGraphics中执行一个tile会起作用,但它会很慢并且会占用大量内存。在我的blog post上可以找到一个大大改进的impl,你可以直接在SpriteKit着色器中进行平铺,然后裁剪结果。一定要裁剪为白色,裁剪是一个简单的0/1阈值测试,你不应该使用一种颜色。