Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

Vytvoření života: Hra života

by
Difficulty:IntermediateLength:LongLanguages:

Czech (Čeština) translation by Tereza Foretová (you can also view the original English article)

Někdy i jednoduché soubor základních pravidel vám může poskytnout velmi zajímavé výsledky. V tomto kurzu si postavíme jádro Conwayův hra života od země.

Poznámka: Ačkoli tento kurz je napsán pomocí jazyka C# a XNA, by mohli používat stejné techniky a pojmy v téměř jakékoliv 2D hra vývojovém prostředí.


Úvod

Conwayův hra život je celulární automat, který byl navržen v roce 1970 britský matematik, jménem John Conway.

Vzhledem k dvojrozměrné mřížky buněk, s "na" nebo "zaživa" a další "vypnuto" nebo "mrtvý" a sadu pravidel, která řídí, jak jsou ožívají, nebo zemřít, můžeme mít zajímavé "forma života" rozvinout přímo u nás. Takže prostě kreslení několik vzorů na naši síť, a poté spuštěním simulace, můžeme sledovat základní formy života vyvíjí, šířit, vymřou a nakonec stabilizace. Stáhněte poslední zdrojové soubory, nebo Podívejte se na ukázku níže:

Nyní, tato "hra života" není striktně "hra" - je to především větší stroj, protože neexistuje žádný hráč a žádný cíl, to prostě se vyvíjí na základě jeho původní podmínky. Nicméně je to hodně legrace hrát s, a existuje mnoho zásad herního designu, který lze použit k jeho vytvoření. Takže bez dalších okolků, pojďme začít!

Pro tento kurz jsem šel dopředu a vše v XNA postavili, protože to je to, co mi nejvíce vyhovuje. (Existuje průvodce Začínáme s XNA zde, pokud máte zájem.) Však měli být schopen sledovat spolu s 2D hra vývojové prostředí, které jste obeznámeni s.


Vytvoření buňky

Základní prvek Conwayův hra života jsou buňky, které jsou "formy života", které tvoří základ celého simulace. Každá buňka může být v jednom ze dvou stavů: "živé" nebo "mrtvé". V zájmu konzistence budeme se držet těchto dvou názvů pro státy buňky pro zbytek tohoto kurzu.

Buňky se nepohybují, jednoduše ovlivnit jejich sousedé na základě jejich aktuálního stavu.

Co se týče programování jejich funkce, jsou tu tři chování, musíme jim dát:

  1. Potřebují k udržení přehledu o jejich pozici, hranice a stav, aby mohli být klikli a vykreslen správně.
  2. Je třeba přepnout mezi životem a smrtí, po klepnutí, který umožňuje uživateli, ve skutečnosti se zajímavé věci dějí.
  3. Potřebují se stanoví jako bílé nebo černé, pokud jsou to mrtvá nebo živá, respektive.

Všechny výše uvedené lze provést vytvořením třídy buňku, která bude obsahovat následující kód:


Mřížky a jeho pravidla

Nyní, že každá buňka bude chovat správně, musíme vytvořit mřížku, která bude držet je všechny a implementovat logiku, která každý z nich řekne, zda by ožil, zůstat naživu, die nebo pobytu mrtvých (žádné zombie!).

Pravidla jsou poměrně jednoduchá:

  1. Všechny živé buňky s méně než dva živé sousedy zemře, jako by příčinou nedostatečného počtu obyvatel.
  2. Veškeré živé buňky se dvěma nebo třemi živé sousedy žije na další generaci.
  3. Všechny živé buňky s více než tři živé sousedy zemře, jako by o přelidnění.
  4. Žádné mrtvé buňky s přesně tři živé sousedy stává živé buňky, jako by reprodukci.

Zde je rychlý vizuální Průvodce těchto pravidel v následujícím obrázku. Odpovídajícím číslem výše uvedené pravidlo ovlivní každé buňky zvýrazněny modrou šipkou. Jinými slovy buňky 1 zemře, buňka 2 zůstane naživu, sekce 3 zemře a buňky 4 ožije.

Tak jako herní simulace spustí aktualizaci na konstantní časové intervaly, mřížka bude kontrolovat každého z těchto pravidel pro všechny buňky v mřížce. To lze dosáhnout tím, že následující kód nové třídy já zavolám mřížky:

Jediné, co jsme chybí zde je kouzlo GetLivingNeighbors metodu, která jednoduše spočítá, kolik z aktuální buňky sousedé jsou v současné době živí. Takže pojďme přidat tuto metodu do mřížky třídy:

Všimněte si, že ve výše uvedeném kódu, první if prohlášení každého páru je jednoduše kontrolovat, že nejsme na okraji mřížky. Kdybychom neměli tuto kontrolu, by narazíme na několik výjimek z překročení hranice pole. Také protože to povede k počítat, nikdy se zvýší, když kontrolujeme za hrany, to znamená, hra "předpokládá", že okraje jsou mrtví, takže je to ekvivalentní s trvalou hranice bílé, mrtvých buněk kolem našich oken.


Aktualizace mřížky v diskrétní čas krocích

Zatím všechny logiky, která jsme implementovali je zdravý, ale to nebude řádně chovat, pokud nebudeme opatrní, ujistěte se, že naše simulace běží v diskrétní čas kroky. Je to jen efektní způsob, jak říct, že všechny naše buňky budou aktualizovány ve stejnou dobu, v zájmu konzistence. Pokud realizujeme neměli to, dostáváme by podivné chování, protože pořadí, ve kterém byly zkontrolovány buňky by na tom záleželo, tak přísná pravidla, jen nastavujeme by se rozpadly a pogromů, zkrácené.

Například naše smyčka nad kontroluje všechny buňky zleva doprava, takže pokud buňku na levé straně, kterou zajistili jsme naživu, to by změnit počet pro buňku uprostřed jsme nyní zkoumají a bude to ožije. Ale kdybychom byli kontrola zprava doleva místo, buňky na pravé straně by mohlo být mrtvý a buňku na levé straně naživu ještě nepřišel, takže naše střední buňky zůstane mrtvá. To je špatné, protože je v rozporu! Bychom měli být schopni kontrolovat buněk v náhodném pořadí, co chceme (jako spirálu!) a dalším krokem by měla být vždy totožné.

Naštěstí to je opravdu docela snadno implementovat v kódu. Vše, co potřebujete, je mít druhé mřížky buněk v paměti pro další stav našeho systému. Pokaždé, když jsme určení dalšího stavu buňky, uložíme jej do naší druhé mřížky pro další stav celého systému. Pak když jsme našli další stav každé buňky, aplikujeme je všechny ve stejnou dobu. Tak můžeme přidat 2D pole logické hodnoty nextCellStates jako soukromé proměnné a pak přidejte tuto metodu třídy mřížky:

Nakonec nezapomeňte opravit výše Update metoda přiřadí výsledek do dalšího stavu, spíše než stávající, pak volání SetNextState na samém konci metody Update, vpravo po dokončení smyčky.


Kreslení tabulky

Teď, dokončili jsme částí složitější tabulky logiky, musíme být schopni kreslit na obrazovku. Mřížka bude čerpat jednotlivé buňky voláním metod jejich kreslení jeden najednou, tak, že všechny živé buňky budou černé, a těch mrtvých bude bílá.

V aktuální mřížce nepotřebuje nic kreslit, ale je to mnohem jasnější, z pohledu uživatele, pokud přidáme některé čáry mřížky. To umožňuje uživateli snadno vidět hranice buněk a také komunikuje pocit z rozsahu, takže pojďme vytvořit metodu kreslení následovně:

Všimněte si, že v kódu výše, jsme brát jeden pixel a strečink, k vytvoření velmi dlouhé a tenké linky. Vaše konkrétní herní engine může poskytnout jednoduchý DrawLine metoda, kde můžete zadat dva body a linií mezi nimi, což by bylo ještě snazší než výše uvedené.


Přidání logiky pro vysoké úrovni hry

V tomto okamžiku máme všechny základní kusy potřebujeme udělat hru spustit, potřebujeme jen, aby to všechno dohromady. Takže pro začátek, ve vaší hře hlavní třídě (ten, který začíná všechno), musíme přidat několik konstant jako rozměry mřížky a framerate (jak rychle to bude aktualizovat), a všechny ostatní věci, které potřebujeme jako jeden pixel obrazu , velikost obrazovky a tak dále.

Musíme také mnoho z těchto věcí, jako je vytvoření mřížky, inicializovat nastavení velikost okna pro hru, a ujistěte se, myš je viditelná, takže klikneme na buňky. Ale všechny tyto věci jsou specifická pro motor a ne příliš zajímavé, takže budeme přeskočit přímo nad ním a dostat do dobré věci. (Samozřejmě, pokud jste postupovali společně v XNA, si můžete stáhnout zdrojový kód získat veškeré podrobnosti.)

Teď, když máme vše nastaveno a připraveno vyrazit, měli bychom jen spustit hru! Ale ne tak rychle, protože existuje problém: nemůžeme opravdu nic dělat protože hra je vždy spuštěn. To je v podstatě nemožné nakreslit určité obrazce, protože jim to rozpadat, kreslení, takže opravdu musíme mít možnost pozastavit hru. Také by nám hezké Pokud bychom mohli zaškrtnutí mřížky, pokud se to stane nepořádek, protože naše výtvory se často přemnoží a zanechávají nepořádek.

Takže pojďme přidat kód, který pokaždé, když stisknete mezerník pozastavit hru a vymazat obrazovku, pokud stisknutí klávesy backspace:

To by také pomoci, pokud jsme zcela jasně najevo, že hra byla pozastavena, tak píšeme naše Draw metody, dodejme nějaký kód na pozadí jít červené, a napsat "Pozastaveno" na pozadí:

To je ono! Vše by nyní mělo pracovat, takže si můžete dát mu víru, čerpat některé formy života a uvidíme co se stane! Jít a prozkoumat zajímavé vzory, které můžete provést odkazem na stránce Wikipedie. Můžete také hrát s framerate, velikosti buňky a mřížka rozměry upravit podle vašich představ.


Přidání vylepšení

V tomto bodě hra je plně funkční a není žádná ostuda označil jej za den. Ale jedna nepříjemnost, kterou jste si možná všimli je, že vaše kliknutí myší vždy neregistrujte se při pokusu aktualizovat buňky, takže když klepněte a táhněte myší přes mřížku nechám tečkovaná čára, spíše než solidní. To je způsobeno rychlost, kterou buňky aktualizovat je také rychlost myši je kontrolovaného, a to je příliš pomalý. Takže jednoduše Musíme oddělit rychlost, jakou hru aktualizuje a rychlost, jakou je čte vstup.

Začněte tím, že definuje frekvenci aktualizací a snímkový kmitočet samostatně v hlavní třídě:

Nyní při inicializaci hru, použijte snímkovou rychlost (FPS) definovat, jak rychle to bude číst myši vstupní a kreslit, což by mělo být pěkné hladké 60 FPS přinejmenším:

Poté přidejte časovač do mřížky třídy, tak, že bude aktualizovat pouze pokud je třeba, nezávisle na snímkový kmitočet:

Teď měli byste být schopni spustit hru na cokoliv rychlost, kterou má, dokonce velmi pomalé 5 aktualizace za sekundu aby mohli pečlivě sledovat vaše simulace odvíjí, přitom byli stále moci čerpat pěkné ladnými křivkami solidní snímkovou rychlostí.


Závěr

Nyní máte hladké a funkční hra života na rukou, ale v případě, že chcete prozkoumat další, vždy existuje další vychytávky, které lze přidat k němu. Například mřížky v současné době předpokládá, že za jeho hrany, vše je mrtvá. Jste může jej upravit tak, aby mřížka obtéká kolem, takže by věčně létat kluzáku! Neexistuje žádný nedostatek variací na tuto populární hru, takže nechte svou fantazii volně běhat.

Díky za čtení, doufám, že jste se dnes naučil pár užitečných věcí!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.