Contact callbacks are useful to retrieve more detailed data from entity body contacts that happen in the Box2D simulator. This kind of entity callback is very similar to standard entity callback functions, they must be void
, and include the prefix ETH<contact-event>Callback_
followed by the entity name. There are three kinds of contact callback, each one can be used to gather data from a specific contact event:
This is called every time another simulated entity-body begins to overlap the entity to which the callback function is assigned. This is called for sensors and non-sensors. Example:
void ETHBeginContactCallback_tnt_barrel( ETHEntity@ thisEntity, ETHEntity@ other, vector2 contactPointA, vector2 contactPointB, vector2 contactNormal) { if (other.GetEntityName() == "bullet.ent") { // a 'bullet.ent' hit the TNT barrel, that must result in an explosion explodeMyBarrel(thisEntity); } }
This is called after collision detection, but before collision resolution. This gives you a chance to disable the contact based on the current configuration. For example, you can implement a one-sided platform using this callback and calling DisableContact
. The contact will be re-enabled each time through collision processing, so you will need to disable the contact every time-step. The pre-solve event may be fired multiple times per time step per contact due to continuous collision detection. Example:
void ETHPreSolveContactCallback_one_sided_platform( ETHEntity@ thisEntity, ETHEntity@ other, vector2 contactPointA, vector2 contactPointB, vector2 contactNormal) { ETHPhysicsController@ controller = other.GetPhysicsController(); if (controller.GetLinearVelocity().y < -0.5f) DisableContact(); }
The example above enables single-sided collision for every entity named one_sided_platform
or one_sided_platform.ent
.
This is called every time another entity-body ceases to overlap the entity to which this callback function is assigned to. This is called for sensors and non-sensors.
void ETHEndContactCallback_platform( ETHEntity@ thisEntity, ETHEntity@ other, vector2 contactPointA, vector2 contactPointB, vector2 contactNormal) { if (other.GetEntityName() == "character.ent") print("Our character is no longer stepping on this platform!"); }
other
will always point to the other entity object that triggered the contact event.thisEntity
and other
must have their physics simulation properties enabled in the Entity Editor in order to enable contact callback events. More about that.