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
答案 0 :(得分:1)
来自文档:
在场景中,当Sprite Kit处理触摸或鼠标事件时,它会走动 找到想要接受事件的最近节点的场景。如果 该节点不希望该事件,Sprite Kit检查下一个最接近的事件 节点,等等。 处理点击测试的顺序是 基本上与绘制顺序相反。
换句话说,命中测试从添加到节点的最后一个子节点开始到第一个节点(如您所述)。但是,zPosition不仅会覆盖绘制顺序,还会覆盖命中测试顺序:
Sprite Kit仅使用zPosition值来确定命中测试 和绘图顺序。
如果多个节点在分接点重叠,则首先选择z值最高的节点。