CGRectContainsPoints和边界框检查由几个像素关闭

时间:2012-02-24 02:22:58

标签: cocos2d-iphone

我已经研究了几个小时(实际上是2天)并且无法弄清楚出了什么问题。触摸被接受并处理,但isTouchHandled测试过早地触发TRUE;好像触摸了一个不同的边界框而不是被触摸的边界框。我有几个非重叠的CCSprite按钮,每个按钮都指向levelButtons数组。迭代看看哪一个被触动;但它总是错误的。

如果这些精灵位于他们自己的图层中,那么CGRectContainsPoints方法会被抛弃吗?换句话说,CGRectContainsPoints使用position报告的像素位置的原始相等性是-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{ CCLOG (@"levelButtons size:%i",[self.levelButtons count]); BOOL isTouchHandled = NO; for (int i=0;i<25;i++){ CCSprite*temp=(CCSprite*)[self.levelButtons objectAtIndex:i]; CCLOG(@"iteration temp.tag: %i for object: %i",temp.tag,i); isTouchHandled= CGRectContainsPoint([temp boundingBox], [[CCDirector sharedDirector] convertToGL:[touch locationInView: [touch view]]]); if (isTouchHandled) { CCLOG(@"level touched: %i",temp.tag); break; } } return isTouchHandled; } 吗?如果是这样,精灵相对于整个屏幕的位置与其报告的位置不同,如果它是一个孩子,则相对于父亲。也许这与它有关?我的数组及其内容的标签正确排队,我已经多次登录和检查;它似乎是边界框检查。

rect

更新:顺便说一句,我也只是将CCSprite子类化,并以这种方式将touche方法添加到各个sprite中,将我的精灵数组从图片中删除。结果是一样的,所以我怀疑当{{1}}是其他孩子的孩子时,CGRectContainsPoints没有正常工作,我怀疑坐标没有正确报告。

2 个答案:

答案 0 :(得分:0)

我认为数组可能有问题,你会得到精灵。无论如何,这就是我使用代码获取精灵标记的方式。

   UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector] convertToGL:location];


for(int i1=0;i1<=25;i1++)
{
    CCSprite *sprite1 = (CCSprite *)[self getChildByTag:i1];
    if(CGRectContainsPoint([sprite1 boundingBox], location))

    {
        //Your Code
            break;
    }

}

答案 1 :(得分:0)

我通过为CGRectContainsPoint测试创建一个新的CGRect,并将边界框转换为实际的屏幕矩形来解决这个问题。如果边界框测试位于子精灵(或图层)上,它将无法自行运行。它仅相对于父级返回其本地位置。