Проблема со спрайтами (загрузка и удаление) -cocos2d iphone - PullRequest
0 голосов
/ 22 июля 2010

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

 const NSString *Animal1[30] = {@"Lion .png",@"Zebra .png",...........

Для загрузки спрайта я использую следующий код

image[i]= [Sprite spriteWithFile: [NSString stringWithFormat:@"%@",Animal1[i]]];
image[i].position = ccp( 240,180 );
[self addChild: image[i]];

Затем для удаления спрайта после использования я использую следующий код

[self removeChild:image[i] cleanup:YES];

Что происходит, когда я запускаю код в симуляторе, так это то, что спрайты загружаются один за другим до 20-го животного. После 20-го звена приложение вылетает. Я не знаю, в чем проблема. Если у меня есть массив меньше 20, он работает нормально, но когда он превышает, приложение перестает работать. Может кто-нибудь плз помочь решить проблему.

Ответы [ 3 ]

0 голосов
/ 26 июля 2010

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

  1. Поместите последний элемент в середину массива.Это все еще взрывается на последнем или на той же записи, независимо от того, в каком положении он находится?
  2. удалить нарушающий элемент, чтобы увидеть, работает ли код без него
  3. проследить через код иувидеть точку входа, где он взрывается, проверить трассировку стека и т. д.
0 голосов
/ 23 января 2011

Чтобы убедиться, что все ваши файлы в порядке, попробуйте загрузить каждый из них вручную, не используя такой массив, как (поставьте точку останова на каждой строке и используйте Build & Debug):

(pseudo code)
add the lion sprite
add the tiger sprite
add the bear sprite
...etc...

Если это работает, тогда протестируйте ваш массив, не используя цикл для загрузки спрайтов, загрузите каждый из них, назвав его индексом (поставьте точку останова в каждой строке и используйте Build & Debug):

(pseudo code)
add image[1]
add image[2]
add image[3]
...etc...

Тогда, если это работает нормально, я бы настроил ваши спрайты и массив спрайтов, например:

(pseudo code)
create the sprite with image[i]
add the sprite to spriteArray
---repeat for each sprite---

Затем сделайте еще один цикл, чтобы добавить спрайты к слою, например:

CGSize size = [[CCDirector sharedDirector] winSize];
for CCSprite *aSprite in SpriteArray {
         aSprite.position = ccp((size.width - (aSprite.contentSize.width / 2)), (aSprite.contentSize.height / 2));  //positions the sprite to the lower right corner
         [self addChild aSprite];
    }

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

Надеюсь, это поможет!

0 голосов
/ 23 июля 2010

Если это работает для первых 20, похоже, что у вас может быть плохое изображение или ошибочное имя файла для этого 21-го изображения.Если вы попытаетесь создать спрайт из неподдерживаемого или несуществующего изображения, вы получите сбой.

Проверьте и убедитесь, что все перечисленные имена файлов действительно находятся внутри вашего пакета (проверьте также, так как они 'чувствителен к регистру!).Убедитесь, что имена файлов точно совпадают - в примере кода, который вы вставили выше, похоже, что в заголовках есть пробелы.

Если все файлы есть, убедитесь, что вы не сохранили одно из них какДокумент Photoshop вместо как .png или что-то.Даже если имя файла заканчивается на .png, это не значит, что оно было сохранено в этом формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...