Physics World

jolt_update

Posouvá managed world pomocí fixed timestep a omezeného catch-up.

jolt_update() převádí frame time na nula nebo více fixed simulation steps. Accumulator odděluje simulation timing od render-frame timingu, zatímco max_frame_time a max_steps zabraňují neomezené catch-up spirále.

Syntax#

Syntax
jolt_update([dt]);
ArgumentTypPopis
dtReal | undefinedVOLITELNÉ. Délka snímku v sekundách. Výchozí undefined používá delta_time / 1 000 000.

Návratová hodnota#

Real. Počet provedených pevných kroků včetně 0. Hodnota -1 znamená neplatnou operaci nebo selhání simulace; ihned čtěte jolt_get_error().

Typický Step event#

GML
// Step event physics controlleru.
var steps = jolt_update();
if (steps < 0) {
    show_debug_message(jolt_get_error().message);
}

// Physics transforms a kontakty aktuálního framu jsou připravené.
player_body.sync();
var contacts = jolt_get_collisions();

Vstup frame time#

VoláníZdroj času
jolt_update()GameMaker delta_time převedený z mikrosekund na sekundy.
jolt_update(seconds)Explicitní nezáporný počet sekund.
Libovolný záporný argumentVybere automatické chování delta_time.

Fixed-step algoritmus#

  • Dodaný frame time se před přidáním do accumulatoru omezí na max_frame_time.
  • Dokud accumulator obsahuje alespoň fixed_dt, world se posune přesně o fixed_dt.
  • Jedno volání provede nejvýše max_steps.
  • Každý úspěšný step odečte fixed_dt a zvýší lifetime simulation-step counter.
  • Pokud max_steps skončí s dalšími čekajícími celými kroky, nadbytečný backlog se zahodí a fractional remainder zůstane.
  • Kontakty a character contacts se drainují po simulaci, i když volání neprovedlo žádný step.

Výchozí timing#

NastaveníDefaultEfekt
fixed_dt1 / 60 s60 physics steps za simulovanou sekundu.
max_frame_time0.25 sJeden update přidá do accumulatoru nejvýše čtvrt sekundy.
max_steps8Jedno volání zpracuje nejvýše osm fixed steps.

Catch-up příklad#

GML
// S fixed_dt = 1/60 a explicitním framem 0.05 sekundy:
var steps = jolt_update(0.05);
// Běžně provede 3 fixed steps, podle zbytku v accumulatoru.

Zpracování každého stepu#

Před každým world stepem se připraví high-level character state. Native world posune CharacterVirtual controllers a poté provede Jolt rigid-body update. Wrapper následně aktualizuje managed character state. Po dokončení všech kroků mapuje collision queues do world a per-body event arrays.

Čtení aktuálního stavu#

GML
var total_steps = jolt_get_simulation_steps();
var fixed_seconds = jolt_fixed_timestep();
var world_events = jolt_get_collisions();
var dropped = jolt_get_dropped_collision_count();

Transforms čtěte, bound instances synchronizujte a contact arrays zpracujte po jolt_update(). Per-body a world collision listy představují poslední drain a další update je nahradí.

Collision substeps#

Low-level convenience funkce jolt_step() volí collision_steps jako ceil(delta_time × 60) omezené na rozsah 1 až 64. S default fixed_dt 1/60 jde o jeden collision step na fixed update.

Low-Level / Advanced API#

GML
jolt_step(world, delta_time)
jolt_world_step(world, delta_time, collision_steps=1)

Low-level stepping vyžaduje živý world, konečné delta_time větší než 0 a collision_steps od 1 do 64. Neposkytuje managed accumulator, frame clamp, catch-up limit, high-level error context ani automatické mapování collision arrays.

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_fixed_timestepjolt_fixed_timestep()Čte managed stav bez kroku fyziky: Boolean started / handle světa / fixed_dt s / kumulativní počet kroků / počet valid wrapperů těles. Počet wrapperů není kontrola všech native handles.
jolt_get_simulation_stepsjolt_get_simulation_steps()Čte managed stav bez kroku fyziky: Boolean started / handle světa / fixed_dt s / kumulativní počet kroků / počet valid wrapperů těles. Počet wrapperů není kontrola všech native handles.
jolt_is_startedjolt_is_started()Čte managed stav bez kroku fyziky: Boolean started / handle světa / fixed_dt s / kumulativní počet kroků / počet valid wrapperů těles. Počet wrapperů není kontrola všech native handles.
jolt_updatejolt_update(frame_seconds = -1.0)Vrací počet provedených pevných kroků, chyba -1. Bez argumentu nebo záporný argument bere delta_time mikrosekundy → sekundy; vstup omezí max_frame_time/max_steps, přebytečný backlog zahodí. Volej jednou za frame; zahrnuje managed pre/post systémy a drain kontaktů.