Документы Apple утверждают, что метод nodeAtPoint на SKNode возвращает самый глубокий узел в дереве. Я понимаю, что это означает, что если вы рисуете дерево с узлом сцены наверху, ответ следует ожидать как один из узлов в самой нижней позиции дерева. Это не происходит для меня. Вот как выглядит мое дерево:
scene
|
world
|
+------------+----+---------+------------+
| | | |
leftArrow rightArrow boardLayer statusLayer
|
+-----------+-----------+--------+-+---------------+
| | | | |
arrow highlight trough rotating(0) testDump
(21) |
+--------+----------+
| | |
guides board playerPiece
(24) (20) (13)
Цифры в скобках - это z-позиция узлов. Когда я запрашиваю сцену для «nodesAtPoint» и даю ей расчетную точку, соответствующую местоположению playerPiece, я получаю: «мир, boardLayer, вращение, подсветка, доска, playerPiece». Это то, что я ожидаю. Однако, когда я запрашиваю сцену для «nodeAtPoint», используя ту же точку, я получаю «подсветку». Я ожидал playerPiece. Почему этот узел не вернулся? Что я упускаю из виду?
Я не уверен, что код принесет пользу, но вот он. Этот код находится в Board.m (внизу дерева).
CGPoint pt = [CheckerUtilities locationFromColumn:column row:row];
CGPoint p = [self.parent.parent convertPoint:pt toNode:[Globals sharedGlobals].scene];
NSArray *nodes = [[Globals sharedGlobals].scene nodesAtPoint:p];
for (SKNode *node in nodes)
NSLog(@"%@, %@, %f", [node class], node.name, node.zPosition);
SKNode *checker = [[Globals sharedGlobals].scene nodeAtPoint:p];
NSLog(@"node: %@", [checker class]);
Результат:
SKNode, world, 0.000000
BoardLayer, boardLayer, 0.000000
SKSpriteNode, rotating, 0.000000
Highlight, highlight, 21.000000
Board, board, 20.000000
CheckerSprite, checker, 13.000000
node: Highlight