如果physicsBody.dynamic属性为NO,则两个物理实体不联系

And*_*eev 6 objective-c collision-detection game-physics ios sprite-kit

有两个物理机构:a 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;
}
Run Code Online (Sandbox Code Playgroud)

和a 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;
}
Run Code Online (Sandbox Code Playgroud)

他们都有physicsBody.dynamic财产设置NO.

问题是当子弹击中飞机时,我SKScene不会打电话给didBeginContact方法.但是,如果我指定physicsBody.dynamic属性YES的两种AirplaneNodeBulletNode,didBeginContact被解雇.

有办法解决这个问题吗?

PS:我真的不需要我的节点是动态的,因为它会导致不必要的行为:飞机在受到损坏时轻微移动,子弹在飞行时有时会旋转.

Lea*_*s2D 16

非动态(静态)物体永远不会发生碰撞,它们并不意味着首先改变它们的位置.

collisionBitMask如果您不希望它们受到冲突的影响,请将它们设置为0.请参阅SKPhysicsBody参考.

  • `dynamic = YES`和`collisionBitMask = 0`就可以了.谢谢! (2认同)