2012-03-29 10 views
0

EDIT: Ich habe es: Ich hatte den falschen Initialisierungsprozess in meiner Unterklasse. Mit anderen Worten, diese Methode funktioniert wie beschrieben, aber wenn Ihre Unterklassen-Initialisierung die Super-Klassen-Initialisierungsmethoden nicht richtig aufruft, endet Ihre Sache mit XCode völlig verwirrt und schwachsinnig.Box2D/UserData/Cocos2D: Subclassing CCSprite schlägt für Box2D fehl?

Gehäuse geschlossen.


Danke fürs Lesen. Ich habe ein Problem, bei dem ein unterklassifizierter CCSprite nicht korrekt zurückgeschrieben werden kann, nachdem er durch userData eines Box2D-Bodys übergeben wurde.

Während des update() - Zyklus des Haupt-CCLayers durchlaufe ich alle Box2D-Objekte, um die CoCos2D-Sprite-Positionen zu aktualisieren. Ich speichere eine Cocos2D Sprit im Box2D Körper Definition von

body->SetUserData((__bridge void*) newSprite); 

In dem Update-Zyklus einstellen ich, dass Sprite abrufen, indem dies zu tun:

CCSprite* thisSprite = (__bridge CCSprite *) body->GetUserData(); 

, die bisher gut in meinem Projekt gearbeitet. Aber heute habe ich subclassed CCSprite zu MySprite und auf Abruf:

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]; 

... es stellt sich heraus, dass, während der Debugger Ansprüche die mySprite in der Tat ein MySprite (es zeigt sogar seine Eigenschaften), die Log bekommt das "Es ist ein CCSprite" geschrieben. Die folgenden Codezeilen funktionieren ansonsten gut (unter der Prämisse, dass meinsprite ein CCSprite ist) und können auf die Eigenschaften und Methoden von CCSprite zugreifen - aber nicht von MySprite.

Der Code stürzt auf der letzten Zeile, weil es nicht die „getMySpriteStuff“ Nachricht zugreifen kann: Hier ist ein Auszug aus dem Log:

"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" 

jemand eine Idee, was falsch ich hier tue? Dieser Code funktionierte, bis ich begann, CCSprite abzulagern ... mit anderen Worten, CCSprite wird durch die Box2D UserData eingefügt und abgerufen, aber meine eigenen Klassen nicht ?! Es muss etwas Offensichtliches sein. Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Ich habe es: Ich hatte den falschen Initialisierungsprozess in meiner Unterklasse. Mit anderen Worten, diese Methode funktioniert wie beschrieben, aber wenn Ihre Unterklassen-Initialisierung die Super-Klassen-Initialisierungsmethoden nicht richtig aufruft, endet Ihre Sache mit XCode völlig verwirrt und schwachsinnig.