2012-01-04 20 views
1

[私には2つのオブジェクトがあり、どちらもCCSpriteのサブクラスです。 それらの一つ一つは、実際にスプライト画像cocos2d CCSprite衝突の問題

例を表しCCSprite変数を持っています

@interface Player : CCSprite 
{ 
    CCSprite *sprite; 
} 

@property (nonatomic, retain) CCSprite *sprite; 

私は両方の衝突を検出しようとしているが、私はしようとすると:

- (void)detectCollision:(id)sender 
{  
    for (Player *tempPlayer in self.playersArray) {   
     if (CGRectIntersectsRect([tempPlayer boundingBox], [mainPlayer boundingBox])) { 
      //Collision 
     } 
    } 
} 

私が試してみると、衝突を認識できません:

- (void)detectCollision:(id)sender 
{  
    for (Player *tempPlayer in self.playersArray) {   
     if (CGRectIntersectsRect([tempPlayer.sprite boundingBox], [mainPlayer.sprite boundingBox])) { 
      //Collision 
     } 
    } 
} 

衝突していない場合でも、両方のオブジェクトが画面に表示されたときに衝突を検出します。

編集: がオブジェクトににBoundingBoxを追加するのを忘れ...

おかげ

答えて

1

tempPlayer.spriteとmainPlayer.spriteの境界ボックスは、ワールドではなくスプライトである独自のスーパービュー内の四角形を表します。たとえば、mainPlayerのrectが(150,200,100,100)で、内部のスプライトが同じrectを持つ場合、boundingBoxは(0、0、100、100)になります。

この問題を解決した後、次のように解決しました。 x tempPlayer.spriteの場合、tempPlayer.spriteの世界座標でのx = xです。

とyと同じものです。

1

あなたはCGRectIntersectCGRectのための参考情報で見たことがありますか?

2つのCGRect構造体を渡す必要があることに注意してください。投稿した最初のコードにPlayerオブジェクトを渡し、2番目のコードにCCSpriteを渡します。

+0

修正済み、boundingBoxを追加するのを忘れていますが、問題はまだ関連しています –

0

私はバウンディングボックスを使用しません。数学をして、オブジェクトの長さ/高さをピクセル単位で把握し、それを使って作業する必要があります。また、アンカーポイントが設定されていると、すべてが捨てられる可能性があり、衝突は機能しません。

(あなたはcocos2dを使用している場合は、おそらくccTime)独自のコリジョン機能/ものを実装するには、あなたの時間関数の内部でそれを行うことができ、そのCGPoints(位置)で動作

私は個人的にどうなるのかザッツが、ほとんどの人はiphoneプログラミングのためにchipmunkを使います。