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
的类(这是设置character
category 的位置)。我用一个方法创建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 有两个属性,分别名为 collisionBitMask 和 contactTestBitMask。
collisionBitMask 的默认值为 0xFFFFFFFF(所有位设置),contactTestBitMask 的默认值为 0x00000000(所有位都清除)。您可以看到默认情况下每个物理体都会与其他物理体发生碰撞,但不会发生接触。
碰撞是您希望物理模拟影响相关身体的地方,而联系人是您希望收到通知以便您可以做某事的地方。所以这将调用 didBeginContact:
我建议将两个物体的 collisionBitMask 设置为 0(这样它们的物理特性不会受到影响并相互穿过)。然后将字符的 contactTestBitMask 属性设置为建筑物的属性,如下所示-
character.physicsBody.contactTestBitMask = categoryBitManager.buildingStructureCategory;
【讨论】:
之前我自己想通了,这总结了一切,谢谢。我还必须将buildingStructure
的collisionBitMask
设置为0x0
,否则当character
和buildingStructure
碰撞character
时会推动buildingStructure
。以上是关于Sprite Kit中的碰撞检测未检测到碰撞的主要内容,如果未能解决你的问题,请参考以下文章