Sprite Kit中的碰撞检测未检测到碰撞

时间:2014-05-06 01:09:06

标签: ios objective-c sprite-kit skphysicsworld

我正在创建一款需要使用大量碰撞检测的游戏,我今天才会对它进行了解。

现在我有两个SKSpriteNodes,但其中一个是SKNode的孩子。没有父级的SKSpriteNode称为character,父级的精灵称为buildingStructure

现在character的类别为static const uint32_t playerCategory = 0x1 << 20;buildingStructure的类别为_buildingStructureCategory = 0x1 << 0;buildingStructure的类别在另一个类map.m@property中设置。

变量正确地传递给另一个名为main.m的类(这是设置character类别的类)。我用方法创建character,设置他的物理身体,位置等等。

character的属性

character.name = @"character";
character.size = CGSizeMake(250, 400);
character.zPosition = 500;
character.position = CGPointMake(self.scene.size.width/2, self.scene.size.height/2+200);
character.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:character.size];
character.physicsBody.restitution = 0;
character.physicsBody.density = 0.1;
character.physicsBody.allowsRotation = NO;
character.physicsBody.categoryBitMask = playerCategory;
character.physicsBody.collisionBitMask = categoryBitManager.buildingStructureCategory;

buildingStructure的属性

buildingStructure.name = @"buildingStructure";
buildingStructure.position = CGPointMake(building.position.x, building.position.y);
buildingStructure.size = CGSizeMake(500, 400);
buildingStructure.physicsBody.dynamic = NO;

buildingStructure.physicsBody.categoryBitMask = _buildingStructureCategory;

另一方面,buildingStructure没有设置physicsBody,因为我希望character通过buildingStructure,但我也希望它能够检测{{1}在} character的“顶部”执行操作。

由于buildingStructure没有定义的buildingStructure,导致physicsBody无法识别碰撞联系人的原因是什么?

1 个答案:

答案 0 :(得分:3)

默认情况下, SKNode (或子类) physicsBody 属性为 nil 。是的,给buildingStructure一个物理体,并正确配置它以实现所需的行为。

要在两个物理机构之间获得所需的行为,首先要了解 &#39;碰撞&#39; ,并且 & #39;触点&#39; 即可。 SKPhysicsBody 有两个名为 collisionBitMask contactTestBitMask 的属性。

对于 collisionBitMask ,默认值为0xFFFFFFFF(所有位都设置),对于 contactTestBitMask ,默认值为0x00000000(所有位清零)。你可以看到,默认情况下,每个物理主体都会与其他物理主体发生碰撞,但是没有联系。

碰撞是您希望物理模拟影响相关主体的地方,其中联系人是您要通知的地方,因此您可以执行某些操作。所以这将调用 didBeginContact:

我建议将两个实体的 collisionBitMask 设置为0(因此它们的物理不受影响并相互传递)。然后将字符的 contactTestBitMask 属性设置为建筑物的属性,如下所示 -

character.physicsBody.contactTestBitMask = categoryBitManager.buildingStructureCategory;