我有一个带有三个精灵节点的应用程序,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中处理碰撞。只想在两个不同的精灵节点接触时进行声音播放。
答案 0 :(得分:1)
首先,您没有设置任何contactTestBitMasks
。目前,您告诉物理代表哪些节点设置为彼此冲突,但没有设置任何联系。将此添加到每个球物理实体:
ball2.physicsBody.contactTestBitMask = ballCategory | ballCategory2 | ballCategory3
这样,物理代表就会明白每个球都可以与其他球接触。
您的联系人if
声明仍未正确使用。 ballCategory
和ballCateogry2
是您等同于整数的变量;这意味着您的categoryBitMask
现在设置为等于那些整数。
你的if
语句做的是检查physicsBody的类别是否等于特定的整数,或者只是等于大于零的整数(由你决定)。
在这种情况下,您需要调整if
语句,以测试您设置的categoryBitMask
的值:
if ((firstBody.physicsBody.categoryBitMask == ballCategory) &&
(secondBody.physicsBody.categoryBitMask == ballCategory2))
{
NSLog(@"click");
}
你所拥有的是不正确的,因为你没有测试任何东西的价值。您需要使用if
语句检查firstBody
和secondBody
是否设置categoryBitMask
等于特定ballCategory
变量值。