1

[2つのオブジェクトがあり、どちらも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を追加するのを忘れました...

ありがとう

4

3 に答える 3

1

CGRectIntersectCGRectのリファレンス情報を見ましたか?

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

于 2012-01-04T13:25:56.450 に答える
1

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

私はかつてこの問題を抱えて、次のように解決しました:世界座標のtempPlayer.spriteの場合はx=tempPlayerの場合はx+tempPlayer.spriteの場合はx。

yについても同じです。

于 2012-01-04T14:35:27.943 に答える
0

バウンディングボックスは使用しません。いくつかの計算を行い、オブジェクトの長さ/高さをピクセル単位で計算して、それを処理する必要がある場合があります。また、アンカーポイントが設定されている場合、これによりすべてが破棄され、衝突が機能しなくなる可能性があります。

独自の衝突関数/ものを実装するには、時間関数(cocos2dを使用している場合はおそらくccTime)内でそれを実行し、それらのCGPoint(位置)を操作します。

それは私が個人的に行うことですが、ほとんどの人はiPhoneプログラミングにシマリスを使用しています。

于 2012-01-04T14:40:14.010 に答える