2013-02-27 2 views
0

Я использую Cocos2d 2.1rc0.runAction не работает для спрайтов из CCSpriteBatchNode

У меня есть этот проект, который отлично работал, когда я не использовал CCSpriteBatchNode. Затем я решил использовать узлы партии, чтобы уменьшить призывы к обращению, и мои проблемы начались.

Много чего не работает. reorderChild - одно. Другой - runAction и без runAction Cocos бесполезен.

Это пример метода, который работает без batchNodes и не работает с ним.

// move/rotate all objects 

for (int i=0; i<[allObjects count]; i++) { 

     Card *object = [allObjects objectAtIndex:i]; 
     [object stopAllActions]; 

     CGPoint center = object.position; 
     center.x = center.x + 100; 
     center.y = center.y - 200; 

     CCMoveTo *moveAction = [CCMoveTo actionWithDuration:0.3f position:ccp(center.x, center.y)]; 
     CCRotateTo *rotateAction = [CCRotateTo actionWithDuration:0.3 angle:0.0f]; 

     CCSpawn *action = [CCSpawn actions:moveAction, rotateAction, nil]; 

     [object runAction:[CCSequence actions: action, 
          [CCDelayTime actionWithDuration:0.1f], 
          nil]]; 
} 

Совершенно ничего не происходит.

Я попытался устранить CCSpanw и использовать runAction непосредственно с помощью перемещения и ничего не работает. Если я использую регулярные спрайты, он работает.

Объекты в этом массиве основаны на классе на основе CCSprite.

Есть ли обходной путь?

+1

Является ли object.isRunning истинным? – YvesLeBorg

+0

странно ДА, но при запуске этого метода нет действий. Почему это да - еще одна загадка. В любом случае, я добавил строку [object stopAllActions] (см. Мой вопрос), и никаких изменений нет. – SpaceDog

+1

isRunning - это базовое свойство CCNode, это ДА между onEnter и onExit. hmmm ... больше нет идей на данный момент, проведет быструю проверку с одним из моих узлов партии, чтобы узнать, могу ли я обмануть вашу проблему. – YvesLeBorg

ответ

1

решение бросить класс объекта, извлеченного из массива ...

вместо

Card *object = [allObjects objectAtIndex:i]; 

это

Card *object = (Card *)[allObjects objectAtIndex:i]; 
+0

hahaha ... О, хорошо, я буду помнить об этом. Я сам подтвердил, что действия выполнялись всего несколько секунд назад. – YvesLeBorg

+0

спасибо в любом случае. По какой-то странной причине это работало без кастинга, но теперь оно просто работает после кастинга. Довольно странно. – SpaceDog

+0

Это действительно странно. Можете ли вы проверить, выполнив однократный переход и в код runAction, что происходит там, если вы не бросили? – LearnCocos2D

0

После перепроверки в чистом проекте что это не странный побочный эффект, я должен сказать, что в вашем проекте есть что-то подозрительное. Трудно сказать, что.

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

Кастинг не должен иметь никакого значения. Составленный или не упакованный спрайт также не должен иметь никакого значения.

Если это так, происходит что-то действительно странное. После того, как все объекты карты совпадают с литьем или без него. Если бы на самом деле не выполнялся метод runAction, вы бы получили ошибку «непризнанный селектор, отправленный в экземпляр». Но это не так.

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

Шаг в метод runAction, если он действительно не запускает действие - я уверен, что он добавит действие в диспетчер действий. Попробуйте использовать и без кастинга, чтобы увидеть, действительно ли существует другой путь кода. Я сомневаюсь в этом.

+0

Я пробовал все это без успеха. Я использую ARC с моей стороны кода, поскольку Cocos2D еще не ARC. Вы пробовали файл reorderChild с пакетными узлами. Не работает для меня. Я не знаю, в чем проблема, но кастинг решает проблему. Я согласен, что это странно, поскольку теория в этом случае теоретически не будет иметь никакого эффекта. – SpaceDog

+0

Вы пытались запустить анализатор? Возможно, это даст ключ. Как вы установили ARC, как статическую библиотеку или с -fno-Objc-arc? Возможно, вы обновили код cocos2d в определенный момент времени (и, следовательно, имеете некоторые новые исходные файлы cocos2d без этого флага)? Не пробовали переупорядочить. Но все это говорит мне, что это всего лишь верхушка айсберга, лежащая в основе (неприятная) проблема, которая могла бы загнать свою уродливую голову в другие места. – LearnCocos2D

+0

-fno-objc-arc flag. Я начал это с чистого проекта Cocos2D (файл, новый проект, cocos2D). Все исходные файлы Cocos2D имеют флаг компилятора. Там нет утечки. Приложение работает красиво. Пожалуйста, попробуйте reorderChild и посмотрите, работает ли он на вас. Попробуйте сгруппированные спрайты на фоне, который представляет собой пакетный спрайт. – SpaceDog

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