IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Dunkleosteus

Hra Dunkleosteus byla programována v jazyce C# a byl přitom použit framework MonoGame.

S původním nastavením frameworku (zejména Pipeline Tool) byly trochu obtíže, viz kupř. toto vlákno na fóru. Poté už však jeho užívání bylo příjemné a poměrně v pohodě.

Kdo zná alespoň trochu objektový C#, tomu MonoGame vychází opravdu hodně vstříc. Opakující se posloupnost Draw() a Update() je navíc poměrně intuitivní a vede k té správné dichotomii uvažování při vytváření her: tj. za prvé, co se děje na straně počítače, za druhé, jak se to reprezentuje hráči.

Myšlenka

Dunkleosteus byl rod pancířnatých ryb ve čtvrtém období paleozoika neboli prvohor. Jednu dobu se o této velké rybě mluvilo dokonce jako o živočichovi s vůbec nejsilnějším stiskem čelistí všech dob... ty časy jsou bohužel pryč a u většiny paleontologů a dalších vědců o tento primát přišel, jakási aureola smělé a mocné ryby, která byla vrcholovým predátorem dlouhé miliony let před prvními dinosaury, mu však zbyla. Proto jsem se mu rozhodl vzdát čest a spojit to se záměrem udělat hru, ve které hráč "letí" doprava a sbírá věci (či se jim vyhýbá), které letí zprava (tady zas trochu inspirací byl level s koberečkem se stařičké hry Aladdin).

Úvodní obrazovka - Zdrojákoviště C# .NET - XNA a MonoGame

Zdroje

Zde uvedu použité zdroje.

Grafika

Všechny sprity jsem našel skrze vyhledávač Googlu se zaškrtnutým hledáním Creative Commons licence. Tím se samozřejmě život vždy zásadně komplikuje, protože máloco dobrého je zdarma. U obrázků není ale tak složitá situace jako u zvuků. Obrázkům jsem pak už poladil víceméně jen barvy a dal jim barevnou auru. Schválně jsem přitom dobré živočichy (tj. ty, které by měl dunkleosteus jíst) dával do barvy zelené a se zelenou září, zatímco nepřátelé mají barvy do červena, fialova či žluta. I v rychlosti tak hráč ví, jestli uhýbat, nebo pronásledovat.

Hudba

Royalty Free hudby je naštěstí na YouTube docela dost a je obvykle povedená. Autoři přitom zpravidla chtějí jen, aby byli uvedeni, což jsem udělal na úvodní obrazovce hry. Celkem jsou ve hře jen dvě skladby: pro úvodní obrazovku a pro zbytek. Záměrně jsem vybral hudbu se zlověstným vyzněním.

Zvuky

Najít zvuky bylo horší. Většina zvukových bank neměla ty, které jsem chtěl, navíc většinou byla vyžadována registrace či rovnou platba. Nakonec posloužil opět prostě YouTube.

Návrh programu

Drtivá většina kódu je v hlavní třídě Hra.cs. Ostatní třídy jsou zejména pro ukládání do výsledkové listiny (viz zdroják na konci článku).

Je asi zbytečné rozepisovat celý koncept, pro to je nejlépe nahlédnout do zdrojáku. Zlatým pravidlem však bylo dělat co nejvíc metod pro zvýšení přehlednosti a udělat metodu na cokoliv, co bych užíval (s obměnami) vícekrát. To je však, řekl bych, zcela základní myšlenka OOP. Velmi šikovné je využívání vlastních definovaných proměnných (enum). Rozhodně to je lepší, než přiřadit jednotlivým stavům něčeho kupř. int a pak si pamatovat (nebo někde psát do komentu), co znamená co. Navíc je to elegantnější v duchu Ockhamovy břitvy: používám datový typ, který má přesně tolik možných hodnot, kolik jich reálně využiju, ne mnohonásobně více.

Taky je třeba si dávat bacha na to, že Update() proběhne 60krát za vteřinu: když kupř. detekujeme stisk nějaké klávesy a hned se nestane něco, po čem by přestala být detekována, tak ji nejspíše detekujeme několikrát. Hráč tedy bude např. chtít přepnout myš klávesou M, ale program ji vyhodnotí jako stisknutou třeba 20krát za sebou. To se dá řešit několika způsoby, z nichž asi nejjednodušší jsou dva: buď detekovat, že nová klávesa nerovná se dřívější klávese, nebo spustit po stisknutí klávesy krátké počítadlo, v jehož intervalu nebude program danou klávesu detekovat. Obojí vyžaduje jednu proměnnou navíc, ale proměnná pro počítadlo se dá obvykle použít na více místech.

Devonský oceán #1 - Zdrojákoviště C# .NET - XNA a MonoGame

Koncepce hry

Zde ukážu koncepci hry.

Pohyb dunkleostea a rychlost hry

Hráč ovládá dunkleostea ve svislém a vodorovném směru. Ve svislém směru je to samotná hra o sobě: hráč prostě uhýbá nahoru a dolů nebezpečným živočichům (žraloci, nautiloidi ad.) a snaží se vstupovat do směru rybkám, které jí (ty mu pak přidávají zdraví, jež je vyjádřeno zelenými srdíčky, a body). Ve vodorovném směru se může dunkleosteus pohybovat jen trochu, nejde zde však o pohyb, ten je jen symbolický, spíše se tímto nastavuje rychlost (a tím pádem i obtížnost) celé hry.

Nepřátelé

Nepřátel i kořisti je více druhů a některé jsou skryté jako easter eggy. Generují se náhodně, ale samozřejmě s různými pravděpodobnostmi. S narůstající úrovni se přitom zvedá obtížnost hry: mimo jiné proto, že se generuje více žraloků různých velikostí, ale třeba i proto, že ti menší žraloci začínají být agresivnější (rychlejší a více jdou směrem, kde je dunkleosteus).

Žraloci jsou také agresivnější, když má dunkleosteus vysoké (zdravá strava) nebo naopak nízké (pach krve) zdraví. Zrada je také v tom, že nautiloidy nebo cefalopodi ubírají víceméně pořád stejně zdraví, ale žraloci tím víc, čím více ho dunkleosteus může mít.

Úroveň

Za jezení rybek či uplavání celých kilometrů získává hráč skóre, z nějž se pak vypočítává jeho level. Ten jednak mění pozadí (a to až do úrovně 30), ale také mění šance na některé události a pro naspawnování určitých živočichů. Rovněž se od levelu počítá maximální možné dunkleosteovo zdraví.

Bonusy

Ve hře jsou též dva sebratelné (sežratelné) bonusy: jeden je turbo ammonite, který dodá rychlostní boost, zatímco druhý je tak trochu easter eggem, pročež jej zde prozrazovat nebudu.

Události

Nemyslím teď události v C#, ale ve hře: občas se spustí tzv. event, při kterém se naspawnuje hodně jedinců jednoho typu nepřátel. Nebezpečnější eventy mají opět menší šanci. Jako jistou míru kompenzace mají žraloci při svém eventu o něco menší poškození.

Plující tečky a řasy

V oceánu také plují dva typy objektů, s nimiž nelze interagovat a jen dokreslují prostředí. Jednak to jsou řasy a za druhé tečky různých barev modré či zelené, které mají navozovat proudění vody. Tyto tečky jsou ve skutečnosti nápisy a jedná se o skutečnou tečku, která se dává za větu či řádovou číslovku.

Devonský oceán #2 - Zdrojákoviště C# .NET - XNA a MonoGame

Ovládání a závěr hry

Zde uvedu ovládání hry.

Výchozí ovládání a bindování kláves

V základu se hra ovládá šipkami. Přidal jsem však možnost si nabindovat vlastní klávesy, samozřejmě s výjimkou těch vyhrazených pro něco jiného.

Myš

Během hry se dá také přepínat mód myši, a to na vypnutý, jen po vertikále a vše. Pohyb myší funguje tak, že co chvíli vrací neviditelný kurzor přímo na dunkleostea. Zároveň však sleduje, jestli není kurzor výše nebo níže než dunkleosteus (popř. více vlevo a vpravo) a ryba pak jde za ním. Když hráč přestane táhnout myší, kurzor se zase vrátí a dunkleosteus se zastaví.

Přepínání zvuků

Danou klávesou se dá též přepínat mód hudby a zvuků, a to na vše, pouze efekty, pouze hudba a nic. Zvláštní efekt, který hraje při začátku eventu, je sice technicky vzato hudbou, ale zde patří ke zvukům.

Zápis do listiny nejlepších

Pokud hráč nahraje alespoň 1000 bodů (žádný strach, to jde rychle), smí se zapsat do listiny. Vstup písmen je ošetřen pomocí metody ToString() na objektu klávesy. Je však třeba si poradit s tím, aby GetPressedKeys(), z čehož je výstup pole, nebylo nulové, ani aby neregistrovalo moc stisků klávesy najednou. Opět nám pomůže buď detekce staré klávesy (ale pozor, hráč může mít v nicku i dvě stejná písmena vedle sebe, což bychom mu měli dovolit), nebo zpomalovací počítadlo.

Listina nejlepších se tradičně serializuje do XML souboru ve složce hry, z níž se zase deserializuje do Listu. XML by se samozřejmě dal editovat, ale zachovejme si víru v lidstvo a věřme, že nikde nebude panovat taková řevnivost ohledně dunkleostea u jednoho počítače, že by se někdo musel uchylovat k takovým podvodům. Ovšemže by jinak šlo dávat výsledky i na server na web.

Devonský oceán #3 - Zdrojákoviště C# .NET - XNA a MonoGame

Jazyk a zdrojáky

Hra je v angličtině, protože jsem původně myslel, že půjde do letní soutěže. Komentáře ve zdrojáku (nedělal jsem jich nakonec moc, když to není soutěžní) jsou ale česky. Zdrojáky dávám sem do zdrojákoviště, pod článkem je pak ke stažení už releasnutá hra, protože solution složka by byla příliš velká (asi o 100 MB).

Hra.cs (nejdůležitější třída s většinou herního kódu)
UlozeniVysled­ku.cs (pro serializaci nového výsledku do XML)
Listina.cs (pro vypsání listiny 25 nejlepších)
Hrac.cs (slouží k zápisu jednoho záznamu do listiny)


Galerie

Hra byla vytvořena v roce 2021.

 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 8x (61.92 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Všechny články v sekci
Zdrojákoviště C# .NET - XNA a MonoGame
Článek pro vás napsal Jakub Raida
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Autor má rád literaturu, dějiny, filmy, počítačové hry, paleontologii, vesmír a programování.
Aktivity