CGRectContainsPoints и ограничивающий флажок отключены на несколько пикселей - PullRequest
0 голосов
/ 24 февраля 2012

Я изучал это часами (на самом деле 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 является дочерним по отношению к другим дочерним элементам, я подозреваю, что координаты не сообщаются правильно.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Я решил эту проблему, создав новый CGRect для теста CGRectContainsPoint и переведя ограничивающий прямоугольник в реальный экранный прямоугольник;ограничивающий тест не будет работать сам по себе, если он расположен на дочернем спрайте (или слое).Возвращает только свою локальную позицию относительно родителя.

0 голосов
/ 24 февраля 2012

Я думаю, что это может быть проблема с массивом, который вы получаете спрайты. В любом случае, вот как я использую код для получения тега спрайта.

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...