‹›
Úvod

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 eventPhysics práce
CreateZavolejte jolt_start(), vytvořte layers a persistent bodies.
Begin Step / Step před updateAplikujte input, forces, impulses a Kinematic targets.
StepZavolejte jolt_update() právě jednou pro managed world.
Step po updateČtěte transforms, synchronizujte instances, zpracujte contacts a raycasts.
DrawRenderujte herní assets; volitelně zavolejte jolt_debug_draw().
CleanupZavolejte jolt_stop() z jediného world ownera.

Kompletní controller příklad#

GML
// 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#

GML
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.