如果physicsBody.dynamic属性为NO,则两个物理体不会接触。

7
有两个物理体:一个是 AirplaneNode
- (id)initAirplaneNode {
    self = [super initWithImageNamed:@"airplane.png"];
    if (self) {
        self.name = @"player";
        self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size];
        self.physicsBody.dynamic = NO;
        self.physicsBody.affectedByGravity = NO;
        self.physicsBody.categoryBitMask = AIRPLANE_CATEGORY;
        self.physicsBody.contactTestBitMask = BULLET_CATEGORY;
    }
    return self;
}

还有一个BulletNode

- (id)initBulletNode {    
    self = [super initWithImageNamed:@"bullet.png"];
    if (self) {
        self.name = @"bullet";
        self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size];
        self.physicsBody.dynamic = NO;
        self.physicsBody.usesPreciseCollisionDetection = YES;
        self.physicsBody.categoryBitMask = BULLET_CATEGORY;
        self.physicsBody.contactTestBitMask = AIRPLANE_CATEGORY;
    }
    return self;
}

两个节点都将 physicsBody.dynamic 属性设置为 NO。
问题在于当子弹击中飞机时,我的 SKScene 并未调用 didBeginContact 方法。但是,如果我将 AirplaneNode 或 BulletNode 的 physicsBody.dynamic 属性设置为 YES,则会触发 didBeginContact 事件。
有没有一种方法可以解决这个问题?
PS:我真的不需要我的节点是动态的,因为这会导致一个不必要的行为:飞机受损时会轻微移动,子弹有时会旋转飞行。

需要具有动态性,才能正常工作。例如,您的子弹可以是动态的,您可以通过操作使其移动,并具有碰撞检测。可能需要设置它不受重力影响。 - DogCoffee
1个回答

17

非动态(静态)物体不会发生碰撞,它们本来就没有改变位置的意图。

如果你不希望它们受到碰撞的影响,请将它们的collisionBitMask设置为0。请参考SKPhysicsBody参考文档


2
dynamic = YEScollisionBitMask = 0解决了问题。谢谢! - Andrey Gordeev
嗨Andrey,将物理体设置为dynamic,对象将会掉落到地面,并设置collisionBitMask = 0,怎样实现这个功能请帮帮我。 - seenu
@LearnCocos2D 这是不正确的。非动态物理体确实会发生碰撞。这里的错误在于将非碰撞位掩码设置为零,让默认值(完整掩码)告诉SpriteKit处理碰撞,然后不触发SKPhysicsContactDelegate代理... - Hugues BR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接