0

私はCCSprite(理由のためにここで説明します)、その端の周りにいくらかのパディングがあります. スプライト シートからスプライトを作成していますが、継続的にアニメーション化されています。ここでは、半透明の青いスプライトを追加して、スプライトの を表示してcontentSizeいます。CC_SPRITE_DEBUG_DRAW(両方の)スプライトの周りに境界線を描くためにもオンにしました:

ここに画像の説明を入力

したがって、青いボックスは のboundingBox/contentSizeプロパティを表しますCCSprite。テクスチャ。これは正しい、望ましい機能です。

ただし...ご覧CC_SPRITE_DEBUG_DRAWのとおり、描画されたテクスチャの実際のエッジを認識できます。実際の「描画領域」にアクセスしたいと思います(たとえば、としてCGRect)。つまり、単に青いボックス ( ) ではなく、ユーザーがユニットに触れたかどうかを検出できるようにしたいと考えていますboundingBox

どうすればこれにアクセスできますCGRectか?

4

2 に答える 2

1

のカスタムサブクラスの関数として、私が思いついたコードは次のCCSpriteとおりです。

// In local space
- (CGRect)hitArea {
  CGPoint bl = CGPointMake(MIN(_quad.tl.vertices.x, _quad.bl.vertices.x), MIN(_quad.bl.vertices.y, _quad.br.vertices.y));
  CGPoint tr = CGPointMake(MAX(_quad.tr.vertices.x, _quad.br.vertices.x), MAX(_quad.tl.vertices.y, _quad.tr.vertices.y));
  return CGRectMake(bl.x, bl.y, tr.x - bl.x, tr.y - bl.y);
}

// In game space, like how .boundingBox works
- (CGRect)hitBox {
  return CGRectApplyAffineTransform(self.hitArea, [self nodeToParentTransform]);
}
于 2013-11-09T22:26:15.880 に答える
1

デバッグ描画コードを見ると、次のことがわかりました。

#if CC_SPRITE_DEBUG_DRAW == 1
    // draw bounding box
    CGPoint vertices[4]={
        ccp(_quad.tl.vertices.x,_quad.tl.vertices.y),
        ccp(_quad.bl.vertices.x,_quad.bl.vertices.y),
        ccp(_quad.br.vertices.x,_quad.br.vertices.y),
        ccp(_quad.tr.vertices.x,_quad.tr.vertices.y),
    };
    ccDrawPoly(vertices, 4, YES);
#elif CC_SPRITE_DEBUG_DRAW == 2
    // draw texture box
    CGSize s = self.textureRect.size;
    CGPoint offsetPix = self.offsetPosition;
    CGPoint vertices[4] = {
        ccp(offsetPix.x,offsetPix.y), ccp(offsetPix.x+s.width,offsetPix.y),
        ccp(offsetPix.x+s.width,offsetPix.y+s.height), 
            ccp(offsetPix.x,offsetPix.y+s.height)
    };
    ccDrawPoly(vertices, 4, YES);
#endif // CC_SPRITE_DEBUG_DRAW

quadスプライトのプロパティから必要なものを取得できるようです。または、ここで境界ボックスとテクスチャ ボックスが cocos2d で何を意味するのかわからないため、2 番目の解決策かもしれません。

于 2013-11-09T21:43:30.223 に答える