4

所以我正在制作一个塔防游戏,让瓷砖板工作并且能够在一定程度上放置塔楼。

当玩家单击网格上方的按钮时,它将切换塔的位置并允许玩家将塔放置在网格内的单元格上。然而,每个塔也有一个围绕它的圆形 ShapeNode 来处理对进入射击范围的小兵的检测。一旦我放置它们,这个形状节点就会很好地显示在塔周围。

我用来放置塔的逻辑是它找到您触摸的节点(称为“单元”)并将其替换为塔节点。但是,如果塔节点附加了圆形节点并覆盖了它旁边的单元格,我将无法选择圆形下方的单元格节点。

我将如何触摸“穿过”圆圈,或将其填充空间设置为空,以便我可以访问它下面的单元格?

我仍在学习 sprite-kit,所以如果有更简单的方法,请随时为我指出正确的方向。

4

3 回答 3

4

如果你想在给定点找到一个节点,但不一定是最深的节点,你可以使用nodesAtPoint:在 SKNode 上可用,包括 SKScene。

这使您可以找到场景的所有子节点,或与给定点相交的节点。然后,您可以进一步过滤它以找到您想要的特定节点,也许通过基于节点类或节点名称过滤数组。

如果使用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 回答