2014-03-01 2 views
1

У меня есть атлас с кучей плиток, и я пытаюсь загрузить их в память с помощью SKTexture и SKTextureAtlas, но он не работает. Я использую следующий код, чтобы загрузить их:ios Загрузка текстуры из атласа не работает

NSString *atlasName = [NSString stringWithFormat:@"Tiles"]; 
SKTextureAtlas *tileAtlas = [SKTextureAtlas atlasNamed:atlasName]; 
NSInteger numberOfTiles = tileAtlas.textureNames.count; 
backgroundTiles = [[NSMutableArray alloc] initWithCapacity:numberOfTiles]; 
for (int y = 0; y < 5; y++) { 
    for (int x = 0; x < 9; x++) { 
     int tileNumber = y*9 + x + 1; 
     NSString *textureName = [NSString stringWithFormat:@"tile%d.png",tileNumber]; 
     SKSpriteNode *tileNode = [SKSpriteNode spriteNodeWithTexture:[tileAtlas textureNamed:textureName]]; 
     CGPoint position = CGPointMake((0.5 + x)*_tileSize - _levelWidth/2,(0.5 - y - 1)*_tileSize + _levelHeight/2); 

     tileNode.position = position; 
     tileNode.zPosition = -1.0f; 
     tileNode.blendMode = SKBlendModeReplace; 

     [(NSMutableArray *)backgroundTiles addObject:tileNode]; 
    } 
} 

Затем я использую этот код, чтобы добавить их в сцену:

- (void)addBackgroundTiles 
{ 
    for (SKNode *tileNode in [self backgroundTiles]) { 
     [self addChild: tileNode]; 
    } 
} 

Проблема оно не загрузить нужную текстуру для плитки или найти текстуры вообще. То, что я в конечном итоге заключается в следующем (игнорировать синий круг): http://i.stack.imgur.com/g39BF.png

Вот мой плитка атлас: http://snk.to/f-ctp5yhpz

EDIT: Я использую NameChanger (www.mrrsoftware.com/MRRSoftware/NameChanger.html) чтобы переименовать все мои плитки, может быть, это программа, которая испортила мои png? насколько я вижу, они находятся в правильном порядке после того, как я переименовал их.

+0

Я не вижу, чтобы смена имени была вашей проблемой, если вы делаете это после того, как ваши рамки были созданы (созданы) и перед тем, как добавить их в атлас. Смена имени не будет переписывать ни один из файлов, просто изменив имена файлов, как вы это сделали бы, если бы вы переименовали их вручную. Разумеется, убедитесь, что они имеют правильное расширение «.png» и префикс @ 2x, если это то, что вы используете. – fuzzygoat

+0

У меня не было расширения @ 2x, но я добавил, что теперь и проблема все еще остается. – Marcus

ответ

0

Почему двойной для петель? Вы сохраняете массив backgroundTiles как свойство?

У меня это произошло недавно, и единственное исправление, которое сработало, было: [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:@"someTile.png"]]; ТекстураWithImageNamed всегда получает правильную.

Так попробуйте:

SKSpriteNode *tileNode = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:textureName]]; 
+0

я нужен х и у, чтобы вычислить положение, вот как я сохранить массив: статического NSArray * backgroundTiles = ноль ;, не как свойство – Marcus

+0

SKTextureAtlas оленьей кожи есть метод textureWithImageNamed – Marcus

+0

Я интересно, если это мой в формате PNG которые в некотором роде ошибаются, но они отлично смотрятся на меня, я действительно смущен. – Marcus

0

Решение

Редактирование мой ответ, чтобы указать на то, что решение в комментариях ниже этого ответа.

Оказалось, что проблема была вызвана тем, что Xcode не восстановил атлас после того, как файлы изображений были переименованы за пределы Xcode (предположительно упомянутым файлом, указанным в OP).

Очистка и восстановление проекта, все текстурные атласы были построены снова, и код OPs начал работать.


Оригинальный ответ

две вещи перепроверить:

  1. ли ваши .atlas добавил в свой проект в качестве папки или группы? Это папка (синий значок в Xcode вместо желтого).
  2. После добавления Tiles.atlas к вашему проекту вы также должны включить создание атласа в настройках Xcode.

См. Здесь по аналогичной проблеме: How to create atlas for SpriteKit. Я связался с Apple documentation on incorporating texture atlases into your projects, который содержит подробную пошаговую инструкцию по активации генерации атласа.

+0

Мой атлас добавлен как папка в моем проекте (синий значок), и у меня есть правильные настройки для генерации атласа в xcode. Я делаю то же самое, что и в ссылке, которую вы разместили: «Как создать атлас для SpriteKit», за исключением того, что у меня есть spriteNodeWithTexture вместо spriteWithTexture, как он писал. – Marcus

+0

В этом случае, возможно, SpriteKit не содержит ссылки на атлас внутри. Попробуйте переместить SKTextureAtlas * в сильное свойство сцены и посмотрите, поможет ли это. –

+0

попробовал это. Я сделал: @property (неатомный, сильный) SKTextureAtlas * tileAtlas; вместо. Проблема все еще остается, и моя сцена выглядит точно так же, как изображение, с которым я связан в исходном вопросе. – Marcus