Sprite kit 当两个节点碰撞时播放声音

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

我有一个有三个精灵节点的应用程序,ball1,ball2,ball3。他们通过向上、向下、向右、向左倾斜设备来移动场景。一切正常。 我想添加一个效果,当任何两个球接触(碰撞)时,会播放一个声音。我正在使用SpriteKit,每个球都有一个物理实体,它们有一个球形状属性,我有precisionCollision Yes,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;
//这是我修改后的联系方式

- (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");
    }

}
-(void)didBeginContact:(skphysiccontact*)联系人
{
SKPhysicsBody*第一个Body,*第二个Body;
if(contact.bodyA.categoryBitMask
但还是什么都没发生。

有人在spriteKit中处理过碰撞吗。只想在两个不同的sprite节点接触时播放声音。

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

ball2.physicsBody.contactTestBitMask = ballCategory | ballCategory2 | ballCategory3
这样,物理学员将了解每个球都可以与其他球接触

如果
语句仍被错误使用,请联系
ballCategory
BallCategory2
是等同于整数的变量;这意味着您的
categoryBitMask
现在设置为等于这些整数

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

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

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

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

谢谢您的回答。我更改了我原来的帖子以向您提供更多信息。@user1114881我也更新了我的答案。你需要对如何设置物理机构、物理代理以及如何测试联系进行更多的研究。你可以使用播放声音文件。您需要将声音文件添加到应用程序包中。
if ((firstBody.physicsBody.categoryBitMask == ballCategory) &&
    (secondBody.physicsBody.categoryBitMask == ballCategory2))
{
    NSLog(@"click");
}