2014-02-20 4 views
1

Итак, я сгенерировал SKShapeNode и вам нужно знать, когда щелкнут этот узел. Я делаю это по телефону:Проверьте, нажата ли SKShapeNode

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 
    SKNode *node = [self nodeAtPoint:positionInScene]; 
    if ([node.name isEqualToString:TARGET_NAME]) { 
     // do whatever 
    } 
    } 
} 

Так что результат, который я получаю, довольно странный. Нажатие самой точки на самом деле действительно работает. Тем не менее, нажатие в любом месте экрана, которое находится на юго-запад от позиции SKShapeNode, также сделает вышеуказанный код истинным.

enter image description here

С SKShapeNode представленного красной точкой, любой UITouch в заштрихованной области сделает мой код выше, верно.

Вот как я строю SKShapeNode. Также может быть важно отметить, что мое приложение работает в ландшафтном режиме.

#define RANDOM_NUMBER(min, max) (arc4random() % (max - min) + min) 


- (SKShapeNode *)makeNodeWithName:(NSString *)name color:(UIColor *)color 
{ 
    SKShapeNode *circle = [SKShapeNode new]; 

    int maxXCoord = self.frame.size.width; 
    int maxYCoord = self.frame.size.height; 
    CGFloat x = RANDOM_NUMBER((int)TARGET_RADIUS, (int)(maxXCoord - TARGET_RADIUS)); 
    CGFloat y = RANDOM_NUMBER((int)TARGET_RADIUS, (int)(maxYCoord - TARGET_RADIUS - 15)); 

    circle.fillColor = color; 
    circle.strokeColor = color; 
    circle.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(x, y, TARGET_RADIUS, TARGET_RADIUS)].CGPath; 

    circle.name = name; 
    return circle; 
} 

Спасибо за любую помощь!

ответ

4

Это происходит потому, что положение узла окружности находится в начале координат, и оно рисует путь в прямоугольнике, начинающемся с (x, y). Таким образом, кадр узла растягивается, чтобы охватить все между (0,0) и (x + TARGET_RADIUS, y + TARGET_RADIUS).

Вы можете проверить это для себя, визуализируя рамку вида круга:

SKSpriteNode *debugFrame = [SKSpriteNode spriteNodeWithColor:[NSColor yellowColor] size:circle.frame.size]; 
debugFrame.anchorPoint = CGPointMake(0, 0); 
debugFrame.position = circle.frame.origin; 
debugFrame.alpha = 0.5f; 
[self addChild:test]; 

Это показывает фактическую интерактивную область (на OSX):

Visualized clickable region

Чтобы исправить проблему, попробуйте следующее:

circle.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-TARGET_RADIUS/2.0f, -TARGET_RADIUS/2.0f, TARGET_RADIUS, TARGET_RADIUS)].CGPath; 

и добавьте

circle.position = CGPointMake(x, y); 
+0

Мой друг на самом деле указал на это прошлой ночью. Я собирался ответить на свой пост, но похоже, что вы сделали лучшую работу, чем я мог. Благодаря! – Dan

Смежные вопросы