未检测到同时碰撞

时间:2019-01-26 10:16:00

标签: java scala libgdx box2d jbox2d

我正在将JBox2D与LibGDX结合使用,并希望检测与传感器的同时碰撞。我遇到的问题是可以检测到一个碰撞,但是如果同时发生其他任何碰撞,则它们不会通过。

例如子弹击中了僵尸。如果僵尸正与窗玻璃碰撞,则子弹会击中僵尸,但碰撞不会传递给联系侦听器。

这是我如何发送联系信息和创建的正文的简化示例。

联系人监听器

/** All current contacts */      
val contacts = ListBuffer[Contact]()

override def create(): Unit = {

  world.setContactListener(new ContactListener() {
    override def postSolve(contact: Contact, impulse: ContactImpulse): Unit = {}

    override def endContact(contact: Contact): Unit = {}

    override def beginContact(contact: Contact): Unit = {
      contacts += contact
    }

    override def preSolve(contact: Contact, oldManifold: Manifold): Unit = {

    }
  })
}

def update(): Unit ={

  /** Send all contacts to the collided objects */
  contacts.foreach(c => {
    if (c.getFixtureA != null){
      c.getFixtureA.getUserData.asInstanceOf[GameObject].collisionDetected(c)
    }
    if (c.getFixtureB != null){
      c.getFixtureB.getUserData.asInstanceOf[GameObject].collisionDetected(c)
    }
  })

  contacts.clear()
}

碰撞检测到子弹的实施。

  override def collisionDetected(contact: Contact): Unit = {
    super.collisionDetected(contact)

    contact.getFixtureA.getUserData match {
      case zombie: Zombie => zombie.lowerHealth(damage)
      case _ =>
    }

    contact.getFixtureB.getUserData match {
      case zombie: Zombie => zombie.lowerHealth(damage)
      case _ =>
    }
    alive = false
  }

子弹体

  val bodyDef = {
    val bD = new BodyDef()
    bD.`type` = BodyDef.BodyType.DynamicBody
    bD.angularDamping = 100
    bD
  }

  lazy val polygon: Rectangle = {
    val rect = new Rectangle(sprite.getBoundingRectangle())
    rect
  }

  lazy val box2dShape: Shape = {
    val circle = new CircleShape()
    circle.setRadius(0.1f * Constants.WorldToBox)
    circle
  }

  lazy val fixtureDef: FixtureDef = {
    val fD = new FixtureDef()
    fD.filter.categoryBits = Constants.CategoryBullet
    fD.filter.maskBits = Constants.MaskBullet
    fD
  }

  lazy val fixture: Fixture = {
    fixtureDef.shape = box2dShape
    fixtureDef.density = 1f

    val f = body.createFixture(fixtureDef)

    f.setUserData(this)

    box2dShape.dispose()
    f
  }

  lazy val body: Body = controller.world.createBody(bodyDef)

  body.setBullet(true)

子弹和僵尸身体非常相似,除了僵尸是传感器并且子弹具有body.setBullet(true)

如果需要更多信息,请告诉我。

这可能是什么原因?

0 个答案:

没有答案
相关问题