0

cocos2d の学習を始めたばかりで、この問題に長い間悩まされていました。基本的に私がやろうとしているのは、 と を使用してスプライトの境界ボックスにタッチが着地したかどうかを確認して、レイヤー内のスプライトを移動することccTouchBeganですccTouchMoved

他の多くのスプライトを含み、画面サイズよりも大きいレイヤーを移動するまで、すべてが機能しました。レイヤーを移動した後、スプライトのバウンディング ボックスは、スプライト イメージが示す場所とは異なる位置にあります。誰かが以前に同様の問題を経験したことがありますか?

4

2 に答える 2

2

スプライトboundingBoxの座標は、スプライトの親の座標系に対して常に相対的です。親を移動、回転、またはスケーリングしても、子は同じboundingBox. それを別の座標系に変換できます。origin親が移動しただけの場合 (回転またはスケーリングされていない場合)、のを変更するだけで、ワールド座標系に変換できますboundingBox

CGRect boundingBox = child.boundingBox;
boundingBox.origin = [child.parent convertToWorldSpace:boundingBox.origin];
NSLog(@"%@", NSStringFromCGRect(boundingBox));

親がスケーリングされている場合、それに応じて子の boundingBox のサイズが変更されます。親が回転すると、子の境界ボックスのスケールと縦横比の両方が変更される可能性があるため、非常に複雑になります。boundigBox でタッチが発生したかどうかをテストするだけの場合は、タッチ位置を子の親の座標系に変換します。

CGPoint touchLocation = [child.parent convertToNodeSpace:touchWorldLocation]

現在child.boundingBox、 とtouchLocationは同じ座標系にあります。

于 2013-04-28T22:12:59.213 に答える
0

境界ボックスを使用する配列。

CGRect boundingBoxuser = user.boundingBox;
for (CCSprite *spritecoinleft in Arraycoinleft)
{
    CGRect boundingBoxcoinleft = spritecoinleft.boundingBox;


    if((CGRectIntersectsRect(boundingBoxcoinleft,boundingBoxuser)))
    {

        CCLOG(@"hi....!!");

    }

}
于 2016-01-08T11:37:59.127 に答える