iOS SpriteKit, как создать узел с изображением из папки в комплекте приложений?

Я пытаюсь создать спрайт случайного монстра, где мои изображения хранятся в папке, на которую ссылается основной пакет.

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?


person Alex Stone    schedule 30.11.2013    source источник


Ответы (2)


В этом случае вы не можете использовать метод 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...

В качестве альтернативы рассмотрите возможность использования текстурные атласы.

person DrummerB    schedule 30.11.2013
comment
Да, я только что узнал, как это сделать с помощью атласов текстур: raywenderlich.com/45152/ - person Alex Stone; 30.11.2013
comment
Есть ли какой-либо источник в spriteNodeWithImageNamed, который точно объясняет, что еще он делает? - person Ryan; 14.03.2014

На самом деле [SKSpriteNode spriteNodeWithImageNamed:] работает для меня, используя абсолютный путь, по крайней мере, в OSX 10.9. Я работаю над проектом, в котором мне нужен доступ к ресурсам за пределами пакета приложений, и он выполняет эту работу без использования SKTexture или NSImage.

Попробуй :D

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