Kontakty
Čte ENTER, STAY a EXIT events vytvořené fyzikální simulací.
Native contact callbacks se kopírují do omezené thread-safe fronty. jolt_update() ji vyprázdní do world event listu a per-body listů pro naposledy zpracovaný frame.
Event konstanty#
| Konstanta | Hodnota | Význam |
|---|---|---|
| JOLT_COLLISION_ENTER | 1 | Dvojice body/sub-shape se začala dotýkat |
| JOLT_COLLISION_STAY | 2 | Dvojice přetrvala během simulačního kroku |
| JOLT_COLLISION_EXIT | 3 | Aktivní dvojice se přestala dotýkat |
High-Level API#
var world_events = jolt_get_collisions();
var body_events = body.get_collisions();
var dropped = jolt_get_dropped_collision_count();Fields world eventu#
| Field | Popis |
|---|---|
| type | ENTER, STAY nebo EXIT konstanta |
| body_a / body_b | Managed JoltBody hodnoty, jsou-li stále známé |
| body_a_handle / body_b_handle | Raw generational handly |
| body_a_valid / body_b_valid | Zda high-level body lookup uspěl |
| position | World-space střed první dostupné dvojice manifold bodů |
| normal | World-space native manifold normal v pořadí body_a/body_b |
| penetration_depth | Native manifold penetration; EXIT je vynuceně 0 |
| body_a_sensor / body_b_sensor | Oddělené sensor flags |
| user_data_a / user_data_b | Aktuální GML user_data nebo undefined |
Fields per-body eventu#
| Field | Popis |
|---|---|
| type | ENTER, STAY nebo EXIT |
| body | JoltBody, jehož list čtete |
| other_body | Druhý managed JoltBody, je-li platný |
| entity / other_entity | GML user_data hodnoty |
| other_handle / other_valid | Raw handle a stav lookupu |
| position / normal / penetration_depth | Geometrie kontaktu |
| sensor | True, pokud je sensorem kterékoli body |
Pro body_b wrapper native normal neguje, takže seznam každého body používá opačnou orientaci. World event zachovává native pořadí body_a/body_b.
Chování a limity fronty#
- Native fronta pojme nejvýše 4096 eventů.
- Po naplnění se odstraní nejstarší event a dropped counter se zvýší.
- Mapa aktivních kontaktů používá oba BodyIDs i oba SubShapeIDs; compounds proto mohou vytvářet různé sub-shape dvojice.
- EXIT znovu použije poslední uloženou position a normal a nastaví penetration_depth na 0.
- Veřejný event zpřístupní pouze první dostupnou dvojici manifold bodů.
Typický loop#
var events = jolt_get_collisions();
for (var i = 0; i < array_length(events); ++i) {
var event = events[i];
switch (event.type) {
case JOLT_COLLISION_ENTER: break;
case JOLT_COLLISION_STAY: break;
case JOLT_COLLISION_EXIT: break;
}
}Low-Level / Advanced API#
jolt_world_collision_next(world)
jolt_world_collision_get_dropped_count(world)
jolt_world_collision_clear(world)collision_next() vyjme jeden zkopírovaný event a při prázdné frontě vrátí undefined. collision_clear() odstraní queued events a vynuluje dropped counter; managed runtime frontu běžně zpracovává automaticky.
Ověřené kontrakty operací#
Následující kontrakty rozlišují jednotky, návratové hodnoty, chyby a životnost podle aktuální implementace. Nevynechávej kontrolu výsledku: false, 0 a undefined mohou mít u různých metod odlišný význam.
| Symbol / vlastník | Signatura | Kontrakt operace |
|---|---|---|
| jolt_get_collisions | jolt_get_collisions() | Managed události posledního drain po jolt_update / počet zahozených událostí. Čti po update; není dotaz na všechny současné překryvy. |
| jolt_get_dropped_collision_count | jolt_get_dropped_collision_count() | Managed události posledního drain po jolt_update / počet zahozených událostí. Čti po update; není dotaz na všechny současné překryvy. |
| jolt_layer_set_collision | jolt_layer_set_collision(layer_a, layer_b, enabled) | Dvě živé vrstvy stejného světa + enabled → Boolean. Nastaví vzájemnou kolizní matici, nikoliv query masku. |
| JoltBody.get_collisions | JoltBody.get_collisions() | Pole managed událostí posledního jolt_update; není trvalý seznam překryvů. |