編集: 私はそれを持っています:私は私のサブクラスで間違った初期化プロセスを持っていた。言い換えれば、このメソッドは前述のように動作しますが、サブクラスの初期化でスーパークラスの初期化メソッドが正しく呼び出されない場合は、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に配置され取得されますが、自分のクラスでは使用できません。それは明らかなものになるはずです。 ご協力いただければ幸いです。