物理身体没有响应位掩码设置

3
我正在为一个物理体设置碰撞位掩码,以便它不会发生碰撞,但仍然发生碰撞。
-(void) createPlayer{
    player = [SKSpriteNode spriteNodeWithImageNamed:@"GonGonRed"];
    player.position = CGPointMake(40, 100);
    player.size = CGSizeMake(35*self.frame.size.height/320, 35*self.frame.size.height/320);
    player.zPosition = 7;    
    player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:player.size.width/2-1];
    player.physicsBody.dynamic = NO;
    player.physicsBody.allowsRotation = NO;
    player.physicsBody.usesPreciseCollisionDetection = YES;
    player.physicsBody.categoryBitMask = 1;
    player.physicsBody.contactTestBitMask = 4;
    player.physicsBody.collisionBitMask = 2;
    player.physicsBody.mass = 0.013963;
    [self addChild:player];
}


SKSpriteNode *wheel = [SKSpriteNode spriteNodeWithImageNamed:@"wheel"];
wheel.size = CGSizeMake(newwidth, newheight);
wheel.position = CGPointMake(px, py);
wheel.name = @"wheel";    
wheel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:newwidth/2];
wheel.physicsBody.dynamic = NO;
wheel.physicsBody.restitution = obstacleRestitution;
wheel.physicsBody.usesPreciseCollisionDetection = YES;
wheel.physicsBody.categoryBitMask = 3;
wheel.physicsBody.collisionBitMask = 0;
wheel.physicsBody.contactTestBitMask = 0;
wheel.zPosition = 5;

轮子和玩家不应该碰撞,但它们却发生了碰撞。
1个回答

3
这是由下面这行代码引起的。
wheel.physicsBody.categoryBitMask = 3;

SpriteKit通过执行逻辑AND运算来比较物体的categoryBitMask和其他物体的collisionBitMask。当结果是非零值时,就会发生碰撞。在这种情况下,SpriteKit将轮子的categoryBitMask与玩家的collisionBitMask进行比较,如下所示。 轮子的categoryBitMask为0x011(= 3),玩家的collisionBitMask为0x010(= 2)。AND运算结果为0x010。这是非零的,因此发生了碰撞。因此,您应该更改轮子的categoryBitMask值,以避免逻辑AND运算的结果变为非零,如下所示。
wheel.physicsBody.categoryBitMask = 8;

此外,必须将动态属性设置为YES。

CategoryBitMasks 应该是一个 Uint32 类型,只有 1(或 0)个位被设置,这意味着它们的值将为 0、1、2、4、8、16、32、64 等等。任何其他值(如 3)实际上意味着 physicsBody 同时处于 2 个类别中(在某些情况下可能是有效的)。 - Steve Ives
如果您在处理碰撞/接触时遇到问题,请尝试添加来自此答案iOS SpriteKit - collisions and contacts not working as expected的func checkPhysics(),然后在您设置好一切(也许是在didMoveToView的结尾处)后调用checkPhysics(),看看打印出的结果是否与您预期的相符。 - Steve Ives

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接