Raycasting

jolt_raycast_all

Vrací nejbližší průsečík každého rigid body protnutého paprskem a řadí je od nejbližšího.

jolt_raycast_all() používá stejnou managed smlouvu endpoints a filteru, ale shromáždí jeden veřejný výsledek pro každý protnutý BodyID. Hodí se pro průstřel, výběr seřazených kandidátů a dodatečné filtrování, které nativní filtr neumí vyjádřit.

Syntax#

Syntax
jolt_raycast_all(x1, y1, z1, x2, y2, z2, [filter]);
ArgumentTypPopis
x1RealKonečná X souřadnice začátku úsečky ve světě se Z nahoru.
y1RealKonečná Y souřadnice začátku úsečky ve světě se Z nahoru.
z1RealKonečná Z souřadnice začátku úsečky ve světě se Z nahoru.
x2RealKonečná X souřadnice konce úsečky ve světě se Z nahoru.
y2RealKonečná Y souřadnice konce úsečky ve světě se Z nahoru.
z2RealKonečná Z souřadnice konce úsečky ve světě se Z nahoru.
filterJoltLayer | Array | Real | Struct | undefinedVOLITELNÉ. Výchozí undefined: všechny vrstvy, žádné ignorované těleso. Viz Layer Filtering.

Návratová hodnota#

Array výsledků RaycastResult. Nejbližší zásah každého tělesa, seřazeno podle vzdálenosti. Prázdné pole znamená minutí nebo chybu; rozlište je okamžitým voláním jolt_get_error().

Příklad: základní dotaz#

Předpoklad: svět byl úspěšně spuštěn pomocí jolt_start().

GML
var hits = jolt_raycast_all(0, 0, 2, 10, 0, 2);
var error = jolt_get_error();
if (error.code != JOLT_ERROR_NONE) {
    show_debug_message(error.message);
}
else {
    show_debug_message(array_length(hits));
}

Úsečka vede z (0, 0, 2) do (10, 0, 2). Ukázka odděluje chybu od platného výsledku ještě před jeho použitím.

Seřazené výsledky#

GML
var hits = jolt_raycast_all(0, 0, 2, 30, 0, 2, { ignore: player_body });
var error = jolt_get_error();

if (error.code == JOLT_ERROR_NONE) {
    for (var i = 0; i < array_length(hits); ++i) {
        show_debug_message(string(i) + ": " + string(hits[i].distance));
    }
}

Pravidla sběru#

  • Výsledky jsou seřazené podle vzdálenosti od počátku.
  • Pro každé rigid body se vrátí pouze nejbližší průsečík.
  • Compound, mesh nebo jiné concave body přispěje nejvýše jedním veřejným výsledkem.
  • Zpracuje se nejvýše 256 nativních položek collectoru; veřejné mapování může vrátit méně výsledků.
  • Úspěšný dotaz bez zásahů vrací prázdné pole.
  • Chyba také vrací prázdné pole a musí se rozlišit pomocí jolt_get_error().

Nalezení prvního herního cíle#

GML
var hits = jolt_raycast_all(x1, y1, z1, x2, y2, z2, { ignore: player_body });
var target = undefined;

if (jolt_get_error().code == JOLT_ERROR_NONE) {
    for (var i = 0; i < array_length(hits); ++i) {
        if (!is_undefined(hits[i].entity)) {
            target = hits[i];
            break;
        }
    }
}

Ignorování více bodies#

Nativní filtr ignoruje pouze jedno body. Pro vyloučení více objektů načtěte všechny hits a v GML přeskočte nechtěné JoltBody nebo user_data. Pamatujte, že takto přeskočené body již ve výsledném zpracování nepůsobí jako překážka.

Příklad průstřelu#

GML
var power = 12;
var hits = jolt_raycast_all(x1, y1, z1, x2, y2, z2, shot_layers);

if (jolt_get_error().code == JOLT_ERROR_NONE) {
    for (var i = 0; i < array_length(hits) && power > 0; ++i) {
        var hit = hits[i];
        if (is_struct(hit.body)) hit.body.add_impulse(dir_x * power, dir_y * power, dir_z * power);
        power -= 4;
    }
}

Sensory a zadní strany trojúhelníků#

Sensory jsou zahrnuté, pokud je nevyloučí vrstva nebo jedno ignored body. Dotazy proti Mesh a HeightField trojúhelníkům používají současné výchozí nativní chování, které ignoruje zadní strany trojúhelníků.

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
jolt_raycast_alljolt_raycast_all(x1, y1, z1, x2, y2, z2, filter = undefined)Managed forma má dva SVĚTOVÉ KONCOVÉ BODY (x1, y1, z1, x2, y2, z2), nikoliv směr. Volitelný filter jsou layers nebo options podle query dokumentace. Raycast vrací hit struct, all pole; žádný zásah hit=false/[]. Osm argumentů pouze u jolt_raycast přepne legacy formu world+origin+direction+distance s číselným body handle. Managed zásah obsahuje JoltBody a údaje původního paprsku.