2012-03-29 2 views
0

EDIT: Я понял: у меня был неправильный процесс инициализации в моем подклассе. Другими словами, этот метод работает так, как описано, но если ваша инициализация подкласса неправильно вызывает методы инициализации суперклассов, вы в конечном итоге получаете XCode, все запутанные и проворные.Box2D/UserData/Cocos2D: Подкласс CCSprite не подходит для Box2D?

Корпус закрыт.


Спасибо за чтение. У меня проблема, когда подклассифицированный CCSprite не может быть возвращен в исходное состояние после того, как он был передан через userData объекта Box2D.

Во время цикла update() основного CCLayer я повторяю все объекты Box2D, чтобы обновить положения спрайтов Cocos2D. Я хранить cocos2d спрайт в определении тела Box2D установкой

body->SetUserData((__bridge void*) newSprite); 

В цикле обновления я получить, что Sprite, делая это:

CCSprite* thisSprite = (__bridge CCSprite *) body->GetUserData(); 

Это работало хорошо в моем проекте до сих пор. Но сегодня, я подклассы CCSprite к MySprite, и после извлечения:

MySprite *sprite = (__bridge MySprite*)body->GetUserData(); 
if ([sprite isMemberOfClass:[MySprite class]]) { 
    CCLOG(@"It's a MySprite."); 
} else if ([sprite isMemberOfClass:[CCSprite class] ]) { 
    CCLOG(@"It's a CCSprite."); 
} 
My_SpriteStuff* st = [sprite getMySpriteStuff]; 

... получается, что, в то время как отладчик утверждает, что MySprite действительно MySprite (он даже показывает свои свойства), журнала получает «Это CCSprite». Строки кода, которые следуют иначе, отлично работают (при условии, что mysprite является CCSprite) и могут получить доступ к свойствам и методам CCSprite, но не к MySprite.

Кодовые аварии на последнюю строку, потому что он не может получить доступ сообщения «getMySpriteStuff»: Вот отрывок из журнала:

"It's a CCSprite. 
2012-03-29 16:53:27.145 OME-iOS[2290:1c403] -[CCSprite getMySpriteStuff]: unrecognized selector sent to instance 0x10de3930 
2012-03-29 16:53:27.153 OME-iOS[2290:1c403] ERROR: Uncaught exception -[CCSprite getMySpriteStuff]: unrecognized selector sent to instance 0x10de3930" 

Кто-нибудь есть идея, что я делаю неправильно здесь? Этот код работал до тех пор, пока я не начал подклассифицировать CCSprite ... другими словами, CCSprite получает и получает через Box2D UserData, но мои собственные классы не делают ?! Это должно быть что-то очевидное. Любая помощь будет принята с благодарностью.

ответ

0

Я понял: у меня был неправильный процесс инициализации в моем подклассе. Другими словами, этот метод работает так, как описано, но если ваша инициализация подкласса неправильно вызывает методы инициализации суперклассов, вы в конечном итоге получаете XCode, все запутанные и проворные.

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