当两个节点发生碰撞时播放声音

时间:2015-07-02 21:19:37

标签: sprite-kit

我有一个带有三个精灵节点的应用程序,ball1,ball2,ball3。他们通过向上,向下,向右,向左倾斜设备来移动场景。一切都很好。 我想添加一种效果,当任何两个球触碰(碰撞)声音播放时。我正在使用SpriteKit并且每个球都有一个physicalBody并且他们有一个球形属性,我有precisionCollision是,categoryBitMask设置为ballCategory1,2和3每个球。 (或者我可以只使用一个类别) 我已经尝试了各种关于如何做到这一点的教程,但似乎没有任何工作。

我尝试过使用Ray Wenderlich的例子和我的一个微调。但是,

//这是我的三个类别

static const uint32_t ballCategory = 0x1 << 1;
static const uint32_t ballCategory2 = 0x1 << 2;
static const uint32_t ballCategory3 = 0x1 << 3;

//这些是我的三个节点

ball = [SKSpriteNode spriteNodeWithImageNamed:@"mankala piece"];
    ball.scale = 1;

    ball.position = CGPointMake(600, 500);
   ball.physicsBody =
    [SKPhysicsBody bodyWithCircleOfRadius:(ball.size.width/2)];
    ball.physicsBody.usesPreciseCollisionDetection = YES;
   ball.physicsBody.categoryBitMask = ballCategory;
    ball.physicsBody.collisionBitMask = ballCategory2|ballCategory|ballCategory3;
    ball.physicsBody.affectedByGravity = NO;
    [self addChild:ball];

    ball2 = [SKSpriteNode spriteNodeWithImageNamed:@"mankala piece"];
    ball2.scale = 1;

    ball2.position = CGPointMake(350, 200);
    ball2.physicsBody =
    [SKPhysicsBody bodyWithCircleOfRadius:(ball2.size.width/2)];
    ball2.physicsBody.usesPreciseCollisionDetection = YES;
    ball2.physicsBody.categoryBitMask = ballCategory2;
   ball2.physicsBody.collisionBitMask = ballCategory2|ballCategory|ballCategory3;
    ball2.physicsBody.affectedByGravity = NO;
    [self addChild:ball2];

    ball3 = [SKSpriteNode spriteNodeWithImageNamed:@"mankala piece"];
    ball3.scale = 1;

    ball3.position = CGPointMake(500, 400);
    ball3.physicsBody =
    [SKPhysicsBody bodyWithCircleOfRadius:(ball3.size.width/2)];
    ball3.physicsBody.usesPreciseCollisionDetection = YES;
    ball3.physicsBody.categoryBitMask = ballCategory3;
   ball3.physicsBody.collisionBitMask = ballCategory2|ballCategory|ballCategory3;
    ball3.physicsBody.affectedByGravity = NO;
    [self addChild:ball3];

//这是我修改过的联系人代码

- (void)didBeginContact:(SKPhysicsContact *)contact
{
    SKPhysicsBody *firstBody, *secondBody;

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    }
    else
    {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }
    if ((firstBody.categoryBitMask & ballCategory) != 0)
    {
        NSLog(@"click");
    }
    if ((firstBody.categoryBitMask & ballCategory2) != 0)
    {
        NSLog(@"click2");
    }

    if ((firstBody.categoryBitMask & ballCategory3) != 0)
    {
        NSLog(@"click3");
    }

}

但仍然没有任何反应 谁有人在spriteKit中处理碰撞。只想在两个不同的精灵节点接触时进行声音播放。

1 个答案:

答案 0 :(得分:1)

首先,您没有设置任何contactTestBitMasks。目前,您告诉物理代表哪些节点设置为彼此冲突,但没有设置任何联系。将此添加到每个球物理实体:

ball2.physicsBody.contactTestBitMask = ballCategory | ballCategory2 | ballCategory3

这样,物理代表就会明白每个球都可以与其他球接触。

您的联系人if声明仍未正确使用。 ballCategoryballCateogry2是您等同于整数的变量;这意味着您的categoryBitMask现在设置为等于那些整数。

你的if语句做的是检查physicsBody的类别是否等于特定的整数,或者只是等于大于零的整数(由你决定)。

在这种情况下,您需要调整if语句,以测试您设置的categoryBitMask的值:

if ((firstBody.physicsBody.categoryBitMask == ballCategory) &&
    (secondBody.physicsBody.categoryBitMask == ballCategory2))
{
    NSLog(@"click");
}

你所拥有的是不正确的,因为你没有测试任何东西的价值。您需要使用if语句检查firstBodysecondBody是否设置categoryBitMask等于特定ballCategory变量值。