Box2D / UserData / Cocos2D: не удается создать подклассы CCSprite для Box2D? - PullRequest
0 голосов
/ 30 марта 2012

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

1 Ответ

0 голосов
/ 30 марта 2012

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

...