2012-03-29 2 views
0

편집 : 알겠습니다 : 하위 클래스에서 초기화 프로세스가 잘못되었습니다. 즉,이 방법은 설명 된대로 작동하지만 하위 클래스 초기화가 수퍼 클래스 초기화 메소드를 제대로 호출하지 않으면 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를 통해 들어오고 가져 왔지만, 내 자신의 클래스는 그렇지 않다. 뭔가 명확해야 해. 도움을 주시면 대단히 감사하겠습니다.

답변

0

내가 얻은 것은 : 나는 나의 하위 클래스에서 잘못된 초기화 과정을 가졌다. 즉,이 방법은 설명 된대로 작동하지만 하위 클래스 초기화가 수퍼 클래스 초기화 메소드를 제대로 호출하지 않으면 Xcode가 모두 혼란스러워지고 혼란스러워집니다.