Я изучал это часами (на самом деле 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;
}
ОБНОВЛЕНИЕ: Между прочим, я также просто подклассифицировал CCSprite и добавлял методы прикосновения к отдельным спрайтам таким образом, убирая мой массив спрайтов из картинки. Результаты были такими же, поэтому я подозреваю, что CGRectContainsPoints не работает должным образом, когда ваш rect
является дочерним по отношению к другим дочерним элементам, я подозреваю, что координаты не сообщаются правильно.