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

Posted

技术标签:

【中文标题】Sprite Kit中的碰撞检测未检测到碰撞【英文标题】:Collision Detection In Sprite Kit Not Detecting Collision 【发布时间】:2014-05-06 01:09:06 【问题描述】:

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

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

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

变量正确地传递给另一个名为main.m 的类(这是设置charactercategory 的位置)。我用一个方法创建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 何时在 @987654345 的“顶部” @ 执行操作。

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

【问题讨论】:

【参考方案1】:

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

要在两个物理体之间获得所需的行为,首先要了解有'碰撞'和有'接触'SKPhysicsBody 有两个属性,分别名为 collisionBitMaskcontactTestBitMask

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

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

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

character.physicsBody.contactTestBitMask = categoryBitManager.buildingStructureCategory;

【讨论】:

之前我自己想通了,这总结了一切,谢谢。我还必须将buildingStructurecollisionBitMask 设置为0x0,否则当characterbuildingStructure 碰撞character 时会推动buildingStructure

以上是关于Sprite Kit中的碰撞检测未检测到碰撞的主要内容,如果未能解决你的问题,请参考以下文章

Sprite Kit 从未检测到我的碰撞

Sprite Kit 碰撞检测和物理

Sprite Kit 碰撞检测仅适用于左右屏幕边缘

Sprite kit:删除特定节点而不是所有节点

如何检测精灵套件中的碰撞?

pygame之精灵碰撞检测