Základní physics loop
Ukazuje doporučené pořadí inicializace, inputu, simulace, synchronizace, kontaktů, renderingu a cleanupu.
Managed runtime vlastní fixed-step accumulator uvnitř jolt_update(). GameMaker dál spouští běžné events; controller volá physics lifecycle funkce v přesně určených bodech.
Přehled lifecycle#
| GameMaker event | Physics práce |
|---|---|
| Create | Zavolejte jolt_start(), vytvořte layers a persistent bodies. |
| Begin Step / Step před update | Aplikujte input, forces, impulses a Kinematic targets. |
| Step | Zavolejte jolt_update() právě jednou pro managed world. |
| Step po update | Čtěte transforms, synchronizujte instances, zpracujte contacts a raycasts. |
| Draw | Renderujte herní assets; volitelně zavolejte jolt_debug_draw(). |
| Cleanup | Zavolejte jolt_stop() z jediného world ownera. |
Kompletní controller příklad#
// CREATE
jolt_start();
floor_body = jolt_box_create_static(0, 0, -0.5, 20, 20, 1);
player_instance = instance_find(obj_player, 0);
player_body = jolt_box_create_dynamic_for_instance(player_instance, 0.8, 0.8, 1.8, {mass: 80});
// STEP: aplikujte input před simulací
if (keyboard_check(vk_right)) {
player_body.add_force(300, 0, 0);
}
var physics_steps = jolt_update();
if (physics_steps >= 0) {
player_body.sync();
var contacts = player_body.get_collisions();
for (var i = 0; i < array_length(contacts); ++i) {
if (contacts[i].type == JOLT_COLLISION_ENTER) {
show_debug_message("Contact began");
}
}
}
// CLEANUP
jolt_stop();Pravidla pořadí#
- Spusťte fyziku před vytvořením layers, bodies, shapes, constraints, characters nebo cloth.
- Forces aplikujte před jolt_update(), pokud mají ovlivnit simulaci aktuálního framu.
- jolt_update() volejte jednou za rendered frame z jednoho autoritativního controlleru.
- Transforms čtěte a synchronizujte po update.
- Collision arrays čtěte po update, protože contact queues se drainují na jeho konci.
- Stejný managed default world nestepujte z více objects.
- Stop proveďte až poté, co gameplay objects už své physics resources nepotřebují.
Proměnlivý frame rate#
Bez argumentu jolt_update() přečte GameMaker delta_time v mikrosekundách a vloží jej do omezeného fixed-step accumulatoru. Může vrátit 0, 1 nebo několik steps. Default fixed timestep je 1/60 sekundy, frame contribution se omezuje na 0.25 sekundy a jeden update zpracuje nejvýše 8 steps.
Chyby#
var steps = jolt_update();
if (steps < 0 || jolt_has_error()) {
var error = jolt_get_error();
show_debug_message(error.context + ": " + error.message);
}High-level operations při běhu čistí a nahrazují současný managed error state. Selhání zpracujte blízko operation, která je může způsobit, a nepředpokládejte, že stará chyba zůstává uložená navždy.
Rendering a interpolation#
Rendering zůstává oddělený od simulace. Současný high-level runtime interně uchovává fractional accumulator, ale nezpřístupňuje veřejné interpolation alpha. Renderujte poslední transform nebo implementujte game-side previous/current transform policy, pokud potřebujete plynulou interpolaci.