Cocos2d iphone CGRectContainsPoints和边界框复选框已禁用几个像素

Cocos2d iphone CGRectContainsPoints和边界框复选框已禁用几个像素,cocos2d-iphone,Cocos2d Iphone,我已经研究了几个小时(实际上是两天),但就是不知道到底是什么错了。触摸被接受和处理,但isTouchHandled测试过早触发TRUE;好像触摸的边界框与触摸的边界框不同。我有几个不重叠的CCSprite按钮,每个按钮都指向levelButtons数组。反复浏览以查看哪一个被触摸;但总是错的 如果这些精灵在自己的层中,而在另一层中,那么CGRectContainsPoints方法是否会被抛出?换句话说,CGRectContainsPoints是否使用了由位置报告的像素位置的原始相等性?如果是,则

我已经研究了几个小时(实际上是两天),但就是不知道到底是什么错了。触摸被接受和处理,但
isTouchHandled
测试过早触发TRUE;好像触摸的边界框与触摸的边界框不同。我有几个不重叠的CCSprite按钮,每个按钮都指向
levelButtons
数组。反复浏览以查看哪一个被触摸;但总是错的

如果这些精灵在自己的层中,而在另一层中,那么
CGRectContainsPoints
方法是否会被抛出?换句话说,
CGRectContainsPoints
是否使用了由
位置
报告的像素位置的原始相等性?如果是,则精灵相对于整个屏幕的位置不同于其报告的位置(如果精灵是子屏幕,则相对于父屏幕)。也许这与此有关?我的数组及其内容的标签排列正确,我已经记录并检查了很多次;它似乎是边界框复选框

-(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;
}
-(BOOL)cctouch开始:(UITouch*)触摸事件:(UIEvent*)事件{
CCLOG(@“levelButtons大小:%i,[self.levelButtons计数]);
BOOL=否;

对于(int i=0;i我认为数组中可能存在获取精灵的问题。无论如何,这就是我使用代码获取精灵标记的方式

   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;
    }

}
UITouch*touch=[触摸任何对象];
CGPoint location=[touch locationInView:[touch view]];
location=[[CCDirector sharedDirector]convertToGL:location];

对于(int i1=0;i1我通过为
CGRectContainsPoint
测试创建一个新的CGRect,并将边界框转换为屏幕上的实际矩形来解决这个问题;如果边界框测试位于子精灵(或层)上,它将无法单独工作。它仅返回其相对于父对象的局部位置。

我发现您没有使用标准边界框检查。我怀疑我的数组是问题所在,毕竟标记位于精灵上,而不是存储在其他位置,因此如果精灵是触摸点,它应该报告该触摸的标记。但这可能是由于边界框在连词中的工作方式在上,使用父子节点关系。我更新了代码。边界框将返回与CGRect相同的行为…我认为边界框没有问题。使用此处的信息:我可以使用边界框位置的附加日志确认边界框确实在我的精灵上正确绘制,我已确认层上精灵子对象的边界框与屏幕无关,因此cgrectcontainspoint没有意识到它得到了错误的坐标。