我如何创建一个"墙"在我的屏幕左侧和右侧Swift Spritekit?

时间:2015-03-01 15:49:09

标签: xcode swift

我希望物体能够穿过屏幕的底部和顶部,但不能离开右侧和左侧。我有这个代码,但是当我的对象向左或向右移动时,它不会充当墙壁并让它直接通过它。我使用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)

1 个答案:

答案 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;