편집 : 알겠습니다 : 하위 클래스에서 초기화 프로세스가 잘못되었습니다. 즉,이 방법은 설명 된대로 작동하지만 하위 클래스 초기화가 수퍼 클래스 초기화 메소드를 제대로 호출하지 않으면 Xcode가 모두 혼란스러워지고 혼란스러워집니다.Box2D/UserData/Cocos2D : Box2D에서 CCSprite의 서브 클래 싱이 실패합니까?
케이스가 닫혔습니다.
감사합니다. 서브 클래 싱 된 CCSprite가 Box2D 본문의 userData를 통해 전달 된 후에 올바르게 유형 캐스팅 될 수없는 문제가 있습니다.
주 CCLayer의 update()주기 동안 모든 Box2D 객체를 반복하여 Cocos2D 스프라이트 위치를 업데이트합니다. 나는 스프라이트가이 작업을 수행하여 검색 업데이트주기에
body->SetUserData((__bridge void*) newSprite);
을 설정하여 Box2D의 본문 정의의적인 Cocos2D 스프라이트를 저장 : 지금까지 내 프로젝트에서 잘 작동
CCSprite* thisSprite = (__bridge CCSprite *) body->GetUserData();
. 하지만 오늘, 나는 mySprite는에 CCSprite를 서브 클래스, 및 검색시 :
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는 것입니다 디버거 동안 주장이 (그것도 속성을 보여줍니다), 그 로그를 밝혀 "It 's a 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를 통해 들어오고 가져 왔지만, 내 자신의 클래스는 그렇지 않다. 뭔가 명확해야 해. 도움을 주시면 대단히 감사하겠습니다.