确定一个点是否位于Sprite Kit中物理主体的边界内

时间:2014-01-06 09:11:02

标签: ios game-physics sprite-kit

我正在使用Sprite Kit创建一个涉及气球的游戏。气球图像是一个长矩形(虚线),但我使用多边形(实线)在气球周围定义了一个物理体。我希望玩家能够“弹出”气球。我正在使用以下代码块来实现此目的:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    NSArray *nodes = [self nodesAtPoint:[touch locationInNode:self]];
    for (SKNode *node in nodes) {
        [node removeFromParent];
        SKAction *pop = [SKAction playSoundFileNamed:@"pop.wav" waitForCompletion:NO];
        [self runAction:pop];
    }
}

不幸的是,当这一系列中有几个气球时,这种方法可能会导致单个水龙头弹出多个气球。这是因为精灵图像重叠(即使物理实体没有)。还有一种不受欢迎的影响,即敲击琴弦会产生与敲击气球相同的效果。

我可以访问触摸点的坐标,但是甚至可以检测点是否位于物理主体定义的区域内(而不是节点)?

enter image description here

3 个答案:

答案 0 :(得分:1)

使用物理世界的bodyAtPoint:方法:

SKPhysicsBody* body = [self.scene.physicsWorld bodyAtPoint:location];

答案 1 :(得分:1)

bodyAtPoint是错误的,但你有一个可行的替代方案。 您可以使用气球多边形路径创建光线。

[self.physicsWorld enumerateBodiesAlongRayStart:rayStart end:rayEnd
     usingBlock:^(SKPhysicsBody *body, CGPoint point,CGVector normal, BOOL *stop) {

    if(body.categoryBitMask & baloonCategory){
        SKPhysicsBody *contactBody=body;
        CGPoint contactPoint=point;
        *stop=YES;
    }

}];

答案 2 :(得分:0)

我看了但是却无法找到一种方法来检查是否在精灵的physicsBody内进行了触摸。我建议分开弦乐和气球精灵。

您可以尝试以下任何一项:

  1. 为气球和字符串使用单独的精灵节点,并使用SKPhysicsJoint连接它们。

  2. 子类SKSpriteNode并添加两个精灵,即气球和字符串作为精灵的子项。然后你可以检查精灵上的触摸是否在气球上。

  3. 此外,对于多个气球弹出问题,您可以像这样修改您的代码:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [touches anyObject];
        NSArray *nodes = [self nodesAtPoint:[touch locationInNode:self]];
    
        //Instead of popping all nodes within the touch, pop only the first object.
        if ([nodes count] > 0)
        {
            SKNode *node = [nodes firstObject];
            [node removeFromParent];
            SKAction *pop = [SKAction playSoundFileNamed:@"pop.wav" waitForCompletion:NO];
            [self runAction:pop];
        }
    }