2013-11-30 1 views
6

Я пытаюсь создать спрайт случайного монстра, где мои изображения хранятся в папке, на которую ссылается основная папка.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?

ответ

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.

+0

Да, я только что узнал, как сделать это с помощью текстуры атласы: http://www.raywenderlich.com/45152/sprite-kit-tutorial-animations-and- texture-atlases –

+0

Есть ли источник на spriteNodeWithImageNamed, который объясняет, что именно он делает? – BigOmega

0

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

Попробуйте: D

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

 Смежные вопросы

  • Нет связанных вопросов^_^