EDIT:
Я понял: у меня был неправильный процесс инициализации в моем подклассе. Другими словами, этот метод работает так, как описано, но если ваша инициализация подкласса не вызывает методы инициализации суперклассов должным образом, вы в конечном итоге получите XCode, запутавшийся и запутанный.
Дело закрыто.
Спасибо за чтение.
У меня есть проблема, из-за которой подкласс 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 вставляется и извлекается через UserData Box2D, а мои собственные классы - нет ?! Это должно быть что-то очевидное.
Любая помощь будет принята с благодарностью.