6

我遇到了 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];
    }
}
4

0 回答 0