Pomocné skripty

Výbuchy

Jednorázový impulz pro Dynamic rigid bodies, volitelně Character a lokální body Soft Body.

Jednorázové jolt_explosion provede účinek ihned. Konfigurovaný emitter jej provede až při explode().

Syntaxe#

Syntax
jolt_explosion(x, y, z, options=undefined)

Argumenty#

ArgumentTypPopis
xRealWorld-space souřadnice X středu výbuchu.
yRealWorld-space souřadnice Y středu výbuchu.
zRealWorld-space souřadnice Z středu výbuchu.
optionsStruct nebo undefinedVolitelné nastavení síly, tvaru, filtrování a viditelnosti výbuchu.

Options#

FieldVýchozí hodnotaPopis
radius5.0Kladný poloměr ve world units.
strength1000.0Maximální velikost okamžitého impulzu.
directionundefinedVolitelný nenulový směr {x,y,z}, který změní kouli na kužel.
angle90.0Celý úhel kužele ve stupních; platný rozsah je větší než 0 a nejvýše 360.
fallofftrueLineárně násobí impulz výrazem 1 - distance / radius.
occlusionfalsePro každý vhodný cíl ověří paprskem pevnou blokující geometrii.
layersundefinedCílový JoltLayer, pole vrstev nebo číselná maska; neomezuje occlusion blockers.
ignoreundefinedJedno živé zdrojové JoltBody vynechané z overlap i occlusion dotazů.
include_charactersfalseBoolean; přidá CharacterVirtual.
include_soft_bodiesfalseBoolean; lokální reakce volných vertices.
max_delta_velocityundefinedKonečné ≥ 0 m/s; limit přidané rychlosti, ne celkové. 0 nepřidá rychlost.

Chování a pravidla cílů#

  • Rigid: Vzdálenost se měří k native těžišti a impulz se aplikuje právě v něm. Spící těleso se probudí a nevznikne umělý off-centre torque.
  • Rigid: Při vypnutém falloff dostane každé těleso uvnitř radius plný impulz. Strength je impulz, nikoli rychlost, takže těžší tělesa zrychlí méně.
  • Rigid: Direction zapíná filtrování kuželem. Těleso přesně ve středu používá jako stabilní radiální směr veřejnou osu +Z.
  • Rigid: Occlusion provádí jeden synchronní raycast pro každý vhodný cíl. Sensory neblokují; pevná Static nebo Kinematic geometrie může cíl zakrýt, i když není v layers.
  • Rigid: Zásahy child tvarů Compoundu se deduplikují podle native body handle vlastníka.

Návratová hodnota#

FieldTypPopis
affected_countRealPočet těles, která dostala nenulový impulz.
bodiesArray<JoltBody>Zasažené managed body wrappers.
entriesArray<Struct>Jeden záznam {body, distance, factor, impulse} pro každé zasažené těleso.
character_countRealPočet zasažených Characterů.
charactersArray<JoltCharacter>Zasažené postavy.
character_entriesArray<Struct>Údaje o aplikovaných Character impulsech.
soft_vertex_countRealPočet ovlivněných vertices.

Příklad#

GML
var result = jolt_explosion(x, y, z, {
    radius: 8,
    strength: 1200,
    falloff: true,
    occlusion: true,
    layers: [layer_dynamic],
    ignore: grenade_body
});

show_debug_message("Affected bodies: " + string(result.affected_count));

Integrace s aktuálním projektem#

Cíle a lokální reakce#

Rigid větev působí pouze na živá nesenzorová Dynamic tělesa a aplikuje impulz v těžišti. Character a Soft Body jsou opt-in, default false. U Soft Body se účinek vyhodnocuje pro volné vertices uvnitř radiusu; pinned vertices zůstávají přichycené. Occlusion se testuje pro ovlivněné vertices, nikoli jedním paprskem pro celou látku. Platí stejné falloff, cone a filtry.

Konfigurovaný emitter#

GML
explosion = jolt_explosion_create(0, 0, 0, grenade_body);
explosion.set_radius(5);
explosion.set_strength(800);
explosion.set_include_characters(true);
explosion.set_include_soft_bodies(true);
explosion.set_max_delta_velocity(10);
explosion.set_ignore(grenade_body);
var result = explosion.explode();
explosion.destroy();

S owner Body je pozice/rotace lokální; bez owner je světová. Emitter vrací Booleany ze setterů, get_transform vrací transform nebo undefined a explode vrací výsledkový struct i při chybě (prázdný). destroy, zničení vlastníka nebo jolt_stop ukončí platnost. Znovu lze volat explode, dokud je emitter platný. set_layers přijímá živou vrstvu nebo pole vrstev; jednorázové options.layers navíc podporují číselnou masku.

Asset workflow#

GML
explosion = jolt_asset_create_explosion(asset, "explosion", grenade_body);
if (!is_undefined(explosion)) {
    explosion.set_include_characters(true);
    explosion.set_include_soft_bodies(true);
    explosion.explode();
}

Poslední argument je vytvořený živý Body, nikoli načtený asset. Samotné vytvoření body automaticky explozi nespustí. Parametry se předávají stejné centrální funkci. Veřejné názvy jsou include_characters/include_soft_bodies; affect_* nejsou současný zápis.

Emitter API#

MetodaKontrakt
ExplosionEmitter.set_radius(value)Real > 0 m; default 5; max sqrt(FLT_MAX)/4.
ExplosionEmitter.set_strength(value)Real > 0 N·s; default 1000; finite float.
ExplosionEmitter.set_position(x,y,z)Konečné x/y/z typu Real; lokálně s owner / světově bez owner.
ExplosionEmitter.set_rotation(x,y,z,w)Jednotkový XYZW quaternion; abs(délka²−1) ≤ 0.00001; normalizuje se; default identita.
ExplosionEmitter.set_rotation_euler(x,y,z)Konečné Eulerovy úhly ve stupních; převod na quaternion.
ExplosionEmitter.set_direction(x,y,z)Konečný nenulový vektor; normalizuje se a zapne directional=true; počáteční směr +Z.
ExplosionEmitter.set_directional(value)Boolean; default false.
ExplosionEmitter.set_angle(value)Real: celý úhel kužele (0,360] stupňů; default 90.
ExplosionEmitter.set_falloff(value)Boolean; default true.
ExplosionEmitter.set_occlusion(value)Boolean; default false.
ExplosionEmitter.set_include_characters(value) / ExplosionEmitter.set_include_soft_bodies(value)Boolean; default false.
ExplosionEmitter.set_max_delta_velocity(value)undefined = bez limitu; konečné Real ≥ 0 m/s; default undefined.
ExplosionEmitter.set_layers(value)undefined / živá JoltLayer / pole živých vrstev současného světa; kopíruje se, ověří znovu při explode.
ExplosionEmitter.set_ignore(body)undefined / živý Body současného světa; default undefined.
ExplosionEmitter.get_transform()Světový {position:{x,y,z},rotation:{x,y,z,w}}; undefined při neplatném owner/světě/rozsahu.
ExplosionEmitter.is_valid()Boolean; emitter, managed svět a případný owner musí být živé.
ExplosionEmitter.explode()Výsledkový struct popsaný výše i při chybě; znovu ověří owner, ignore a layers.
ExplosionEmitter.destroy()true; opakovaně bezpečné odregistrování emitteru; owner Body nezničí.

Settery vrací true při přijetí hodnoty a false při chybném vstupu; chybu čti ihned přes jolt_get_error(). Nastavení samo neaplikuje sílu. Samotné přijetí setteru není test platnosti emitteru: pro použití musí projít is_valid/get_transform.

Ú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íkSignatura / hodnota
jolt_explosion_createjolt_explosion_create(x,y,z,owner=undefined)