我的应用程序目前使用SpriteKit制作数千个“迷你纹理”的动画。每个感兴趣的对象的转换过程是从UIView到UIImage再到SKTexture再到许多非常小的SKTextures(miniTextures)。我遇到的问题是如何进一步处理那些“有用”的微纹理
许多迷你纹理来自对象/视图/图像/纹理的空白部分,不包含有用的视觉信息(即,它们是空白的)。因此,为它们设置动画将是浪费。问题是,我不知道这方面有什么好的、有效的测试。我曾希望能够以某种方式检查每个纹理的像素,如果纹理中的每个像素的alpha值为0,则该纹理将不会得到处理(即,不会为其创建任何SKSpriteNode)。
作为一种解决方法,我尝试使用SKPhysicsBody(纹理:alphaThreshold:size:)为每个迷你纹理创建一个SKPhysicsBody(请参见下面的代码),当纹理中没有任何内容超过alphaThreshold时,它会返回nil。这样至少可以让我测试并有选择地处理有用的微纹理。但在这样做的时候,我遇到了两个问题:首先,模拟器的速度减慢到了虚拟的静止状态。其次,当使纹理非常小时,所有纹理都被确定为零,而不管我的alphaThreshold如何。
见解?解决方案?同情
for j in stride(from: 0, to: 1, by: yFraction) {
for i in stride(from: 0, to: 1, by: xFraction) {
let miniTexture = SKTexture(rect: CGRect(x: CGFloat(i),
y: CGFloat(j),
width: CGFloat(xFraction),
height: CGFloat(yFraction)),
in: texture)
spriteNode.physicsBody = SKPhysicsBody(texture: miniTexture,
alphaThreshold: 0.5,
size: CGSize(width: 1,
height: 1))
if spriteNode.physicsBody == 0 { continue }
let spriteNode = SKSpriteNode(texture: miniTexture)
spriteNodes.addChild(spriteNode)
}
}