JetPack sršící oheň a šplouchání vody - GM Particles
Vytvoříme si jednoduchou hru s použitím částicových efektů.
Nastínění hry: Létající panáček s JetPackem (raketový batůžek ->
sršící plameny z trysek) nad mořem. Pokud spadne do moře - voda šplouchne
do stran.
Sprity si můžete tvořit vlastní nebo použít tyto (nacházejí se ve
složce GM - podsložka Sprites)
![]() |
![]() |
![]() |
![]() |
spr_character | spr_splash | spr_water_top | water_tile |
Nejprve je tedy přidáme (poslední water_tile přidáme jako pozadí - bude použit jako tile). Voda bude animace - takže ji přidáme pomocí EditSprite/File/CreateFromStrip zvolíme spr_water_top.png do počtu obrázků (number of images a images per row) napíšeme 12 a rozměry zvolíme 24x24
- U spr_character odškrtneme precise collision checking a zaškrtneme separate collision masks -> lepší kolize
- U spr_water_top uděláme totéž a změníme masku na tvar obdélníku (rectangle) zvolíme manuální nastavení a posuneme ji od shora (top) o 10px (aby panaáček až spadne do vody byl kousek zanořen v ní.
- U spr_splash vystředíme Origin
Vytvoříme objekt obj_water_top přiřadíme mu příslušný sprite a zaškrtneme solid.
Nyní vytvoříme obj_character přiřadíme mu sprite postavičky a hloubku (depth) nastavíme na 1 (aby až spadne do vody byl jakoby v ní).
- Vytvoříme Create event
- Set gravity - postavička bude přitahována gravitací o síle 0.5 směrem k zemi 270 když ji jetpack vynese do vzduchu tak aby samovolně padala k zemi
- Do Step eventu přidáme ošetření aby se postavička
padající k zemi nezrychlila na příliš vysokou rychlost
- Pomocí Test variable zadáme podmínku pokud je hodnota proměnné vspeed větší než 10 tak nastavíme vspeed na 10 (nebude padat rychleji než 10px/s)
- Kolize s obj_water_top
- Přidáme Move to contact pro lepší kolizi. Nastavíme direction na 270 zbytek necháme.
- A nastavíme vertikální i horizontální rychlost na 0
- Do události pro šipku vlevo přidáme opět kontrolu rychlosti, tentokrát proměnné hspeed větší než -5 a horizontální rychlost budeme relativně odečítat o hodnotu -0.5
- Šipka vpravo bude obsahovat to samé s tím rozdílem, že kontrola bude hspeed < 5 a k horizontální rychlosti se bude relativně přičítat 0.5
- V události pro šipku nahoru budeme relativně odečítat -1 od současné hodnoty vspeed pokud je její hodnota větší než -10 (aby zase nelítal moc rychle)
- Vytvoříme si místnost (pro lepší umísťování objektů zvolíme
snap/mřížku o velikosi 24x24) přidáme do ní vodu a umístíme někam
kousek před kolizní místo panáčka. Při přidávání tilů vody pod
hladinou v záložce tiles zvolíme Add a nastavíme hloubku
vrstvy na 0 (chceme aby byl panáček ve vodě (za vodou) a například plameny
jetpacku, které za chvilku vytvoříme by mohli vyčuhovat)
Hru spusťte
Panáček nyní nádherně létá ve vzduchu. Můžete si však všimnout nedostatku, že když zatočíte vpravo/vlevo, že udržuje stále stejnou rychlost. To vyřešíme přidáním tření (friction) s hodnotou 0.1 do eventu Create A přidáme event Outside room do nějž vložíme Warp screen s parametrem horizontal
Nyní to vše konečně obohatíme o částicové efekty.
- Do create eventu doplníme následující
- Vytvoříme částicový systém - hloubku nastavíme na 1 aby plamen byl za vodou
- Vytvoříme novou částici
- Tvar explosion
- min a max velikost 0.02 se size increment 0.05 (jako při startu rakety z malé trysky srší velký oheň)
- Barvu zvolíme changing od žluté po oranžovou s počátační alfou 1 a koncovou 0
- Životnost nastavíme 5-10 (aby plamen nebyl moc dlouhý)
- A pohyb
- rychlost od 1-3
- směr 270 (dolů)
- Upravíme událost pro šipku nahoru
- Vytvoříme zde dva emittery (type0, type1)
- první pro první trysku (ona je to ruka u toho panáčka ale my si
představujeme jetpack
) když si otevřete sprite a klepnete na trysku zobrazí se vám souřadnice bodu
- při použití výchozího spritu jsou pro první trysku souřadnice x+4 a y+20 a pro druhou x+28 a y+20
- přidáme 2x burst from emitter (jednou z prvního emitteru poté s druhého - obě trysky) s hodnotami 16)
- první pro první trysku (ona je to ruka u toho panáčka ale my si
představujeme jetpack
- Vytvoříme zde dva emittery (type0, type1)
Hru spustíme a vychutnáme si nádherný efekt.
Teď ještě pro úplnou dokonalost přidáme
šplouchnutí vody do stran, když na ni panáček z výšky spadne.
- V create eventu vytvoříme další částici (type1)
- kde místo tvaru použijeme sprite kapky vody
- min velikost 1 maximální 0.5
- životnost 5-8
- u barvy zvolíme počáteční alfa průhlednost na 1 a koncovou na 0
- rychlost 8-12 směr 50-130
- s gravitací o velikosti 2 směrem k zemi (270)
- Do kolize s obj_water_top přidáme vytvoření emitteru
(emitter2) na souřadnicích zhruba mezinoží (u našeho panáčka x+16, y+35)
- od středu šplouhne do stran
- burst částice type1 z emitteru2 počet 20
Pokud hru spustíme zjistíme hned nedostatek -> chceme aby voda šplouchnula při kolizi jen jednou a né stále.
To ošetříme jednoduchou podmínkou.
- V create eventu vytvořte proměnnou např. can_splash a dejte jí hodnotu 0 (na začátku když stojí ve vodě nešplouchne)
- Do kolize vložte podmínku pomocí kontroly hodnoty proměnné if can_splash == 1 tak se provede vytvoření emitteru, vytvoří se efekt šplouchnutí a proměnná can_splash se nastaví na 0
- V události šipka nahoru pak hodnotu proměnné can_splash nastavíme zase na 1
Kód GML pro obj_character by mohl mít následující podobu:
//create event gravity = 0.5; gravity_direction = 270; friction = 0.1; psyst = part_system_create(); part_system_depth(psyst,1); part0 = part_type_create(); part_type_shape(part0, pt_shape_explosion); part_type_size(part0, 0.02, 0.02, 0.05, 0); part_type_color2(part0, c_yellow, c_orange); part_type_alpha2(part0, 1, 0); part_type_life(part0, 5, 10); part_type_speed(part0, 1, 3, 0, 0); part_type_direction(part0, 270, 270, 0, 0); part1 = part_type_create(); part_type_sprite(part1, spr_splash, 0, 0, 0); part_type_size(part1, 1, 0.5, 0, 0); part_type_life(part1, 5, 8); part_type_alpha2(part1, 1, 0); part_type_speed(part1,8, 12, 0, 0); part_type_direction(part1, 50, 130, 0, 0); part_type_gravity(part1, 2, 270); can_splash = 0; //step event if (vspeed > 10) vspeed = 10; //collision with obj_water_top move_contact_solid(270, -1); hspeed = 0; vspeed = 0; if (can_splash == 1) { emitter2 = part_emitter_create(psyst); part_emitter_region(psyst, emitter2, x+16, x+16, y+35, y+35, ps_shape_rectangle, ps_distr_linear); part_emitter_burst(psyst, emitter2, part1, 20); can_splash = 0; } //keyboard left if (hspeed > -5) hspeed-=0.5; //keyboard right if (hspeed < 5) hspeed += 0.5; //keyboard up if (vspeed > -10) vspeed -= 1; emitter0 = part_emitter_create(psyst); part_emitter_region(psyst, emitter0, x+4, x+4, y+20, y+20, ps_shape_rectangle, ps_distr_linear); emitter1 = part_emitter_create(psyst); part_emitter_region(psyst, emitter1, x+28, x+28, y+20, y+20, ps_shape_rectangle, ps_distr_linear); part_emitter_burst(psyst, emitter0, part0, 16); part_emitter_burst(psyst, emitter1, part0, 16); can_splash = 1; //outside room move_wrap(1, 0, 0);

Nyní je hra dokončena Ke
stažení přikládám zdrojový kód a použité sprity.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 399x (12.49 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker