Ž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#
| Stav | is_valid() | Význam |
|---|---|---|
| Živý a enabled | true | Native constraint se účastní solveru. |
| Živý a disabled | true | Resource a nastavení zůstávají, ale constraint se neúčastní solveru. |
| Zničený | false | Handle je uvolněný a wrapper jej nastaví na 0. |
| Zničená závislost | false | Zničení připojeného tělesa nejprve automaticky odstraní jeho constrainty. |
| Zastavený runtime | false | jolt_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#
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#
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#
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ík | Signatura | Kontrakt operace |
|---|---|---|
| JoltConstraint.destroy | JoltConstraint.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_enabled | JoltConstraint.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_length | JoltConstraint.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_enabled | JoltConstraint.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_friction | JoltConstraint.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_impulses | JoltConstraint.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_length | JoltConstraint.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_length | JoltConstraint.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_handle | JoltConstraint.get_native_handle() | Živý handle constraintu nebo 0. |
| JoltConstraint.get_position | JoltConstraint.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_frame | JoltConstraint.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_velocity | JoltConstraint.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_position | JoltConstraint.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_velocity | JoltConstraint.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_valid | JoltConstraint.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_enabled | JoltConstraint.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_enabled | JoltConstraint.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_friction | JoltConstraint.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_length | JoltConstraint.set_length(minimum, maximum) | Pouze Pulley: konečné 0 ≤ min ≤ max v m pro kombinovanou délku. Boolean. |
| JoltConstraint.set_target_angular_velocity | JoltConstraint.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_position | JoltConstraint.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_velocity | JoltConstraint.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. |