Kolizní systém

Entity / User Data

Propojuje JoltBody s libovolnými GML daty nebo GameMaker instancí.

user_data ukládá pouze high-level GML wrapper. Native Jolt user data obsahuje bezpečný generational body handle, nikoli váš struct nebo instance ID.

Libovolná data#

GML
body.set_user_data({kind:"Door", id:17, locked:false});
var data = body.get_user_data();

Uložit lze libovolnou GML hodnotu včetně structu, instance, stringu, array nebo undefined. set_user_data() vrací true. Hodnota se neserializuje, nekopíruje do C++ a neuvolňuje nezávisle na běžných GML referencích.

Binding GameMaker instance#

GML
body.bind_instance(instance, use_as_user_data=true)
body.unbind_instance()
body.sync()
MetodaChování
bind_instanceVyžaduje živou instanci; uloží ji jako owner a standardně také jako user_data
unbind_instanceZruší owner binding, ale user_data ponechá
syncExplicitně zkopíruje physics transform do navázané instance

Fields zapisované metodou sync#

GML
instance.x
instance.y
instance.z
instance.jolt_rotation_x
instance.jolt_rotation_y
instance.jolt_rotation_z
instance.jolt_rotation_w

Entity hodnoty v queries#

  • World contacts zpřístupňují user_data_a a user_data_b.
  • Per-body contacts zpřístupňují entity a other_entity.
  • Raycast hits zpřístupňují entity.
  • Pokud raw handle nelze převést na živý managed JoltBody, související entity hodnota je undefined.
  • Změna user_data ovlivní budoucí mapped events a query results; native collision state se nezmění.

Příklad#

GML
var crate = jolt_box_create_dynamic_for_instance(id, 1, 1, 1, {mass:2});

// Step event po jolt_update()
crate.sync();

var hit = jolt_raycast(0, 0, 2, 10, 0, 2);
if (hit.hit && !is_undefined(hit.entity)) {
    show_debug_message("Hit entity " + string(hit.entity));
}

jolt_box_create_dynamic_for_instance(instance, width, depth, height, options) vytvoří Dynamic Box na instance.x/y/z a naváže jej. Pokud instance nemá proměnnou z, použije se 0.

Životnost a bezpečnost#

bind_instance() odmítne zničenou nebo neplatnou instanci. sync() selže bez živého owner bindingu. Zničení body vyčistí jeho collision data, ale uživatelem držený stale JoltBody může stále udržovat běžné GML hodnoty dostupné, dokud neuvolníte vlastní reference.