Если касание находится в пределах CCSprite? Кокос2д v3

Я пытаюсь создать простой вспомогательный метод, чтобы определить, находится ли UITouch в пределах границ CCSprite с помощью этого метода:

- (BOOL)containsTouchLocation:(UITouch *)touch {
    CGPoint p = [self convertToNodeSpace:touch.locationInWorld];
    CGRect r = self.boundingBox;
    return CGRectContainsPoint(r, p);
}

Кажется, что он должен работать в ретроспективе, но он просто возвращает «НЕТ», хотя прикосновение явно отображается в виде спрайта на экране. Есть ли что-то, что я делаю неправильно здесь? Я использую Cocos2d v3.


person SimplyKiwi    schedule 17.07.2014    source источник


Ответы (1)


Что вы делаете неправильно, так это то, что boundingBox является аналогом frame, а не bounds. Поэтому r находится в координатном пространстве parent узла, а p в координатном пространстве самого узла.

Если вы знаете, что у этого узла есть родитель, вы можете вычислить p в координатном пространстве родителей:

CGPoint p = [self.parent convertToNodeSpace:touch.locationInWorld];
// You can also use a shorthand [touch locationInNode: self.parent];

Или вместо этого вы можете получить r как прямоугольник bounds вместо frame

// notice that it is `contentSizeInPoints` and not `contentSize`
CGRect r = { .origin = CGPointZero, .size = self.contentSizeInPoints };

Но в любом случае у CCNode теперь также есть hitAreaExpansion, которые вы, возможно, захотите принять во внимание:

r = CGRectInset(r, -self.hitAreaExpansion);

Или вместо всего этого вы можете использовать метод hitTestWithWorldPos:, реализация которого по умолчанию проверяет, находится ли заданное местоположение в мире в пределах узла +/- hitAreaExpansion.

person slazyk    schedule 18.07.2014