SKTextureAtlas:不止一个地图集令人困惑

时间:2014-01-21 14:14:37

标签: ios objective-c sprite-kit sktextureatlas

使用多个地图册时我遇到了问题。

例如,我有main_menu.atlas和game.atlas以及这些场景的图像。在主菜单场景出现之前,我为它准备了地图集([SKTextureAtlas atlasNamed:@" main_menu"])并且一切正常。但是当我开始游戏并准备游戏地图集([SKTextureAtlas atlasNamed:@"游戏"])之后,我在游戏中看到的只有空节点(红色交叉的矩形)。没有任何记录或警告 - 一切都没问题。

当我将所有游戏资产移动到main_menu.atlas并移除game.atlas时,一切正常 - 我在游戏中看到了精灵。但我想分离地图集进行性能优化。

我使用自己的助手进行SpriteKit纹理管理。它加载地图集并返回我需要的纹理。所以我有这些方法:


- (void) loadTexturesWithName:(NSString*)name {
    name = [[self currentDeviceString] stringByAppendingString:[NSString stringWithFormat:@"_%@", name]];
    SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:name];
    [self.dictAtlases setObject:atlas forKey:name];
}

- (SKTexture *) textureWithName:(NSString*)string {
    string = [string stringByAppendingString:@".png"];

    SKTexture *texture;
    SKTextureAtlas *atlas;
    for (NSString *key in self.dictAtlases) {
        atlas = [self.dictAtlases objectForKey:key];
        texture = [atlas textureNamed:string];
        if(texture) {
            return texture;
        }
    }
    return nil; // never returns "nil" in my cases
}

"清洁"没有帮助。 我做错了什么? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

首先让我说明:你绝对可以使用2+纹理地图集:)

现在发布:

您正在加载菜单图集(首先在dict中),然后是游戏地图集。抓住菜单纹理一切都很好。 当你出去抓取游戏纹理时,你首先要看菜单图集(没有图像可用,因此图集会返回此doc中定义的占位符纹理,而不是你所期望的。

此代码应按预期工作

- (SKTexture *) textureWithName:(NSString*)string {
    string = [string stringByAppendingString:@".png"];

    SKTexture *texture;
    SKTextureAtlas *atlas;
    for (NSString *key in self.dictAtlases) {
        atlas = [self.dictAtlases objectForKey:key];
        if([[atlas textureNames] containsObject:string]){
            texture = [atlas textureNamed:string];
            return texture;
        }
    }
    return nil;
}

此外,它可以正常工作而无需添加.png:)