Kolizní systém

Impact Sensor

Rozpoznejte nový náraz rigidního tělesa pro zvuk, částice nebo orientační herní poškození.

Impact Sensor je volitelná vlastnost JoltBody. Uchovává poslední relevantní náraz; není to trigger, fronta kolizních událostí ani průběžný siloměr.

Vytvoření a zapnutí#

GML
// Create event, after the central controller has called jolt_start().
last_impact_sequence = 0;
body = jolt_box_create_dynamic(0, 0, 5, 1, 1, 1, {
    mass: 2,
    impact_sensor: {min_value: 10}
});
if (is_undefined(body)) show_debug_message(jolt_get_error_message());
APIChování
impact_sensor: trueZapne záznam s min_value 0.
impact_sensor: {min_value: value}Zapne záznam s nezáporným konečným prahem v N*s.
body.set_impact_sensor(enabled, min_value=0)Bool enabled a nezáporný konečný práh. Při úspěchu true, při chybě false.
body.get_impact_sensor()Přečte snapshot bez spotřebování. Při chybě vrací prázdný snapshot a nastaví managed chybu.

Co se počítá jako náraz?#

Vyhodnocuje se pouze nový nesenzorový kontakt OnContactAdded. Rychlost přibližování v kontaktu musí být alespoň 0.05 světové jednotky za sekundu a EstimateCollisionResponse musí odhadnout kladný normálový impuls. min_value filtruje součet normálových kontaktních impulsů v N*s.

OnContactPersisted snapshot nepřepisuje: ležení a klouzání po existujícím kontaktu jej znovu nespouští. Z více kandidátů v jednom native fyzikálním kroku se uloží nejsilnější a sequence se zvýší jednou. Jedno jolt_update() může provést více kroků; uložený snapshot je poslední zaznamenaný náraz, ne nutně nejsilnější za celou aktualizaci.

Pole výsledku#

APIChování
hitZda byl od resetu uložen relevantní náraz.
value / impulseOdhad normálového impulsu v N*s; impulse je alias value. Nejde o sílu v newtonech.
normal_speedRychlost přibližování v kontaktu ve světových jednotkách/s.
positionSvětová pozice {x,y,z} nejsilnějšího kontaktního bodu.
normalSvětová normála od sledovaného tělesa k druhému tělesu.
other_handleHistorická generačně bezpečná native identita druhého rigidního tělesa.
other_body / other_user_dataAktuálně živé managed těleso a jeho aktuální GML user_data, nebo undefined při nedostupnosti/zničení.
sequenceRoste během jedné zapnuté relace záznamu; porovnávejte s poslední zpracovanou hodnotou.

Jednorázová reakce po aktualizaci fyziky#

GML
// After the central jolt_update(); do not add a second physics update here.
if (!is_undefined(body) && body.is_valid()) {
    var impact = body.get_impact_sensor();
    if (jolt_has_error()) {
        show_debug_message(jolt_get_error_message());
    } else if (impact.hit && impact.sequence != last_impact_sequence) {
        last_impact_sequence = impact.sequence;
        show_debug_message("Impact: " + string(impact.value) + " N*s");
        // Play one sound or spawn one particle effect here.
    }
}

Reset a životní cyklus#

Před prvním nárazem je hit false, sequence nula a číselná pole nulová. Snapshot přetrvá do nahrazení nebo resetu. Přechod enabled z true na false nebo naopak jej vyčistí. Volání set_impact_sensor(true, threshold) při již zapnutém záznamu mění pouze práh; uložený náraz nesmaže.

GML
// Explicitly begin a new recording session on a validated body.
if (body.set_impact_sensor(false) && body.set_impact_sensor(true, 10)) {
    last_impact_sequence = 0;
} else show_debug_message(jolt_get_error_message());

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
JoltBody.get_impact_sensorJoltBody.get_impact_sensor()Snapshot hit, value, impulse, normal_speed, position, normal, other_handle, other_body, other_user_data, sequence. Bez zásahu/chyba prázdný hit=false snapshot; position m, normal_speed m/s. Není scalar get_impact.
JoltBody.set_impact_sensorJoltBody.set_impact_sensor(enabled, min_value = 0.0)Boolean enabled, nezáporný min_value default 0; Boolean výsledek. Událostní senzor nárazu je jiný mechanismus než solverové get_impact.