在cocos2d精灵中访问纹理的矩形

时间:2013-11-09 21:38:48

标签: ios iphone cocos2d-iphone

我有CCSprite(由于我会在这里掩饰的原因)它的边缘有一些填充。我正在从精灵表创建精灵,并且它不断动画。在这里,我添加了一个半透明的蓝色精灵来显示精灵的contentSize。我还打开了CC_SPRITE_DEBUG_DRAW以绘制(两个)精灵的边界:

enter image description here

因此,蓝色框表示boundingBox的{​​{1}} / contentSize属性。质地。这是正确的,所需的功能。

然而......正如您所看到的,CCSprite能够识别绘制纹理的实际边缘。我想访问实际的“绘制区域”(例如,作为CC_SPRITE_DEBUG_DRAW)。换句话说:我希望能够检测到用户是否触摸了 上的而不是蓝色框(CGRect)。

如何访问此boundingBox

2 个答案:

答案 0 :(得分: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在这里通过边界框和纹理框来表示什么。

答案 1 :(得分: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]);
}