Ios SKTextureAtlas:不止一个地图册

Ios SKTextureAtlas:不止一个地图册,ios,objective-c,sprite-kit,sktextureatlas,Ios,Objective C,Sprite Kit,Sktextureatlas,当使用多个图集时,我有问题 例如,我有主菜单.atlas和game.atlas以及这些场景的图像。在主菜单场景出现之前,我为它准备了图集([SkTextureAtlasAtlasNamed:@“main_menu”]),所有工作都很好。但在我开始游戏并准备游戏图集([SkTextureAtlasAtlasNamed:@“game”])之后,在游戏中我只看到空节点(带红色交叉的矩形)。没有例外或警告-一切正常 当我将所有游戏资源移到main_menu.atlas并移除game.atlas时,一切都

当使用多个图集时,我有问题

例如,我有主菜单.atlas和game.atlas以及这些场景的图像。在主菜单场景出现之前,我为它准备了图集([SkTextureAtlasAtlasNamed:@“main_menu”]),所有工作都很好。但在我开始游戏并准备游戏图集([SkTextureAtlasAtlasNamed:@“game”])之后,在游戏中我只看到空节点(带红色交叉的矩形)。没有例外或警告-一切正常

当我将所有游戏资源移到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
}
“干净”没有帮助。 我做错了什么?
提前感谢。

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

现在发布:

您首先加载菜单图集(首先在dict中),然后加载游戏图集。当你抓取菜单纹理时,一切都很好。 当你们出去抓取游戏纹理时,你们首先会在菜单atlas中查看(没有可用的图像,所以atlas会返回在这个菜单中定义的占位符纹理,而不是你们所期望的零)

此代码应按需要工作

- (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:)的情况下也可以正常工作。

我很确定您只能有一个纹理图集,对于sprite工具包,这通常是动态创建的:谢谢。但例如,如果我有两个精灵,它们应该出现在一个场景中,但第一个精灵存储在~iphone.1.png中,第二个精灵存储在~iphone.2.png(另一个精灵表)中,那么这两个精灵表都必须在内存中,并且绘制调用计数会增加吗?我认为如果两个精灵都在一个精灵表中会更好,但是你的链接提供的方法并不能保证这一点。我认为你没有任何选择-它会找到没有问题的精灵。实现这一点的方法是,按照链接中的概述,将所有单个精灵放入项目中,并让SpriteKit构建atlas。就我所知,Sprite套件不是为与预先提供的atlas一起使用而设计的。如果你需要这个,你可能想看看Cocos2d或OpenGLES解决方案。