SKTextureAtlas textureNamed不会在XCode 6 GM Seed中自动找到纹理后缀@ 3x

时间:2014-09-12 16:39:58

标签: ios xcode sprite-kit iphone-6-plus

我有NSLog我的textureAtlas它已经加载了所有我的@ 3x.PNG但它通过调用textureNamed返回缺少的纹理:

#define TEXT_MAINMENU @"mainmenu"
SKTextureAtlas *textureAtlas = [SKTextureAtlas atlasNamed:@"414x736"];
NSLog(@"atlas: %@", textureAtlas);
SKTexture *_MAINMENU = [textureAtlas textureNamed:TEXT_MAINMENU];
NSLog(@"texture from skatlas: %@", _MAINMENU);

输出在这里:

  

地图集:' 414x736' 83纹理:(       " ' mainmenu@3x.png' (279 x 279)",       " ' winreplay@3x.png' (873 x 131)",       " ' bonus128@3x.png' (279 x 279)",       " ' maincake128@3x.png' (279 x 279)",       " ' bonus512@3x.png' (279 x 279)",........

     来自skatlas的纹理:' MissingResource.png' (128 x 128)

但是,我通过textureWithImageNamed得到纹理(而不是通过SKTextureAtlas textureNamed),它回溯给我@ 1x.PNG?

SKTexture *_MAINMENU2 = [SKTexture textureWithImageNamed:TEXT_MAINMENU];
NSLog(@"texture from sktexture: %@",_MAINMENU2);

输出在这里:

  来自sktexture的纹理:' mainmenu' (90 x 90)

当然我也有@ 1x @ 2x PNG用于运行良好的相同代码,我想知道为什么我的textureAtlas / texture不会自动找到我的@ 3x.PNG?我有什么问题以及如何解决它?

1 个答案:

答案 0 :(得分:1)

您可能收到“MissingResource”消息,因为您没有使用有效密钥访问纹理图集。手动创建纹理图集时,通常使用atlasWithDictionary:,如下所示:

NSDictionary *testDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"mine@1x.png", @"mine64", @"mine@2x.png", @"mine128", @"mine@3x.png", @"mine256", nil];

SKTextureAtlas *testAtlas = [SKTextureAtlas atlasWithDictionary:testDictionary];

mine64是64x64 png,mine128是128x128 png,mine256是256x256 png。显然你需要字典的唯一键,所以你必须手动编码你想要的图像大小,具体取决于iPhone型号,何时放置图像是这样的:

SKSpriteNode *myNode = [SKSpriteNode spriteNodeWithTexture:[testAtlas textureNamed:@"mine256"]];

但是,根据最新的Apple SKTextureAtlas文档:

  

讨论   通常,Xcode会在编译时根据项目中包含的图像文件创建纹理图集。这些地图集在应用程序包中编译和安装。但是,有时创建纹理图集所需的资源在编译时不可用。例如,可以从网络上程序生成或下载这些资产。但是,您仍然希望纹理图集的好处是减少硬件中所需的状态更改次数。您可以使用此方法在运行时生成图集。这是一种可能在您的游戏循环未运行时最佳执行的潜在昂贵操作。

我理解的方式是Xcode将自动生成所有必需的纹理图册本身。考虑到这一点,将这3个图像添加到项目中:mine@1x.png,mine @ 2x.png,mine @ 3x.png然后使用:

SKSpriteNode *myNode = [SKSpriteNode spriteNodeWithImageNamed:@"mine.png"];

将导致根据屏幕分辨率使用正确的图像。

另一种方法是让您使用像TexturePacker这样的应用来创建自己的纹理地图集并将它们添加到您的项目中。