我已经研究了几个小时(实际上是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没有正常工作,我怀疑坐标没有正确报告。
答案 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,并将边界框转换为实际的屏幕矩形来解决这个问题。如果边界框测试位于子精灵(或图层)上,它将无法自行运行。它仅相对于父级返回其本地位置。