如何检测touchBegins中的所有节点或特定节点

时间:2013-10-11 16:58:16

标签: ios sprite-kit

在iOS 7的SpriteKit框架中,我试图构建一个简单的游戏来学习框架。我稍微绊倒的一个方面是当触摸下有多个节点重叠时如何检测特定节点。让我举个例子:

在一个基本的国际象棋训练游戏中,我可以向前拖动一块瓷砖,但之后发生的事情取决于该空间中的其他节点。我想知道触摸在哪个区块上,而不管恰好在该区块节点上的任何其他节点。我遇到的问题是触摸似乎检测到最上面的节点。所以我的问题是:

检测tile节点的推荐解决方案是什么?我正在考虑以某种方式使用zPosition,但我还没有确定如何做到这一点。有什么建议吗?

另一种方法是检测触摸下的所有节点。有没有办法获取所有节点并将它们放在一个数组中?

2 个答案:

答案 0 :(得分: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"]) {
           //...
       }
    }
}

答案 1 :(得分:0)

您可以计算给定点的图块,因为您可以知道板的框架,从而知道每个图块的大小。

E.g。假设您的电路板的框架为{10,50,160,160}。因此,您知道每个瓷砖的尺寸为20x20。如果您在点{x,y}处触摸,则您知道所触摸的行的索引是(x-10)/20,并且列的索引是(y-50)/20。哦,你可能也需要在计算中使用floorf

或者,要实际回答您的问题,您可以使用nodesAtPoint:方法获取给定点的所有节点:)