4

だから私はタワーディフェンスゲームの作成に取り組んでおり、タイルボードが機能し、タワーを配置できるようになっています... ある程度.

プレイヤーがグリッドの上のボタンをクリックすると、タワーの配置がオンになり、プレイヤーはグリッド内のセルにタワーを配置できるようになります。ただし、各タワーは、発射範囲に移動するクリープの検出を処理するために、その周りに円の ShapeNode も取得します。このシェイプ ノードは、配置すると塔の周りにうまく表示されます。

タワーを配置するために使用したロジックは、タッチしたノード (「セル」という名前) を見つけて、それをタワー ノードに置き換えるというものです。しかし、タワー ノードにサークル ノードが接続されていて、その隣のセルをカバーしている場合、サークルの下のセル ノードを選択できません。

円を「通り抜けて」タッチしたり、その下のセルにアクセスできるように塗りつぶしスペースを何も設定したりするにはどうすればよいですか?

私はまだスプライトキットを学んでいるので、もっと簡単なアプローチがあれば、私も正しい方向に向けてください.

4

3 に答える 3

4

特定のポイントでノードを見つけたいが、必ずしも最も深いノードではない場合は、nodesAtPoint を使用できます。SKSceneを含む SKNode で使用できます。

これにより、シーンのすべての子ノード、または特定のポイントと交差するノードを見つけることができます。次に、ノード クラスまたはノード名に基づいて配列をフィルタリングすることにより、これをさらにフィルタリングして、必要な特定のノードを見つけることができます。

SKPhysicsWorldで利用可能なメソッドenumerateBodiesAtPoint:usingBlock:を使用して、特定のポイントで物理ボディを探す場合、同様のアプローチを適用できます。

nodesAtPoint:を使用する場合、点は呼び出しノードの座標系にあり、enumerateBodiesAtPoint:usingBlock:は常にシーンの座標系にあることに注意してください。

于 2014-04-12T07:13:54.317 に答える
3

あなたの関連するコードを見なければ、確かに言うのは難しいですが、あなたの説明から、あなたの問題はシェイプノードにあると思います. シェイプ ノードを使用して連絡先を処理する代わりに、タワーの物理ボディを使用することをお勧めします。まったく新しいノードを追加しなくても、タワーに円形の物理ボディを持たせることができます。シェイプ ノードを削除すると、クロス タッチの干渉も解決されます。

于 2014-04-12T03:47:25.200 に答える
0

TouchesBegan は、その位置にあるすべてのノードを自動的に検出します。それらをループするだけです。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    for (UITouch *touch in touches)
    {
        CGPoint touchPoint = [touch locationInNode:self];
        NSArray *nodes = [self nodesAtPoint:touchPoint];

        if ([nodes count])
        {
            for (SKNode *node in nodes)
            {
                if ([node.name isEqualToString:@"cell"])
                {

                }
                else
                {

                }
            }
        }
    }
}

タッチが開始されたノードである「self」が呼び出されます(おそらくあなたのシーン)。たとえば、親オブジェクトでフィルタリングすることもできます。すべてのノードを「background」という名前の親ノードに追加する場合、「self」を背景ノードに置き換えることで、背景ノードの子のみにフィルターをかけることができます (ただし、これにより、背景ノードの座標が使用されます)。

于 2014-09-16T21:52:20.657 に答える