A je tu druhá část článku o mé diagnóze. Po půl roce už bylo na čase... Dnes vám nejdříve vysvětlím, proč jsem pozastavil vývoj nové Elfánie a pak vám popíši první zkušenosti s C++ při programování mé geometrické knihovny. A na závěr se dozvíte, co mě a SuperMartase vedlo k rozhodnutí začít vyvíjet nový společný projekt.
O tom jsem už vlastně jednou psal ve článku Víčkovy červené měsíce 2014, ale napíšu to ještě jednou a možná podrobněji.
Abych pravdu řekl, o nové verzi Elfánie jsem začal pochybovat už na začátku minulého léta, kdy jsem lehce nabyl a následně lehce pozbyl grafika. Nebyl to nikdo jiný, než Lukáš Hörmann, který už dělal některé obrázky pro starou Elfánii po tom, co mi dal košem předchozí grafik (jak vidíte, s grafiky to není vůbec jednoduché...). Jeho důvody chápu - žádnou odměnu za jeho práci jsem mu hned dát nemohl (protože sám mám málo) a příslib podílu z možného výdělku, až by byla Elfánie hotová, mu nestačil.
Pro mě to ale znamenalo, že jsem na tom byl ještě hůř, než jsem byl předtím. Předtím jsem měl alespoň šanci, že by mi mohl dělat grafiku, potom jsem už neměl nic. A myšlenka, že bych byl nucen vydat novou Elfánii v podobě, v jaké je teď, se mi opravdu příčila. Takže asi chápete, že moje motivace pro pokračování ve vývoji klesla.
Samozřejmě to nebyla jediná věc. Než jsem začal s vývojem nové verze, měl jsem určitou vizi, jak by nová verze mohla vypadat. Ovšem když jsem pak jednotlivé věci začal programovat, zjistil jsem, že zdaleka nejsou tak super, jak jsem si představoval. To se týká například výcviku nebo lovu. To, co jsem původně bral jako zpestření, mi nakonec začalo připadat, jako zbytečná složitost.
Navíc mi bylo jasné, že i když nová Elfánie přebijí tu starou ve všech ohledech, zvlášť těch programátorských, tak jsem věděl, že to není právě to, čeho bych chtěl dosáhnout jako programátor. Jednoduše mám vyšší cíle, než je prohlížečová hra.
Mám jasno v tom, jaký druh softwaru bych chtěl programovat - hry. A to z jednoduchého důvodu - obecně programy jsou hlavně na práci, ale hry... hry jsou pro zábavu a zábava mi přijde lepší, než práce. Navíc se u her můžu jako programátor pořádně vyblbnout. U programů většinou ne - prostě tam naplácám pár tlačítek a provážu je událostmi... No a pořádné hry nejsou psané v HTML, nebo C#, ale v C++, aby mohli využít výkon počítače naplno. Samozřejmě třeba assembler by na tom byl po výkonnové stránce mnohem líp, ale ten narozdíl od C++ nedopřává programátorům takový komfort.
Když jsem se rozhodl začít psát Geometrii v C++, tak jsem si řekl, že udělám ve svém programování zásadní změnu - začnu už konečně programovat anglicky. Už jsem to praktikoval u placeného programování, ale do této doby jsem u vlastního stále používal češtinu. Důvodů je hned několik. Za prvé se stává kód čitelný pro většinu zeměkoule, takže případná budoucí spolupráce s kýmkoliv by byla bez problému. Za druhé je angličtina mnohdy praktičtější, například krásná slovíčka get a set. Za třetí to vypadá líp, než když je kombinovaná angličtina s češtinou (klíčová slova a knihovny vs můj kód). A za čtvrté se alespoň zlepším v angličtině, protože když budu chtít použít neznámá slovíčka, tak si je budu hledat.
Programování šlo po pochopení C++ prototypů docela hladce, ale čím dál víc mi začínala chybět jedna věc, kterou jsem měl u JavaScriptu, a to grafický výstup, na kterém bych mohl Geometry kontrolovat. Bylo tedy zapotřebí zvolit si nějaké grafické rozhraní a začít ho používat. Rozhodl jsem se pro OpenGL a to hned ze dvou důvodů - je multiplatformní (takže už nebudu vyvíjet pouze na Windows) a umí i 3D (ano, s tím mám určité plány ☺). Ale grafické rozhraní není všechno - moderní operační systémy po mě chtějí, abych si svůj program kreslil v okně. Rozhodl jsem se pro dočasné řešení v podobě miniknihovny GLUT, která nedělá nic jiného, než že vytváří okno pro OpenGL. Až budu programovat naostro, plánuji použít knihovnu SDL, která také používá pro 3D OpenGL a je také multiplatformní (GLUT koneckonců také).
No a to se už dostáváme ke screenshotu, který už nějaký ten pátek visí na mém webu:
Vpravo se generují náhodné přímky/polopřímky/úsečky a počítají se jejich průniky, vlevo je potom test mé nové třídy Color. Není to kolo, jak se může na první pohled zdát, ale je to mnoho různěbarevných úseček nahuštěných k sobě tak, že to tvoří jeden tvar. Jelikož nepoužívám vyhlazování a je to tedy jak z Malování, úsečky hezky splývají dohromady.
Mimo programování Geometry jsem si začal bokem programovat vlastní knihovnu, kde jsem měl základní třídy jako List, String apod. Tyto třídy jsem si chtěl už dávno naprogramovat, ale bylo to doposud zbytečné, protože vždy byly součástí jazyka. C++ je sice také má (std::vector a std::string), ale nejsou součástí jazyka, takže není problém, když si je někdo naprogramuje podle sebe. A já mám rád věci, které jsou přesně takové, jaké je chci mít já. Navíc když tu byla ta chuť si to naprogramovat...
Asi měsíc jsem si myslel, že opravdu začnu v C++ programovat Lojzika. Hodně jsem o něm uvažoval, hlavně o pohybu, který by Geometry řešila. Dokonce jsem se už dohadoval s grafikem. Ano, opět s Lukášem. Jenže Lojzik nemá to, kvůli čemu jsem programoval Elfánii. Novou Elfánii jsem začal dělat proto, abych měl dobrý pocit ze zpětné vazby. Jenže u prvního Lojzika nebyla skoro žádná - důvody jsou jasné, už jsem o nich párkrát psal.
A tak jsem se zbláznil a vtáhnul jsem do toho i SuperMartase, který z toho bohužel před měsícem vylezl, a tak jsem na to zůstal sám. Ale ani tak se nevzdávám a snad to nějak dopadne.
O co přesně se jedná vám ani teď neprozradím. Bude se jednat o hru, bude v C++ a bude 3D. Tyto indicie jste již mohli najít v tomto nebo v předchozím článku.
Mám z tohoto projektu velmi dobrý pocit, lepší než z Elfánie, a myslím si, že by mohl mít úspěch. Je to taková snaha si splnit vlastní programátorský sen. Tak snad se to povede... I když vývoj bude trvat hodně dlouho, zvlášť, když jsem na to zůstal sám...
V poslední části tohoto článku vám něco povím o tzv. SVUtils, proč jsem to programoval, co s tím plánuji, a také, proč se to už SVUtils nejmenuje... A dostanu se až k tomu, jak to vypadá s vývojem k dnešnímu dni. Doufejme, že to nebude za další půlrok...
No podle mě Lojzik není moc dobře programátorsky zpracovaný... Určitě to bude velký posun v programové stránce a rozhodně i v hratelnosti. Ale grafika... Jsem programátor, ne grafik... Grafika není pro mne v tuto chvíli prioritou... Osobně dávám přednost především použitelnosti/hratelnosti, než grafice. K čemu je nablýskaná skořápka, když vevnitř nic není? Sice plánuju, že bych si s grafikou vyhrál, ale v první verzi to rozhodně neočekávejte - prostě nejdřív hratelnost a pak se může zkrášlovat... Nebude to jako u Lojzika, kde jsem vydal první verzi a konec. Tuto hru budu postupně vylepšovat obdobně jako Elfánii a doufám, že mi to vydrží mnohem déle. Takže ze začátku se budu zaměřovat na to podstatné, o co ve hrách jde - tedy o hratelnost, a pak, jestli zbude čas, to můžu vymalovat. Sice jsem dohodnutej i s grafikem, ale jak to dopadne závisí na mnoha faktorech - např. jestli se mi tam ta grafika vůbec podaří naimplementovat, aby neudělala víc škody, než užitku. A taky se na mě může grafik zase vybodnout...
Doufám, že hra ti vyjde a půjde o posun od Lojzíka, který byl sice dobře programátorsky zpracovaný, ale grafika byla příšerná
Toto mi asi nerozmluvíš Jsem si vědom toho, že tím exe soubor nabobtná a že něco bude pomalejší - ale zase na druhou stranu budou mít moje implementace více možností. Knihovnu Boost taky musel někdo naprogramovat, já zase naprogramuji svojí knihovnu Toto programování mě naučilo hodně z jazyka a myslím, že kdybych místo toho programoval nějaký konkrétní program, tak bych toho neuměl ani polovinu.
Co je opravdu blbost je přeprogramovávat funkce z Céčkové knihovny, protože ty jsou napsané v assembleru. Ale co se týká C++ knihovny - tam je toho spoustu v hlavičkových souborech, protože se jedná o šablony. A to je i případ std::vector nebo std::string. No a pak je jedno, jestli použiju hlavičku std, nebo vlastní... U vlastní si alespoň můžu přizpůsobit chování podle sebe. Konkrétně kontejnery včetně stringu budou větší a pravděpodobně i pomalejší, než ty z std, ale na druhou stranu budou mít funkčnost, o které se mi u std nemůže ani zdát. Podrobněji o tom napíšu v příštím článku.
Kontejnery ještě nemám hotové, takže nemůžu mluvit konkrétně o tom, jak to dopadlo. Ale to není jediné, co jsem si sám naimplementoval. Mimo jiné jsem např. udělal také svoji verzi std::function. Zkusil jsem si u ní rychlostní test a když jsem to porovnal s std (u kompilátoru GCC), tak mi spadla čelist. Moje implementace je cca 3x rychlejší, než ta u std. A to moje implementace umí vše, co std, plus něco navíc.
Co se týká otestovanosti, tak to je u mé knihovny problém... Ale píšu si testy a snažím se to co nejvíc vychytat. Když objevím nějaký bug, tak se nepohnu z místa, dokud ho nevyřeším. Ne jako někteří programátoři, kteří je přehlížejí... Nebo je prohlásí za vlastnost
Doporučil bych Ti nevymyslet blbosti a používat standardní knihovny. Jsou o hodně rychlejší, otestované, mají hodně vychytanych funkcí. Výsledná binarka bude menší a obecně je to naprosto špatně znovu implementovat standardní knihovnu - když ji použiješ, usetris sobe a uživatelům tvých aplikací hodně nervů.
Implementovat string nebo vector je fajn, ale je lepší to nechat v šuplíku - na reálné použití se to prostě nehodí.
Pokud potřebuješ víc funkcí - doporučuji knihovnu Boost.