2015-07-02 45 views
1

我有一個應用程序,包含三個精靈節點ball1,ball2,ball3。他們通過向上,向下,向右,向左傾斜設備來移動現場。一切工作正常。 我想添加一個效果,其中任何兩個球接觸(碰撞)聲音播放。我使用的是SpriteKit,每個球都有一個physicalBody,他們有一個球形屬性,我有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中使用碰撞。只是想在兩個不同的精靈節點接觸時播放聲音。

+0

您可以使用[playSoundFileNamed]播放聲音文件(https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKAction_Ref/#//apple_ref/occ/clm/SKAction/playSoundFileNamed:waitForCompletion :)。您需要將聲音文件添加到應用程序的包中。 – 0x141E

回答

1

首先,您沒有任何設置contactTestBitMasks。目前,你正在告訴物理委託人哪些節點設置爲相互碰撞,但沒有設置聯繫。添加到每個球physicalBody:

ball2.physicsBody.contactTestBitMask = ballCategory | ballCategory2 | ballCategory3 

這樣,物理代表會明白,每個球可以與其他球接觸。

您的聯繫人if聲明仍然被錯誤地使用。 ballCategoryballCateogry2是你等同於整數的變量;這意味着你的categoryBitMask現在被設置爲等於那些整數。

您的if語句所做的是檢查physicsBody的類別是否等於特定的整數,或者只是等於大於零的整數(由您決定)。

在這種情況下,您需要調整您的if語句來測試那些categoryBitMask S的值,你已經設置了:

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

你有什麼不正確,因爲你沒有測試任何東西的價值。您需要使用您的if語句來檢查firstBodysecondBodycategoryBitMask設置是否等於特定的ballCategory變量值。

+0

感謝您的回答。我改變了我原來的帖子,給你更多的信息。 – user1114881

+0

@ user1114881我也更新了我的答案。您需要進一步研究如何設置物理實體,物理代表以及如何測試聯繫。 – Phoenix