触摸SpriteKit中的节点

时间:2014-04-11 21:34:16

标签: ios sprite-kit touch-event skspritenode skshapenode

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

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

我用来放置塔的逻辑是它找到你触摸的节点(命名为“cell”)并用塔节点替换它。但是如果塔节点附有圆形节点并覆盖它旁边的单元格,我就无法选择圆圈下方的单元节点。

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

我还在学习精灵套装,所以如果有更简单的方法,请随时指出我正确的方向。

3 个答案:

答案 0 :(得分:4)

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

这允许您查找场景的所有子节点,或与给定点相交的节点。然后,您可以进一步过滤以找到所需的特定节点,可能是通过基于节点类或节点名称过滤数组。

如果使用SKPhysicsWorld中提供的方法enumerateBodiesAtPoint:usingBlock:在特定点寻找物理实体,可以应用类似的方法

值得注意的是,当使用 nodesAtPoint:时,该点位于调用节点坐标系中,其中 enumerateBodiesAtPoint:usingBlock:将始终位于场景坐标系中。

答案 1 :(得分:3)

在没有看到任何相关代码的情况下,很难确定,但从您的描述来看,我认为您的问题在于形状节点。我建议您使用塔的物理机构,而不是使用形状节点来处理您的联系人。您仍然可以为塔提供圆形物理主体,而无需添加全新节点。移除形状节点也将解决交叉触摸干扰。

答案 2 :(得分: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
                {

                }
            }
        }
    }
}

“自我”是接触开始的节点(最有可能是你的场景)。您也可以通过父对象过滤它,例如;如果将所有节点添加到名为“background”的父节点,则可以通过将“self”替换为背景节点来过滤为仅显示背景节点的子节点(尽管这将导致使用背景节点坐标)。