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í#
// 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());| API | Chování |
|---|---|
| impact_sensor: true | Zapne 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#
| API | Chování |
|---|---|
| hit | Zda byl od resetu uložen relevantní náraz. |
| value / impulse | Odhad normálového impulsu v N*s; impulse je alias value. Nejde o sílu v newtonech. |
| normal_speed | Rychlost přibližování v kontaktu ve světových jednotkách/s. |
| position | Světová pozice {x,y,z} nejsilnějšího kontaktního bodu. |
| normal | Světová normála od sledovaného tělesa k druhému tělesu. |
| other_handle | Historická generačně bezpečná native identita druhého rigidního tělesa. |
| other_body / other_user_data | Aktuálně živé managed těleso a jeho aktuální GML user_data, nebo undefined při nedostupnosti/zničení. |
| sequence | Roste během jedné zapnuté relace záznamu; porovnávejte s poslední zpracovanou hodnotou. |
Jednorázová reakce po aktualizaci fyziky#
// 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.
// 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ík | Signatura | Kontrakt operace |
|---|---|---|
| JoltBody.get_impact_sensor | JoltBody.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_sensor | JoltBody.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. |