Я использую 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)
.
Если потребуется дополнительная информация, дайте мне знать.
Что может быть причиной этого?