Grip: přichycení postavy
Dvě pomyslné ruce přichytí Character ke statickému nebo kinematickému povrchu.
První použití#
Grip pohybuje postavou podle kotev rukou; Grabber / Carry naopak drží předmět před postavou. Jeden Character může mít jeden Grip controller. Připojený Dynamic Body současný Grip nepodporuje.
wall.set_grip_enabled(true);
grip = jolt_grip(player);
grip.set_camera(o_control_bbmod_camera);
grip.set_distances(0.65, 1.5, 2);
// End Step, po aktualizaci kamery:
grip.update_controls();
// Clean Up:
// grip.destroy();player musí být platný JoltCharacter. Kamera poskytuje camera.Position, camera.Target a mouse_locked. Výchozí levé/pravé tlačítko myši ovládá levou/pravou ruku. Pro vlastní vstup použij acquire nebo update_hand; nespracovávej tentýž vstup zároveň automaticky.
Vzdálenosti a pohyb#
| Nastavení | Význam a rozsah |
|---|---|
| set_distances(working, reach, break, hand=JOLT_GRIP_BOTH) | Metry: cílová vzdálenost, dosah získání úchopu, mez puštění. 0.05 ≤ working ≤ reach ≤ break ≤ 100. Default 0.65, 1.5, 2. |
| set_motion(max_speed, response) | Rychlost (0,30] m/s a odezva (0,60] 1/s. Default 3 a 8. |
| set_body_movement_enabled(enabled) | Povolí posun těla vůči úchopu. Default false. |
| set_body_offset_limit(distance) | 0–100 m; default 0.75. |
| set_body_move_speed(speed) / set_body_move_response(response) | (0,30] m/s a (0,60] 1/s; default 1 a 10. |
| set_body_return_enabled(enabled) / set_body_return_speed(speed) | Návrat offsetu po puštění pohybových kláves. Default false a 1 m/s. Při false offset přetrvává. |
| set_move_input(x,y) | Abstraktní osy −1 až 1. Pohyb integruje pevný fyzikální krok. |
| set_view_angles(yaw,pitch) | Stupně; yaw 0 = +X, 90 = +Y, kladný pitch míří nahoru. |
| set_view_basis(fx,fy,fz,rx,ry,rz) | Světový směr vpřed a vpravo; musí vytvořit nenulovou nezávislou bázi. |
Ruce a aktuální cíl#
JOLT_GRIP_LEFT = 0, JOLT_GRIP_RIGHT = 1; BOTH = −1 je jen pro operace podporující obě ruce. get_attached(hand) vrací Boolean. get_position, get_rotation, get_world_normal a ostatní údaje úchopu vracejí undefined, pokud ruka není přichycená. Pozice je {x,y,z} ve světě, rotace quaternion {x,y,z,w}. +Z rotace odpovídá normále povrchu; +X vychází z kamery při uchopení.
var hand = grip.get_hand(JOLT_GRIP_LEFT);
if (is_struct(hand) && hand.attached) {
hand_model.Matrix = model_matrix_from_transform(
hand.world_position, hand.world_rotation);
}
var target = grip.get_target();
if (!is_undefined(target)) {
preview.Matrix = model_matrix_from_transform(target.position, target.rotation);
}get_target(hand=JOLT_GRIP_LEFT) provede jeden aktuální kamerový raycast a vrátí {position,world_normal,rotation}, nebo undefined. can_grip je pouze zjištění způsobilosti, nezískává úchop. Pro více údajů čti get_hand nebo get_target jednou; jednotlivé gettery pořizují vlastní snapshot/raycast. Zobrazení modelu zapínej a vypínej ve svém rendereru.
Pohyblivé kotvy a omezení#
Static povrch se nesmí po uchopení přemístit. Kinematic kotva se aktualizuje z lokální pozice, normály a rotace a přenáší rychlost bodu. Teleport, změna tvaru/pohybu, vypnutí grip_enabled, zničení tělesa, filtr kolizí nebo překročení break mohou ruku uvolnit. Dynamic Grip, reakční síly rukou, stamina a IK nejsou implementované.
Diagnostika a životnost#
get_status vrací obě ruce a důvody; get_reason(hand) vysvětluje odmítnutí nebo puštění. Po odmítnutí update_hand je nutné pustit ovládání před novým pokusem. release() pustí obě ruce, destroy() ukončí controller. Zničení Characteru jej uvolní. set_debug, set_debug_xray, set_debug_limits a set_debug_labels řídí diagnostiku; draw_debug_gui není veřejné API.
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 |
|---|---|---|
| JoltBody.get_grip_enabled | JoltBody.get_grip_enabled() | Nezávislé opt-in příznaky, výchozí false. Setter Boolean/0/1 → Boolean; getter Boolean false i při chybě. Grip nyní přijímá Static i Kinematic, nikoliv Dynamic; grab_enabled nezaručuje splnění dalších Carry podmínek. |
| JoltBody.set_grip_enabled | JoltBody.set_grip_enabled(enabled) | Nezávislé opt-in příznaky, výchozí false. Setter Boolean/0/1 → Boolean; getter Boolean false i při chybě. Grip nyní přijímá Static i Kinematic, nikoliv Dynamic; grab_enabled nezaručuje splnění dalších Carry podmínek. |
| JoltGrip.acquire | JoltGrip.acquire(hand,ox,oy,oz,dx,dy,dz) | LEFT/RIGHT + světový origin a direction. Boolean pokusu; podporuje grip_enabled Static/Kinematic, nikoliv Dynamic. Již přichycená ruka zachová kotvu. |
| JoltGrip.can_grip | JoltGrip.can_grip(hand=JOLT_GRIP_LEFT) | Boolean aktuální způsobilosti raycast cíle, default LEFT; pouze LEFT/RIGHT, ne BOTH. Používá nastavenou kameru; nemusí být právě stisknuté tlačítko. |
| JoltGrip.draw_debug | JoltGrip.draw_debug() | Draw s aktivní 3D kamerou; Boolean. Kreslí pouze při zapnutém debug a platném controlleru; obnovuje grafický stav. Není to Draw GUI. |
| JoltGrip.get_anchor_velocity | JoltGrip.get_anchor_velocity(hand) | Světová rychlost kotvy {x, y, z} m/s, undefined bez přichycení. |
| JoltGrip.get_body | JoltGrip.get_body(hand) | Managed host přichycené ruky, jinak undefined; nevlastněný. |
| JoltGrip.get_distance | JoltGrip.get_distance(hand) | Aktuální vzdálenost ruky od referenčního bodu v m, undefined bez přichycení. |
| JoltGrip.get_hand | JoltGrip.get_hand(hand) | Nezávislý aktuální diagnostický snapshot (celý systém nebo LEFT/RIGHT). get_hand uchovává reason i po release; vrácený struct nemění živý solver. Chyba undefined. |
| JoltGrip.get_local_normal | JoltGrip.get_local_normal(hand) | Místní {x, y, z} kotvy vůči hostu: pozice m / jednotková normála. Bez přichycení undefined. |
| JoltGrip.get_local_position | JoltGrip.get_local_position(hand) | Místní {x, y, z} kotvy vůči hostu: pozice m / jednotková normála. Bez přichycení undefined. |
| JoltGrip.get_motion_type | JoltGrip.get_motion_type(hand) | Typ hosta static/kinematic, undefined bez přichycení; moving_anchor Boolean, false bez přichycení. |
| JoltGrip.get_moving_anchor | JoltGrip.get_moving_anchor(hand) | Typ hosta static/kinematic, undefined bez přichycení; moving_anchor Boolean, false bez přichycení. |
| JoltGrip.get_reason | JoltGrip.get_reason(hand) | Diagnostický důvod ruky ze snapshotu, dostupný i po puštění; neplatný hand vrací undefined. |
| JoltGrip.get_status | JoltGrip.get_status() | Nezávislý aktuální diagnostický snapshot (celý systém nebo LEFT/RIGHT). get_hand uchovává reason i po release; vrácený struct nemění živý solver. Chyba undefined. |
| JoltGrip.is_valid | JoltGrip.is_valid() | Boolean: controller nebyl zničen a má živý Character; připravený bez holderu false. |
| JoltGrip.set_camera | JoltGrip.set_camera(source) | Objekt kamery / živá instance / undefined; Boolean, změna pustí ruce. Očekává camera.Position/Target s X/Y/Z a mouse_locked. |
| JoltGrip.set_debug | JoltGrip.set_debug(enabled) | Uloží příznak kreslení a vrací true; nemění fyziku ani nepovoluje grip_enabled na tělesech. |
| JoltGrip.set_debug_body | JoltGrip.set_debug_body(body) | Živý box JoltBody nebo undefined; Boolean. Pouze volitelný diagnostický obrys, těleso nevlastní. |
| JoltGrip.set_debug_labels | JoltGrip.set_debug_labels(enabled) | Uloží příznak kreslení a vrací true; nemění fyziku ani nepovoluje grip_enabled na tělesech. |
| JoltGrip.set_debug_limits | JoltGrip.set_debug_limits(enabled) | Uloží příznak kreslení a vrací true; nemění fyziku ani nepovoluje grip_enabled na tělesech. |
| JoltGrip.set_debug_xray | JoltGrip.set_debug_xray(enabled) | Uloží příznak kreslení a vrací true; nemění fyziku ani nepovoluje grip_enabled na tělesech. |
| JoltGrip.set_holder | JoltGrip.set_holder(holder) | Živý JoltCharacter; Boolean. Jeden controller na Character, změna pustí staré ruce a přenese uloženou konfiguraci. |
| JoltGrip.set_left_button | JoltGrip.set_left_button(button) | Celé 0..5, 0 vypne ruku; Boolean. Změna bindingu pustí příslušnou ruku. |
| JoltGrip.set_move_input | JoltGrip.set_move_input(x,y) | Konečné XY -1..1, Boolean, vyžaduje živého holdera; kamera relativní posun těla při zapnutém body movement. |
| JoltGrip.set_right_button | JoltGrip.set_right_button(button) | Celé 0..5, 0 vypne ruku; Boolean. Změna bindingu pustí příslušnou ruku. |
| JoltGrip.set_view_angles | JoltGrip.set_view_angles(yaw,pitch) | Konečné yaw/pitch ve stupních, Boolean. Yaw 0 míří +X, 90 +Y, kladný pitch nahoru; rámec pro pohyb a orientaci uchopení. |
| JoltGrip.set_view_basis | JoltGrip.set_view_basis(fx,fy,fz,rx,ry,rz) | Konečný forward/right, nenulové nezávislé vektory; Gram–Schmidt ortonormalizace, Boolean. |
| JoltGrip.update_controls | JoltGrip.update_controls() | Jednou End Step po kameře; Boolean. Odemčená myš nebo neaktivní okno pustí ruce a vrátí true; chybějící/neplatná kamera pustí a vrátí false. |
| JoltGrip.update_hand | JoltGrip.update_hand(hand,down,ox,oy,oz,dx,dy,dz) | LEFT/RIGHT, Boolean down a ray. Nový pokus jen na hraně stisku; držení po neúspěšném pokusu automaticky neopakuje acquire. Boolean neznamená attached: ověř get_attached. |
Úplný seznam deklarací API#
Deklarace odpovídají produkčním GML zdrojům. Hodnota za = označuje volitelný argument. Toto je seznam signatur; význam, jednotky a omezení popisují příslušné části návodu. Název typu před tečkou označuje vlastníka metody, nikoli globální funkci.
| Symbol / vlastník | Signatura / hodnota |
|---|---|
| jolt_grip | jolt_grip(character=undefined) |
| JoltGrip.destroy | JoltGrip.destroy(reason="grip_destroyed") |
| JoltGrip.get_attached | JoltGrip.get_attached(hand) |
| JoltGrip.get_position | JoltGrip.get_position(hand) |
| JoltGrip.get_rotation | JoltGrip.get_rotation(hand) |
| JoltGrip.get_target | JoltGrip.get_target(hand=JOLT_GRIP_LEFT) |
| JoltGrip.get_target_position | JoltGrip.get_target_position(hand=JOLT_GRIP_LEFT) |
| JoltGrip.get_target_rotation | JoltGrip.get_target_rotation(hand=JOLT_GRIP_LEFT) |
| JoltGrip.get_target_world_normal | JoltGrip.get_target_world_normal(hand=JOLT_GRIP_LEFT) |
| JoltGrip.get_world_normal | JoltGrip.get_world_normal(hand) |
| JoltGrip.release | JoltGrip.release(hand=JOLT_GRIP_BOTH) |