Particle Wars

Particle Wars

Download: particle_wars0.8b

Tento projekt bol odovzdaný ako projekt na predmet Programovanie v 1. ročníku v roku 2010. Je napísaný v Object Pascale za pomoci free-ware nástroja Lazarus.

Základy

Ide o hru, ktorú môžu hrať až štyria hráči na jednej klávesnici. Je to hra založená na jednoduchom modeli časticového systému. V krabici (hracie okno) poletujú objekty (hráči, kruhy, obdĺžniky). Všetko sa navzájom od seba odráža. Hráči majú na výber zbrane:

  • Pištol: strieľa často, ale pomaly a málo uberá
  • Rifle: dlho sa dobíja, strieľa extrémne rýchlo a uberá veľa
  • Gravity gun: vystrelí náboj, ten sa po pár sekundách premení na čiernu dieru a všetko do seba stiahne
  • Obstacle gun: vystrelí rýchly náboj, ktorý sa premení na prekážku

Prvé dve slúžia na uberanie, druhé dve na zvyšovanie miery chaosu.

Objekty (prekážky) sa dajú ničiť, ich farba signalizuje ako na tom sú. Počet životov je daný v závislosti od plochy objektu lineárne. Za zničenie objektu sa nedáva žiadny bonus.

Výbuchy sú simulované pomocou častíc. Po dotyku častice výbuchu je vám ubraných konštantný počet životov. Takže zásahy mierené do stredu hráča sú ničivejšie.

Screenshot of Particle Wars
Particle Wars shooting

Nastavenia

Je možné si nastaviť prakticky hocičo. Zrýchlenie jednotlivých hráčov, rýchlosť ich otáčania, farbu a meno. V súboroch priložených k projektom nájdete aj textové súbory popisujúce zbrane (ich rýchlosť, silu, čas prebíjania, čo robia, a koľko vás odstrčia do zadu) a súbor popisujúci ovládanie hráčov.

Particle Wars options
Particle Wars options

Ostatné

Aby nedošlo k energetickému preťaženiu systému, tak je implementované konštantné trenie (relatívne). Takisto aby to nebolo monotónne, tak progress-bar vpravo dole ukazuje, že kedy sa pridá náhodne nový objekt. Občas sa stane, že kolízny systém zlyhá, v tom prípade môžete sledovať, ako sa dva spojené objekty pohybujú slušnou rýchlosťou po obrázku. Malo by to trvať len pár sekúnd.

Do budúcna

V letnom semestri by som chcel doladiť konštanty, prípadne pridať nové zbrane a objekty. Časticový systém je vytvorený veľmi flexibilne za pomoci virtuálnych tried na popis každej zmeny.

Akýkoľvek feedback k tejto hre veľmi uvítam (hlavne ohľadom dolaďovania konštánt a nápadov na oživenie hry). Prosím píšte ho do komentárov. Keby niekto chcel zdrojový kód, môžem mu ho poskytnúť.

Particle Wars
Particle Wars

Particle System

Download source code with .exe file for Lazarus project

Komentár

Ja len pár slov o tomto mojom časticovom systéme. Keby mal niekto záujem, tak kľudne o tom napíšem viac. V zdrojových kódoch je pomerne veľa komentárov, ktoré popisujú význam jednotlivých tried. Pre neznalých, časticový systém sa skladá z množstva (tisíc až milión väčšinou) častíc. Každá z nich má nejaké atribúty (väčšinou pozícia, smer a rýchlosť (v jednom), farba… ). Najdôležitejšou časťou je, že ich môžem ovplyvňovať (alternation). To znamená, že jednej častici napríklad poviem, že nech priťahuje ostatné, alebo nech sa odráža od iných, alebo po 5 sekundách zomri. Podobne silnejšie konštrukcie, ako: poslednú sekundu si nič nerobil a som zelený, tak sa posuň a zmeň sa na modrého.

Úvod

V prvom rade som sa žiadnym iným neinšpiroval systémom. Za najdôležitejšie som považoval to, že nech je systém veľmi variabilný (flexibilný). To vyžadovalo niekoľko hodinový návrh predtým, ako som napísal prvé riadky kódu (aj tak sa tam našlo zopár chýb). Základom môjho systému je asi šesť tried:

  • TParticle obsahuje údaje (pozícia, rýchlosť (vektor), váha, farba, tvar), plus zoznam TAlternation (veci, ktoré ho ovplyvňujú)
  • TGroup je zoznam TParticlov. Hlavnou TGroup je PS (ParticleSystem). PS je špeciálna trieda, automaticky sa tam pridavajú všetky nové TParticle. TGroupe je možné povedať, nech sa modifikujú (Za pomoci TAlternation) všetky Particle v nej. Pokiaľ si dobre pamätám, tak TGroup musia spĺňať stromovú štruktúru.
  • TAlternation je základ všetkého. Spôsobuje ľubovolnú zmenu na TParticle, alebo na všetkých TParticle v nejakej TGroup. Skladá sa z nasledujúcich troch virtuálnych tried (ktoré majú mnoho modifikácií).
  • TBoolFunction je trieda na vyhodnocovanie logických (booleovských) výrazov. Je to trieda preto, aby si mohla pamätať nejaké informácie. Jediná dôležitá metóda objektu je Evaluate. V TAlternation slúži nato, aby keď nastane nejaký stav (Evaluate vráti true) tak sa mohol vykonať zvyšok TAlternation. Triedy TBoolAnd, TBoolOr umožňujú skladať podmienky. Keďže každá funkcia sa dá rozložiť na DNF (disjunktívna normálna forma), tak mi tieto dve skladacie funkcie stačia.
  • TParticleSelector popisuje, aké TParticle majú byť ovplyvnené zmenou. Špeciálne TSelectorStaticBoolFn vie získavať TParticle podľa toho, či spĺňajú podmienku nejakej TBoolFunction. Static v mene triedy znamená, že v jednom frame-e sa už nevyhodnocuje znova (pamätá si získané TParticle).
  • TChange je hlavnou triedou systému. Bez nej by sa prakticky nič nedialo. Popisuje zmenu, ktorá sa má vykonať. Hlavnou metódou je Apply, ktorá má za parametre, že kto tú zmenu vyvolal a na koho sa má aplikovať. Plus čas (sila) tej aplikácie. Tj. koľko času uplynulo od posledného vyhodnocovania.

Ako ho využívať

Možno vás predošlí pokec trocha odradil, aby som demonštroval silu systému (modifikovateľnosť) tak opíšem nasledujúci kód:

g_exp.AddAlternation(TAlternation.Create(
TBoolTrue.Create,
TSelectorStaticBoolFn.Create(TBoolColIndex.Create(1), TBoolCollision.Create),
TChangeDamage.Create(1, true, false),
TChangeEmit.Create(TParticleEmitorBlood.Create(g_killing)),
TChangeKill.Create(false, true)
));

Do TGroup g_exp pridaj nasledujúcu zmenu:
-ak je pravda (takže vždy)
-tak vyber také dvojice partiklov, že jeden má odrazový index 1 (tj. sa odráža) a tá dvojica navzájom koliduje (tj. prvý parameter je čo musí spĺňať jeden z nich a druhý čo obaja).
–tak uber prvému jeden život
–pridaj krv do TGroup takej, čo uberá každému život (tj. po čase krv automaticky zanikne)
–zabi druhý partikel

Kód je vystrihnutý z hry Particle Wars, ktorú som programoval do školy ako semestrálny projekt.

Leave a Reply

Your email address will not be published. Required fields are marked *