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