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#
jolt_raycast_all(x1, y1, z1, x2, y2, z2, [filter]);| Argument | Typ | Popis |
|---|---|---|
| x1 | Real | Konečná X souřadnice začátku úsečky ve světě se Z nahoru. |
| y1 | Real | Konečná Y souřadnice začátku úsečky ve světě se Z nahoru. |
| z1 | Real | Konečná Z souřadnice začátku úsečky ve světě se Z nahoru. |
| x2 | Real | Konečná X souřadnice konce úsečky ve světě se Z nahoru. |
| y2 | Real | Konečná Y souřadnice konce úsečky ve světě se Z nahoru. |
| z2 | Real | Konečná Z souřadnice konce úsečky ve světě se Z nahoru. |
| filter | JoltLayer | Array | Real | Struct | undefined | VOLITELNÉ. 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().
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#
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#
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#
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ů.
Související reference#
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 |
|---|---|---|
| jolt_raycast_all | jolt_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. |