2012-03-29 8 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をデバッガしばらく主張が(それもその性質を示す)、そのログが判明します"それはCCSpriteです"と書かれています。後に続くコード行は、myspriteがCCSpriteであることを前提にしてうまく動作し、MySpriteではなくCCSpriteのプロパティとメソッドにアクセスできます。それは「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がすべて混乱して不安定になります。

関連する問題