‹
Constraints

Životní cyklus constraintu

Vysvětluje validitu, ownership, deaktivaci, collision filtering, invalidaci závislostí a bezpečný cleanup.

Managed JoltConstraint vlastní jeden world-scoped generační native handle. Odkazuje na připojená tělesa, ale nikdy nevlastní jejich GML wrappers ani gameplay data.

Stavy#

Stavis_valid()Význam
Živý a enabledtrueNative constraint se účastní solveru.
Živý a disabledtrueResource a nastavení zůstávají, ale constraint se neúčastní solveru.
ZničenýfalseHandle je uvolněný a wrapper jej nastaví na 0.
Zničená závislostfalseZničení připojeného tělesa nejprve automaticky odstraní jeho constrainty.
Zastavený runtimefalsejolt_stop() zneplatní resources předchozího default worldu.

Ownership pravidla#

  • destroy() zničí pouze constraint, nikdy připojená tělesa.
  • destroy() je idempotentní a bezpečný při opakovaném volání.
  • Stale generační handle nemůže adresovat pozdější constraint využívající stejný interní slot.
  • Body-to-body constrainty musí zůstat ve stejném managed default worldu jako jejich tělesa.
  • World constraints interně odkazují na immutable fixed body Jolt a externě na jedno user body.

Disable versus destroy#

GML
joint.set_enabled(false); // keep limits and motor settings

// Later:
joint.set_enabled(true);

// Permanent release:
joint.destroy();

Disable použijte pro mechanismus, který se bude znovu používat. Destroy použijte po úplném ukončení vztahu, kdy se má uvolnit native solver resource.

Collision připojených těles#

  • collision:false nebo set_collision_enabled(false) potlačí jen danou user-body pair.
  • Potlačení je reference-counted: zničení jednoho z více constraintů neaktivuje dvojici předčasně.
  • Změna nastavení invaliduje cached contacts a probudí dotčená tělesa.
  • World constraints vždy hlásí collision disabled, protože nemají druhé user collision body.

Bezpečný cleanup#

GML
if (is_struct(joint) && joint.is_valid()) {
    joint.destroy();
}

body_a.destroy();
body_b.destroy();

// Global managed cleanup is ordered and idempotent.
jolt_stop();

Zpracování chyb#

GML
var joint = jolt_hinge(a, b, 0,0,2, 0,0,1);
if (is_undefined(joint)) {
    var error = jolt_get_error();
    show_debug_message(string(error.code) + " / " + error.context + ": " + error.message);
}

Ruční cleanup order#

Uvolněte dependent constrainty před tělesy, potom reusable shape/layer resources před worldem a runtime. jolt_stop() provede managed pořadí automaticky a bezpečně i opakovaně.

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
JoltConstraint.destroyJoltConstraint.destroy()Boolean; zničí constraint, nikoliv tělesa. Opakované zničení již neplatného wrapperu vrací true; nativní chyba může vrátit false.
JoltConstraint.get_collision_enabledJoltConstraint.get_collision_enabled()Kolize mezi oběma připojenými tělesy. Setter Boolean úspěchu, getter Boolean stavu; vazba ke světu vždy vrací false a setter uspěje bez zapnutí kolize. Nejde o globální filtr vrstev.
JoltConstraint.get_current_lengthJoltConstraint.get_current_length()Pouze Pulley: minimální/maximální/aktuální kombinovaná délka v m (s poměrem kladky). 0 při chybě.
JoltConstraint.get_enabledJoltConstraint.get_enabled()Aktivace vazby, ne destrukce. Setter vrací Boolean úspěchu; getter Boolean stavu, false i při chybě. Vyžaduje živý constraint.
JoltConstraint.get_frictionJoltConstraint.get_friction(axis)SixDOF axis 0..5; N pro posuv, N·m pro rotaci; 0 při neplatném wrapperu/typu, nativní chybu čti zvlášť.
JoltConstraint.get_impulsesJoltConstraint.get_impulses()SixDOF: {translation, rotation, motor_translation, motor_rotation}, každý {x, y, z}, poslední solver impulzy N·s / N·m·s. undefined pro neplatný wrapper/typ; native chyby čti zvlášť.
JoltConstraint.get_max_lengthJoltConstraint.get_max_length()Pouze Pulley: minimální/maximální/aktuální kombinovaná délka v m (s poměrem kladky). 0 při chybě.
JoltConstraint.get_min_lengthJoltConstraint.get_min_length()Pouze Pulley: minimální/maximální/aktuální kombinovaná délka v m (s poměrem kladky). 0 při chybě.
JoltConstraint.get_native_handleJoltConstraint.get_native_handle()Živý handle constraintu nebo 0.
JoltConstraint.get_positionJoltConstraint.get_position()Slider posun nebo Path vzdálenost podél cesty v m, nikoliv {x, y, z}. 0 při chybě.
JoltConstraint.get_sixdof_debug_frameJoltConstraint.get_sixdof_debug_frame()SixDOF diagnostický struct: anchor a axis_x/y/z ve světě; relative_position/orientation a target_position/orientation v prostoru constraintu. Pozice m, orientace XYZW. undefined pro neplatný wrapper/typ; jde o čtení, bez změny solveru.
JoltConstraint.get_target_angular_velocityJoltConstraint.get_target_angular_velocity()SixDOF: {x, y, z} v prostoru constraintu v °/s. Getter nezachytí všechny nativní chyby; předem ověř typ/platnost, čti chybový stav.
JoltConstraint.get_target_positionJoltConstraint.get_target_position()SixDOF: {x, y, z} v prostoru constraintu v m. Getter nezachytí všechny nativní chyby; předem ověř typ/platnost, čti chybový stav.
JoltConstraint.get_target_velocityJoltConstraint.get_target_velocity()SixDOF: {x, y, z} v prostoru constraintu v m/s. Getter nezachytí všechny nativní chyby; předem ověř typ/platnost, čti chybový stav.
JoltConstraint.is_validJoltConstraint.is_valid()Boolean ověřující nativní constraint a původní svět; zánik připojeného tělesa zneplatní constraint.
JoltConstraint.set_collision_enabledJoltConstraint.set_collision_enabled(enabled)Kolize mezi oběma připojenými tělesy. Setter Boolean úspěchu, getter Boolean stavu; vazba ke světu vždy vrací false a setter uspěje bez zapnutí kolize. Nejde o globální filtr vrstev.
JoltConstraint.set_enabledJoltConstraint.set_enabled(enabled)Aktivace vazby, ne destrukce. Setter vrací Boolean úspěchu; getter Boolean stavu, false i při chybě. Vyžaduje živý constraint.
JoltConstraint.set_frictionJoltConstraint.set_friction(axis,value)SixDOF axis 0..5; konečný nezáporný limit síly (osy 0..2, N) nebo momentu (3..5, N·m). Boolean. Nastavení limitu samo motor nezapne.
JoltConstraint.set_lengthJoltConstraint.set_length(minimum, maximum)Pouze Pulley: konečné 0 ≤ min ≤ max v m pro kombinovanou délku. Boolean.
JoltConstraint.set_target_angular_velocityJoltConstraint.set_target_angular_velocity(x,y,z)SixDOF: konečné x/y/z v prostoru constraintu v °/s; Boolean. Nastavení cíle samo nezapne jednotlivé motory.
JoltConstraint.set_target_positionJoltConstraint.set_target_position(x,y,z)SixDOF: konečné x/y/z v prostoru constraintu v m; Boolean. Nastavení cíle samo nezapne jednotlivé motory.
JoltConstraint.set_target_velocityJoltConstraint.set_target_velocity(x,y,z)SixDOF: konečné x/y/z v prostoru constraintu v m/s; Boolean. Nastavení cíle samo nezapne jednotlivé motory.