JetPack sršící oheň a šplouchání vody - GM Particles

Ostatní jazyky GameMaker Efekty 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/Fi­le/CreateFrom­Strip 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 :D) 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)

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ženo 387x (12.49 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Celkem (2 hlasů) :
4.54.54.54.54.5


 


Miniatura
Všechny články v sekci
GameMaker - Efekty
Miniatura
Následující článek
Zničitelný terén pomocí surface

 

 

Komentáře

Avatar
ondrej.podrouzek:

jak že byl ten scripts mam windows 8 a tam to nejede

 
Odpovědět 7.7.2015 10:28
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.