0

Apples 文档指出 SKNode 上的 nodeAtPoint 方法返回树中最深的节点。我认为这意味着,如果您在顶部绘制场景节点的树,则答案应该是树中最底部位置的节点之一。这不会发生在我身上。这是我的树的样子:

                           scene
                             |
                           world
                             |
           +------------+----+---------+------------+
           |            |              |            |
       leftArrow    rightArrow    boardLayer   statusLayer
                                       |
      +-----------+-----------+--------+-+---------------+ 
      |           |           |          |               |
    arrow     highlight     trough     rotating(0)    testDump
                (21)                     |
                                +--------+----------+
                                |        |          |
                             guides   board    playerPiece
                              (24)     (20)      (13)

括号中的数字是节点的 z 位置。当我向场景询问“nodesAtPoint”并给它一个与 playerPiece 位置相对应的计算点时,我得到:“world, boardLayer, rotation, highlight, board, 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
4

1 回答 1

1

从文档:

在场景中,当 Sprite Kit 处理触摸或鼠标事件时,它会遍历场景以找到最近的想要接受事件的节点。如果该节点不想要该事件,Sprite Kit 会检查下一个最近的节点,依此类推。处理命中测试的顺序基本上与绘制顺序相反。

换句话说,命中测试从添加到节点的最后一个子节点开始(如您所述)。但是,zPosition 不仅会覆盖绘制顺序,还会覆盖命中测试顺序:

Sprite Kit 仅使用 zPosition 值来确定命中测试和绘制顺序。

如果多个节点在抽头点重叠,将首先选择具有最高 z 值的节点。

于 2014-08-18T07:04:29.643 回答