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#
jolt_update([dt]);| Argument | Typ | Popis |
|---|---|---|
| dt | Real | undefined | VOLITELNÉ. 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#
// 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ý argument | Vybere 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í | Default | Efekt |
|---|---|---|
| fixed_dt | 1 / 60 s | 60 physics steps za simulovanou sekundu. |
| max_frame_time | 0.25 s | Jeden update přidá do accumulatoru nejvýše čtvrt sekundy. |
| max_steps | 8 | Jedno volání zpracuje nejvýše osm fixed steps. |
Catch-up příklad#
// 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#
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#
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ík | Signatura | Kontrakt operace |
|---|---|---|
| jolt_fixed_timestep | jolt_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_steps | jolt_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_started | jolt_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_update | jolt_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ů. |