为什么SKNode nodeAtPoint返回错误的节点?

时间:2014-08-17 21:03:40

标签: ios objective-c sprite-kit sknode

Apples docs声明SKNode上的nodeAtPoint方法返回树中最深的节点。我认为这意味着如果您使用顶部的场景节点绘制树,则应该将答案视为树中最底部位置的节点之一。这对我来说不会发生。这就是我树的样子:

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

parens中的数字是节点的z位置。当我向现场询问" nodesAtPoint"并给它一个计算点,对应于我获得的玩家位置:"世界,棋盘,旋转,高亮,棋盘,玩家和#34;。这就是我的期望。但是当我在场景中查询" nodeAtPoint"使用同一点我回来"突出显示"。我期待着玩家。为什么没有返回该节点?我在俯瞰什么?

我不确定代码会有什么用,但现在就是这样。此代码位于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

1 个答案:

答案 0 :(得分:1)

来自文档:

  

在场景中,当Sprite Kit处理触摸或鼠标事件时,它会走动   找到想要接受事件的最近节点的场景。如果   该节点不希望该事件,Sprite Kit检查下一个最接近的事件   节点,等等。 处理点击测试的顺序是   基本上与绘制顺序相反。

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

  

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

如果多个节点在分接点重叠,则首先选择z值最高的节点。