我希望物体能够穿过屏幕的底部和顶部,但不能离开右侧和左侧。我有这个代码,但是当我的对象向左或向右移动时,它不会充当墙壁并让它直接通过它。我使用contactTestBitMask来确保有联系但没有碰撞。这是左边墙的代码:
func wall() {
let leftWall = SKNode()
leftWall.physicsBody = SKPhysicsBody(edgeLoopFromRect:CGRectMake(1.0,
1.0, 1.0, CGRectGetHeight(self.frame)));
leftWall.physicsBody?.categoryBitMask = OutsideCategory
leftWall.physicsBody?.contactTestBitMask = HeroCategory
leftWall.physicsBody?.collisionBitMask = 0
leftWall.physicsBody?.mass = 5
leftWall.physicsBody?.friction = 1.0
leftWall.physicsBody?.restitution = 1
leftWall.physicsBody?.usesPreciseCollisionDetection = true
leftWall.physicsBody?.dynamic = false
leftWall.physicsBody?.affectedByGravity = false
leftWall.position = CGPointMake(0, self.size.height / 40)
leftWall.setScale(1.0)
self.addChild(leftWall)
答案 0 :(得分:1)
只要您的墙上设置了类别位掩码,并且您的墙壁确实存在于您希望它们存在的位置(您可以在场景上设置标记以绘制将显示墙壁的物理主体),以及应该与墙碰撞的节点的collisionBitMask被设置为墙的categoryBitMask(你在场景中创建了世界物理体),你应该好好去。
示例:
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
self.physicsWorld.contactDelegate = self;
self.physicsBody.categoryBitMask = CNPhysicsCategoryEdge;
_catNode.physicsBody.collisionBitMask = CNPhysicsCategoryBlock | CNPhysicsCategoryEdge | CNPhysicsCategorySpring;
_catNode.physicsBody.contactTestBitMask = CNPhysicsCategoryBed | CNPhysicsCategoryEdge;
此示例中的cat sprite节点现在将与世界物理主体发生碰撞。
您的collisionBitMask不能设置为0.它必须匹配coinides与其他对象的categoryBitMask的枚举值。根据苹果公司的文档:
collisionBitMask
属性定义哪些类别的掩码 物理团体可以与这个物理团体发生碰撞。
<强>声明强>
SWIFT var collisionBitMask: UInt32 OBJECTIVE-C
@property(nonatomic, assign) uint32_t collisionBitMask
讨论何时
两个物理实体相互接触,可能发生碰撞。这个 将body的碰撞掩码与其他body的类别掩码进行比较 执行逻辑AND操作。如果结果是非零值, 这个身体受到碰撞的影响。每个身体独立 选择是否想要受到其他身体的影响。对于 例如,您可以使用它来避免碰撞计算 对身体的速度做出微不足道的改变。
默认值为0xFFFFFFFF(设置所有位)。
示例:
CGRect bodyRect = CGRectInset(frame, 2, 2);
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:bodyRect.size];
self.physicsBody.categoryBitMask = CNPhysicsCategoryBlock;
self.physicsBody.collisionBitMask = CNPhysicsCategoryBlock | CNPhysicsCategoryCat | CNPhysicsCategoryEdge;