【问题标题】:Collision Detection In Sprite Kit Not Detecting CollisionSprite Kit中的碰撞检测未检测到碰撞
【发布时间】: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 无法识别碰撞联系人的原因吗?

【问题讨论】:

    标签: ios objective-c sprite-kit skphysicsworld


    【解决方案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
    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多