我遇到了 SpriteKit 的问题(在 OS X 10.11 beta 上尝试了 Xcode 7 beta 和 Xcode 6.4),如果我从单独使用时工作的图像和正常文件创建 SKTextureAtlas,则正常映射光照会发生故障。看这个例子:
从左到右:
- 带有纹理 + 法线 + 光照的精灵(来自地图集的纹理)
- 具有纹理 + 法线的精灵(来自图集的纹理)
- 带有纹理的精灵(来自地图集的纹理)
- 具有正常纹理的精灵(来自图集的纹理)
- 带有纹理 + 法线 + 光照的精灵(通过 imageNamed 从单个文件创建的纹理:)
该图集是在运行时使用 SKTextureAtlas atlasWithDictionary: 创建的,它包含以下纹理:
creating atlas with files: {
"shield-normal.png" = "shield-normal.png";
"shield.png" = "shield.png";
"swords-normal.png" = "swords-normal.png";
"swords.png" = "swords.png";
}
注意:如果我在 Xcode 中创建 Atlas 并通过 atlasNamed 加载它,我会遇到完全相同的问题: - 所以问题绝对不在于创建地图集的方式或时间,而是因为纹理是从第一个地图集中获得的地方。
如果我使用单个文件创建精灵,则照明工作(最右边的图像):
tex = [SKTexture textureWithImageNamed:@"shield.png"];
normal = [SKTexture textureWithImageNamed:@"shield-normal.png"];
test2 = [SKSpriteNode spriteNodeWithTexture:tex normalMap:normal];
test2.position = CGPointMake(580, 400);
test2.lightingBitMask = 0xffffffff;
[self addChild:test2];
我对图集文件做了完全相同的事情,上面的屏幕截图证明我确实获得了精灵纹理的正确图像(左起第 3 和第 4 个),并且正常作为图集中的纹理。然而,结果是左起第一张图像,一个没有法线贴图的光照精灵。
我想知道,普通纹理是否需要一种 SKTextureAtlas 不适用的后处理形式?或者其他人在地图集中有正常纹理的问题吗?
或者这可能是一个错误?
更新:我在一个新的 SpriteKit 应用程序(OS X,在这里下载并自己尝试)中重现了这种行为,代码如下:
-(void)didMoveToView:(SKView *)view {
SKLightNode* light = [SKLightNode node];
light.position = CGPointMake(0, 0);
[self addChild:light];
id move1 = [SKAction moveByX:400 y:300 duration:3];
id move2 = [SKAction moveByX:-400 y:-300 duration:3];
id repeat = [SKAction repeatActionForever:[SKAction sequence:@[move1, move2]]];
[light runAction:repeat];
SKTexture* tex, *nor;
SKSpriteNode* spr;
{ // sprite with textures from individual files: lighting works
tex = [SKTexture textureWithImageNamed:@"shield.png"];
nor = [SKTexture textureWithImageNamed:@"shield-normal.png"];
spr = [SKSpriteNode spriteNodeWithTexture:tex normalMap:nor];
spr.position = CGPointMake(111, 111);
spr.lightingBitMask = 0xffffffff;
[self addChild:spr];
}
{ // sprite with textures from atlas: lighting does not work (no normal-map)
SKTextureAtlas* atlas = [SKTextureAtlas atlasNamed:@"TicTac"];
NSLog(@"atlas texture names: %@", atlas.textureNames);
tex = [atlas textureNamed:@"shield.png"];
nor = [atlas textureNamed:@"shield-normal.png"];
spr = [SKSpriteNode spriteNodeWithTexture:tex normalMap:nor];
spr.position = CGPointMake(222, 111);
spr.lightingBitMask = 0xffffffff;
[self addChild:spr];
}
}