2014-09-25 29 views
0

我不确定是否我做错了这个或者有什么东西被“atlasWithDictionary”方法破坏。SpriteKit SKTextureAtlas atlasWithDictionary方法

这是我如何使用它:

NSArray* imageNames = @[ @"image1", @"image2", @"image3", @"image4"]; 
NSMutableDictionary* tempDict = [NSMutableDictionary dictionary]; 

for (int i = 0; i < imageNames.count; i++) { 
    UIImage* texture = [UIImage imageNamed:imageNames[i]]; 

    [tempDict setObject:texture forKey:imageNames[i]]; 
} 



SKTextureAtlas* atlasFullOfTextures = [SKTextureAtlas atlasWithDictionary:tempDict]; 

,再后来在我的代码,每当我会做

SKTexture* tex = [atlasFullOfTextures textureNamed:@"image1"]; 

我只是得到一个零对象。我做了一些故障排除,发现

NSArray* arrayOfNames = [atlasFullOfTextures textureNames]; 

返回一个空数组。

此外,我知道图像加载正常,因为我暂时将字典公开并成功地从UIImage对象中制作SKTextures。

有没有人有任何想法发生了什么?

+0

我实现了你的代码,它按预期工作。你把图像文件添加到你的项目了吗?你为什么使用atlasWithDictionary而不是创建一个atlas文件夹? – 0x141E 2014-09-25 06:01:40

+0

是的,我添加了文件。我甚至通过单独制作纹理进行测试。我这样做的原因是我试图引入一些矢量艺术来减少文件大小,但是如果没有纹理图集,绘制调用可能会很容易上涨。所以我必须将该矢量渲染成内存中的位图,然后在运行时形成一个图集。 – mredig 2014-09-25 07:05:21

+0

好了,我......我只是通过简单地取消注释代码,然后尝试早些时候编写的代码,然后再次尝试。我真的希望这是我犯了一个错误,而不是它不一致。 – mredig 2014-09-25 07:42:49

回答

1

documentation

在字典中的键代表个人 纹理的名字。每个键相关联的对象可以是:

    包含文件系统路径到包含纹理文件
  • 一个NSString对象

  • 包含文件系统文件路径
  • 的NSURL对象包含纹理

  • 甲UIImage对象

  • 一个NSImage中对象

您没有提供图像的路径/网址,您只是使用图像名称而无法告诉它们可能在哪里。您可能还必须指定文件扩展名,因为Sprite Kit可能不会尝试猜测它。如果这些纹理是在运行时获取或创建的纹理,它们将不在捆绑中,因此您必须指定每个纹理的路径(通常位于应用数据或文档文件夹中)。

如果这些图像中的,那么您可能必须指定包目录。但在这种情况下,没有理由在编译时由Xcode创建地图集,然后使用atlasNamed:

+0

这些字符串是将作为UIImage读入的文件名,但我也将过程生成的渲染添加到地图集中。出于某种原因,它随机开始工作,但无论如何,谢谢! :) – mredig 2014-09-25 09:54:59

+1

哦,我忽略了UIImage行。但为什么在运行时从已经在捆绑中的图像创建一个图集?毕竟,如果你在编译时这样做,你的应用程序将会加载得更快。 – LearnCocos2D 2014-09-25 10:02:03

+0

我想减少绘图计数,以包括分段文件以及程序性渲染,并且能够更好地控制png文件的压缩比苹果允许通过创建地图集(我可以削减多数情况下通过https://compressor.io/或类似的文件大小增加50%+文件大小)。 – mredig 2014-09-29 19:02:31