【问题标题】:Two physics bodies do not contact if physicsBody.dynamic property is NO如果physicsBody.dynamic 属性为NO,则两个物理体不接触
【发布时间】:2013-11-01 05:57:41
【问题描述】:

有两个物理体: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 方法。但是,如果我为AirplaneNodeBulletNode 指定physicsBody.dynamic 属性为YES,则didBeginContact 正在触发。

有没有办法解决这个问题?

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

【问题讨论】:

  • 一个需要是动态的,然后它应该可以工作。即您的子弹可以是动态的,并且您通过动作移动它,它将具有碰撞检测功能。 Prob 需要设置它不受重力影响。

标签: ios objective-c collision-detection game-physics sprite-kit


【解决方案1】:

非动态(静态)物体永远不会发生碰撞,它们一开始就不会改变它们的位置。

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

【讨论】:

  • dynamic = YEScollisionBitMask = 0 成功了。谢谢!
  • 嗨,andrey 让物理体动态到是的,物体会掉到地上并设置碰撞位掩码 = 0 以及如何实现这一点,请帮助我
  • @LearnCocos2D 这是不正确的。非动态物理物体确实会发生碰撞。这里的错误只是将 not collissionBitMask 设置为零,让默认值(完整掩码)告诉 spriteKit 处理碰撞,然后 for 不会触发 SKPhysicsContactDelegate 委托...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多