iOS SpriteKit如何使用app bundle中的文件夹创建一个带有图像的节点?

时间:2013-11-30 19:15:30

标签: ios objective-c ios7 sprite-kit skspritenode

我正在尝试创建一个随机怪物的精灵,我的图像存储在主束中引用的文件夹中。

NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
NSString* resourceFolderPath = [NSString stringWithFormat:@"%@/monsters", bundlePath];

NSArray* resourceFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:resourceFolderPath  error:nil];

NSInteger randomFileIndex = arc4random() % [resourceFiles count];
NSString* randomFile = [resourceFiles objectAtIndex:randomFileIndex];

SKSpriteNode* tile = [SKSpriteNode spriteNodeWithImageNamed:randomFile];

当我运行上面的代码时,我收到此错误

SKTexture: Error loading image resource: "random_monster.png"

如果我从主包中引用图像,则代码可以正常工作。 如何使用应用套装中文件夹中的随机图片并将其传递给SKSpriteNode?

2 个答案:

答案 0 :(得分:6)

在这种情况下,您无法使用spriteNodeWithImageNamed:方法。您必须自己从绝对路径创建纹理并使用该纹理初始化您的精灵:

NSImage *image = [[NSImage alloc] initWithContentsOfFile:absolutePath];
SKTexture *texture = [SKTexture textureWithImage:image];
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithTexture:texture];

请注意,这样做会丢失使用spriteNodeWithImageNamed:时带来的性能优化(例如缓存和更好的内存处理)

我建议您将图片放在主包中,并使用如下的特定命名方案:

monster_001.png
monster_002.png
monster_003.png
etc...

或者,请考虑使用texture atlases

答案 1 :(得分:0)

实际上[SKSpriteNode spriteNodeWithImageNamed:]使用绝对路径为我工作,至少在OSX 10.9上。我正在开展一个项目,我需要访问应用程序包之外的资源,并且无需SKTexture或NSImage即可完成工作。

试一试:D

NSString *imagePath = @"~/Desktop/test.png";
SKSpriteNode *test = [SKSpriteNode spriteNodeWithImageNamed:[imagePath stringByExpandingTildeInPath]];