1

我正在创建一个需要使用大量碰撞检测的游戏,而我今天才了解它。

现在我有两个SKSpriteNodes,但一个是SKNode. SKSpriteNode调用没有父级的精灵,调用有父级character的精灵buildingStructure

现在character的类别是static const uint32_t playerCategory = 0x1 << 20;buildingStructure的类别是_buildingStructureCategory = 0x1 << 0;buildingStructure的类别map.m通过 a设置在另一个类中@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但我也希望它检测何时character“处于顶部”buildingStructure以执行操作。

由于buildingStructure没有定义physicsBody这是导致didBeginContact:contact无法识别碰撞接触的原因吗?

4

1 回答 1

3

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

要在两个物理体之间获得所需的行为,首先要了解存在“碰撞”“接触”SKPhysicsBody有两个名为collisionBitMaskcontactTestBitMask的属性。

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

碰撞是您希望物理模拟影响相关身体的地方,而联系人是您希望收到通知以便您可以做某事的地方。所以这将调用didBeginContact:

我建议将两个物体的collisionBitMask设置为 0(这样它们的物理特性不会受到影响并相互通过)。然后将字符的contactTestBitMask属性设置为建筑物的属性,如下所示-

character.physicsBody.contactTestBitMask = categoryBitManager.buildingStructureCategory;
于 2014-05-06T01:45:15.453 回答