Kolizní systém

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#

KonstantaHodnotaVýznam
JOLT_COLLISION_ENTER1Dvojice body/sub-shape se začala dotýkat
JOLT_COLLISION_STAY2Dvojice přetrvala během simulačního kroku
JOLT_COLLISION_EXIT3Aktivní dvojice se přestala dotýkat

High-Level API#

GML
var world_events = jolt_get_collisions();
var body_events = body.get_collisions();
var dropped = jolt_get_dropped_collision_count();

Fields world eventu#

FieldPopis
typeENTER, STAY nebo EXIT konstanta
body_a / body_bManaged JoltBody hodnoty, jsou-li stále známé
body_a_handle / body_b_handleRaw generational handly
body_a_valid / body_b_validZda high-level body lookup uspěl
positionWorld-space střed první dostupné dvojice manifold bodů
normalWorld-space native manifold normal v pořadí body_a/body_b
penetration_depthNative manifold penetration; EXIT je vynuceně 0
body_a_sensor / body_b_sensorOddělené sensor flags
user_data_a / user_data_bAktuální GML user_data nebo undefined

Fields per-body eventu#

FieldPopis
typeENTER, STAY nebo EXIT
bodyJoltBody, jehož list čtete
other_bodyDruhý managed JoltBody, je-li platný
entity / other_entityGML user_data hodnoty
other_handle / other_validRaw handle a stav lookupu
position / normal / penetration_depthGeometrie kontaktu
sensorTrue, 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#

GML
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#

GML
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íkSignaturaKontrakt operace
jolt_get_collisionsjolt_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_countjolt_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_collisionjolt_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_collisionsJoltBody.get_collisions()Pole managed událostí posledního jolt_update; není trvalý seznam překryvů.