Одновременные столкновения не обнаружены - PullRequest
0 голосов
/ 26 января 2019

Я использую 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).

Если потребуется дополнительная информация, дайте мне знать.

Что может быть причиной этого?

...