4

iOS 7 の SpriteKit フレームワークで、フレームワークを学習する目的で簡単なゲームを作成しようとしています。私が少しつまずいている領域の 1 つは、タッチで複数のノードが重なっているときに特定のノードを検出する方法です。例を挙げましょう:

基本的なチェスのトレーニング ゲームでは、駒を 1 タイル前方にドラッグできますが、その後に何が起こるかは、そのスペースにある他のノードによって異なります。たまたまそのタイルノードにある他のノードに関係なく、タッチがどのタイルにあるかを知りたいです。私が直面している問題は、タッチが最上位のノードを検出しているように見えることです。だから私の質問は次のようになります:

タイル ノードを検出するための推奨される解決策は何ですか? 何らかの方法で zPosition を使用することを考えていましたが、その方法をまだ決定していません。助言がありますか?

別のアプローチは、タッチですべてのノードを検出することです。すべてのノードを取得して配列に入れる方法はありますか?

4

2 に答える 2

12

接触点でノードを反復処理します。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    NSArray *nodes = [self nodesAtPoint:[touch locationInNode:self]];
    for (SKNode *node in nodes) {
       //go through nodes, get the zPosition if you want
       int nodePos = node.zPosition;

       //or check the node against your nodes
       if ([node.name isEqualToString:@"myNode1"]) {
           //...
       }

       if ([node.name isEqualToString:@"myNode2"]) {
           //...
       }
    }
}
于 2013-10-11T20:50:46.467 に答える
0

ボードのフレームと各タイルのサイズがわかるため、特定のポイントでタイルを計算できます。

たとえば、フレームが {10, 50, 160, 160} のボードがあるとします。したがって、各タイルのサイズは 20x20 になることがわかります。点 {x,y} に触れた場合、触れた行のインデックスは で、列のインデックスは であることがわかり(x-10)/20ます(y-50)/20floorfああ、おそらくその計算でも使用する必要があるでしょう。

または、実際に質問に答えるには、nodesAtPoint:メソッドを使用して、特定の時点ですべてのノードを取得できます:)

于 2013-10-11T17:15:09.170 に答える