0

Apples のドキュメントには、SKNode の nodeAtPoint メソッドがツリーの最も深いノードを返すと記載されています。これは、シーン ノードを一番上にしてツリーを描画すると、ツリーの最下部にあるノードの 1 つとして答えが期待されるということです。それは私には起こっていません。私のツリーは次のようになります。

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

括弧内の数字はノードの z 位置です。シーンに「nodesAtPoint」を要求し、playerPiece の位置に対応する計算されたポイントを与えると、「world、boardLayer、rotating、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 は次に近いノードをチェックします。ヒット テストが処理される順序は、基本的に描画順序の逆です。

つまり、ヒット テストは、ノードに最後に追加された子から最初の子まで (前述のとおり) 開始されます。ただし、zPosition は描画順序をオーバーライドするだけでなく、ヒット テストの順序もオーバーライドします。

スプライト キットは、ヒット テストと描画順序を決定するためにのみ zPosition 値を使用します。

タップ ポイントで複数のノードが重なる場合、最大の z 値を持つノードが最初に選択されます。

于 2014-08-18T07:04:29.643 に答える