3

我有 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?我有什么问题吗?如何解决?

4

1 回答 1

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这样的应用程序来创建您自己的纹理图集并将它们添加到您的项目中。

于 2015-02-03T14:33:14.713 回答