【问题标题】:play a sound when two nodes collide两个节点碰撞时播放声音
【发布时间】:2015-07-04 06:11:19
【问题描述】:

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

我已经尝试将 Ray Wenderlich 的示例与我的 tweek 一起使用。但是,

//这是我的三个分类

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 中处理过碰撞。只想在两个不同的精灵节点接触时播放声音。

【问题讨论】:

  • 您可以使用playSoundFileNamed 播放声音文件。您需要将声音文件添加到您的应用程序包中。

标签: sprite-kit


【解决方案1】:

首先,您没有设置任何contactTestBitMasks。目前,您正在告诉物理代理哪些节点被设置为相互碰撞,但没有设置任何接触。将此添加到每个球的physicsBody:

ball2.physicsBody.contactTestBitMask = ballCategory | ballCategory2 | ballCategory3

这样,物理代表将了解每个球都可以与其他球接触。

您的联系人if 声明仍然被错误地使用。 ballCategoryballCateogry2 是你已经等同于整数的变量;这意味着您的 categoryBitMask 现在设置为等于这些整数。

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

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

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

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

【讨论】:

  • 感谢您的回答。我更改了原来的帖子,以便为您提供更多信息。
  • @user1114881 我也更新了我的答案。您需要对如何设置物理实体、物理代理以及如何测试接触进行更多研究。
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多