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#
jolt_explosion(x, y, z, options=undefined)Argumenty#
| Argument | Typ | Popis |
|---|---|---|
| x | Real | World-space souřadnice X středu výbuchu. |
| y | Real | World-space souřadnice Y středu výbuchu. |
| z | Real | World-space souřadnice Z středu výbuchu. |
| options | Struct nebo undefined | Volitelné nastavení síly, tvaru, filtrování a viditelnosti výbuchu. |
Options#
| Field | Výchozí hodnota | Popis |
|---|---|---|
| radius | 5.0 | Kladný poloměr ve world units. |
| strength | 1000.0 | Maximální velikost okamžitého impulzu. |
| direction | undefined | Volitelný nenulový směr {x,y,z}, který změní kouli na kužel. |
| angle | 90.0 | Celý úhel kužele ve stupních; platný rozsah je větší než 0 a nejvýše 360. |
| falloff | true | Lineárně násobí impulz výrazem 1 - distance / radius. |
| occlusion | false | Pro každý vhodný cíl ověří paprskem pevnou blokující geometrii. |
| layers | undefined | Cílový JoltLayer, pole vrstev nebo číselná maska; neomezuje occlusion blockers. |
| ignore | undefined | Jedno živé zdrojové JoltBody vynechané z overlap i occlusion dotazů. |
| include_characters | false | Boolean; přidá CharacterVirtual. |
| include_soft_bodies | false | Boolean; lokální reakce volných vertices. |
| max_delta_velocity | undefined | Koneč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#
| Field | Typ | Popis |
|---|---|---|
| affected_count | Real | Počet těles, která dostala nenulový impulz. |
| bodies | Array<JoltBody> | Zasažené managed body wrappers. |
| entries | Array<Struct> | Jeden záznam {body, distance, factor, impulse} pro každé zasažené těleso. |
| character_count | Real | Počet zasažených Characterů. |
| characters | Array<JoltCharacter> | Zasažené postavy. |
| character_entries | Array<Struct> | Údaje o aplikovaných Character impulsech. |
| soft_vertex_count | Real | Počet ovlivněných vertices. |
Příklad#
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#
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#
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#
| Metoda | Kontrakt |
|---|---|
| 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ík | Signatura / hodnota |
|---|---|
| jolt_explosion_create | jolt_explosion_create(x,y,z,owner=undefined) |