我正在将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)
。
如果需要更多信息,请告诉我。
这可能是什么原因?