Hi all,
im trying to calculate damage done to object when physics collision occurs
/**
* Physics collision occurs.
* @param event
*/
public void collision(PhysicsCollisionEvent event) {
if(isEnabled() && event.getObjectA() instanceof PhysicsRigidBody && event.getObjectB() instanceof PhysicsRigidBody) {
//System.out.println("collision started");
if(null != event.getNodeA() && null != event.getNodeA().getControl(DamageControl.class)) {
doDamage(event.getNodeA(), calculateKineticEnergy((PhysicsRigidBody)event.getObjectA(), (PhysicsRigidBody)event.getObjectB()));
}
if(null != event.getNodeB() && null != event.getNodeB().getControl(DamageControl.class)) {
doDamage(event.getNodeB(), calculateKineticEnergy((PhysicsRigidBody)event.getObjectB(), (PhysicsRigidBody)event.getObjectA()));
}
//System.out.println("collision ended");
}
}
private void doDamage(Spatial node, final float kineticEnergy) {
if(kineticEnergy > 20.1f) {
final DamageControl damageControl = node.getControl(DamageControl.class);
//System.out.println("damaging " + node.getUserData("entityName") + " for " + kineticEnergy + " damage");
app.enqueue(new Callable<Void>() {
public Void call() throws Exception {
damageControl.doDamage(kineticEnergy);
return null;
}
});
}
}
private float calculateKineticEnergy(PhysicsRigidBody rigidBodyA, PhysicsRigidBody rigidBodyB) {
//the kinetic energy of a non-rotating object
//of mass m traveling at a speed v is 1/2mv^2
Vector3f relativeVelocity = rigidBodyA.getLinearVelocity().subtract(rigidBodyB.getLinearVelocity());
float relativeVelocityLength = relativeVelocity.length();
float impulse = FasterMath.fixedTpf * 0.5f * rigidBodyA.getMass() * (relativeVelocityLength * relativeVelocityLength);
return impulse * FasterMath.nextRandomFloat(0.95f, 1.05f);
}
computed damage is good enough
but what driving me mad is continuous collision. how can i say:
- hey this is first hit, give some damage to object
- hey this is continuous collision, lets do nothing
- where is tpf
?
PhysicsCollisionListener is very unintuitive, now when collision occurs, it regularily gives damage per tick until objects are touching, even no tpf, and this is bad
while trying to find something, i found this http://stackoverflow.com/questions/20185293/collision-with-enemy-to-inflict-damage
it is from unity, and they have OnCollisionEnter
or should i do something like bombcontrol? while collision occurs, create ghost object that bump objects away and then give them damage? isnt it weird?