DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle

"Viem, že nič neviem." Sokrates

Pre koho: pre IT ľudí, ktorí sa nestarajú o všetkých vývojárov a chcú hrať ich hry!

O čom: o tom, ako začať písať hry v C/C++, ak to zrazu potrebujete!

Prečo by ste si mali prečítať toto: Vývoj aplikácií nie je moja odborná oblasť, ale snažím sa kódovať každý týždeň. Pretože milujem hry!

Ahoj volám sa Andrej Grankin, Som DevOps v Luxofte. Vývoj aplikácií nie je mojou pracovnou špecializáciou, ale snažím sa kódovať každý týždeň. Pretože milujem hry!

Odvetvie počítačových hier je obrovské, dnes sa o ňom hovorí ešte viac ako o filmovom priemysle. Hry sa píšu od začiatku vývoja počítačov, pričom podľa moderných štandardov sa používajú zložité a základné metódy vývoja. Postupom času sa začali objavovať herné enginy s už naprogramovanou grafikou, fyzikou a zvukom. Umožňujú vám sústrediť sa na vývoj samotnej hry a netrápiť sa nad jej základmi. Ale spolu s nimi, s motormi, vývojári "slepia" a degradujú. Samotná výroba hier je umiestnená na dopravníku. A kvantita produkcie začína prevládať nad jej kvalitou.

Zároveň sme pri hraní cudzích hier neustále limitovaní lokalitami, zápletkou, postavami a hernými mechanizmami, ktoré vymysleli iní ľudia. Tak som si uvedomil, že...

... nadišiel čas vytvoriť si vlastné svety, ktoré sú podriadené len mne. Svety, kde som Otec, Syn a Duch Svätý!

A úprimne verím, že keď si napíšete svoj vlastný herný engine a budete na ňom hrať, budete si môcť vyzuť topánky, utrieť okná a vylepšiť svoju kabínu a stať sa skúsenejším a kompletnejším programátorom.

V tomto článku sa vám pokúsim priblížiť, ako som začal písať malé hry v C/C++, aký je proces vývoja a kde si nájdem čas na hobby v rušnom prostredí. Je subjektívny a popisuje proces individuálneho štartu. Materiál o nevedomosti a viere, o mojom osobnom obraze súčasného sveta. Inými slovami, "Administratíva nie je zodpovedná za vaše osobné mozgy!"

Prax

"Vedomosti bez praxe sú zbytočné, prax bez vedomostí je nebezpečná." Konfucius

Môj notebook je môj život!


V praxi teda môžem povedať, že u mňa všetko začína poznámkovým blokom. Nielenže si tam zapisujem každodenné úlohy, ale aj kreslím, programujem, navrhujem vývojové diagramy a riešim úlohy vrátane matematických. Vždy používajte poznámkový blok a píšte len ceruzkou. Je to čisté, pohodlné a spoľahlivé, IMHO.

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Môj (už plný) zápisník. Takto to vyzerá. Obsahuje každodenné úlohy, nápady, nákresy, schémy, riešenia, čierne účtovníctvo, kód a pod

V tejto fáze sa mi podarilo dokončiť tri projekty (v mojom chápaní to znamená „úplnosť“, pretože akýkoľvek produkt sa dá vyvíjať relatívne donekonečna).

  • Projekt 0: Toto je 3D Architect Demo scéna napísaná v C# pomocou herného enginu Unity. Pre platformy macOS a Windows.
  • Hra 1: konzolová hra Simple Snake (všetci známa ako „Snake“) pre Windows. Napísané v C.
  • Hra 2: konzolová hra Crazy Tanks (všetci známa ako „Tanks“) napísaná v C++ (pomocou tried) a tiež pre Windows.

Projekt 0. Architekt Demo

  • platforma: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Jazyk: C#
  • Herný engine: Jednota
  • inšpirácia: Darrin Lile
  • Úložisko: GitHub

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Ukážka 3D scénického architekta

Prvý projekt nebol implementovaný v C/C++, ale v C# pomocou herného enginu Unity. Tento engine nebol tak náročný na hardvér ako Unreal Engine, a tiež sa zdalo jednoduchšie nainštalovať a používať. O iných motoroch som neuvažoval.

Cieľom v Unity pre mňa nebolo vyvinúť nejakú hru. Chcel som vytvoriť 3D scénu s nejakou postavou. On, alebo skôr Ona (modeloval som dievča, do ktorého som bol zamilovaný =) sa musel hýbať a interagovať s okolitým svetom. Dôležité bolo len pochopiť, čo je Unity, čo je proces vývoja a koľko úsilia je potrebné na vytvorenie niečoho. Tak sa zrodil projekt Architect Demo (názov bol vymyslený skoro z hovadín). Programovanie, modelovanie, animácia, textúrovanie mi trvalo asi dva mesiace každodennej práce.

Začal som s výukovými videami na YouTube o vytváraní 3D modelov v Mixér. Blender je skvelý bezplatný nástroj na 3D modelovanie (a ďalšie), ktorý nevyžaduje inštaláciu. A tu ma čakal šok ... Ukazuje sa, že modelovanie, animácia, textúrovanie sú obrovské samostatné témy, o ktorých môžete písať knihy. To platí najmä pre postavy. Na modelovanie prstov, zubov, očí a iných častí tela budete potrebovať znalosti anatómie. Ako sú tvárové svaly štruktúrované? Ako sa ľudia pohybujú? Musel som „vložiť“ kosti do každej ruky, nohy, prsta, falangy prstov!

Vymodelujte kľúčne kosti a ďalšie pákové kosti, aby animácia vyzerala prirodzene. Po takýchto lekciách si uvedomíte, koľko práce robia tvorcovia animovaných filmov, len aby vytvorili 30 sekundové video. Ale 3D filmy trvajú hodiny! A potom odídeme z kín a povieme niečo ako: „To je hnusná karikatúra/film! Mohli to urobiť lepšie...“ Blázni!

A ešte jedna vec týkajúca sa programovania v tomto projekte. Ako sa ukázalo, najzaujímavejšia bola pre mňa tá matematická. Ak spustíte scénu (odkaz na úložisko v popise projektu), všimnete si, že kamera rotuje okolo dievčenskej postavy v gule. Aby som naprogramoval takúto rotáciu kamery, musel som najprv vypočítať súradnice bodu polohy na kružnici (2D), a potom na gule (3D). Vtipné je, že matematiku som v škole nenávidel a vedel som ju s C-mínusom. Čiastočne pravdepodobne preto, že v škole vám jednoducho nevysvetlia, ako sa táto matematika do pekla používa v živote. Ale keď si posadnutý svojim cieľom, tvojím snom, tvojou mysľou sa vyčistí a otvorí sa! A náročné úlohy začnete vnímať ako vzrušujúce dobrodružstvo. A potom si pomyslíte: „No, prečo by vám váš *obľúbený* matematik nemohol normálne povedať, kde sa dajú tieto vzorce použiť?

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Výpočet vzorcov na výpočet súradníc bodu na kružnici a na gule (z môjho zápisníka)

Hra 1. Jednoduchý had

  • platforma: Windows (testované na Windows 7, 10)
  • Jazyk: Myslím, že som to napísal v čistom C
  • Herný engine: konzola Windows
  • inšpirácia: javidx9
  • Úložisko: GitHub

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Jednoduchá hra Snake

3D scéna nie je hra. Navyše, modelovanie a animovanie 3D objektov (najmä postáv) je zdĺhavé a náročné. Po hraní s Unity som si uvedomil, že musím pokračovať, alebo skôr začať od základov. Niečo jednoduché a rýchle, no zároveň globálne, na pochopenie samotnej štruktúry hier.

Čo je jednoduché a rýchle? Presne tak, konzola a 2D. Presnejšie, dokonca aj konzola a symboly. Opäť som hľadal inšpiráciu na internete (vo všeobecnosti si myslím, že internet je najrevolučnejší a najnebezpečnejší vynález XNUMX. storočia). Vyhrabal som video programátora, ktorý vyrobil konzolový Tetris. A v podobe jeho hry som sa rozhodol urobiť „hada“. Z videa som sa dozvedel o dvoch zásadných veciach – hernej slučke (s tromi základnými funkciami/časťami) a výstupe do vyrovnávacej pamäte.

Herná slučka môže vyzerať asi takto:

int main()
   {
      Setup();
      // a game loop
      while (!quit)
      {
          Input();
          Logic();
          Draw();
          Sleep(gameSpeed);  // game timing
      }
      return 0;
   }

Kód predstavuje celú funkciu main() naraz. A po príslušnom komentári začína herný cyklus. V slučke sú tri základné funkcie: Input(), Logic(), Draw(). Najprv vstupné dáta Vstup (hlavne ovládanie stlačenia klávesov), potom spracovanie zadaných dát Logic, potom výstup na obrazovku - Draw. A tak každý rám. Takto vzniká animácia. Je to ako v karikatúrach. Spracovanie zadaných údajov zvyčajne zaberie najviac času a pokiaľ viem, určuje snímkovú frekvenciu hry. Ale tu sa funkcia Logic() vykonáva veľmi rýchlo. Snímkovú frekvenciu teda musíte ovládať pomocou funkcie Sleep() s parametrom gameSpeed ​​​​, ktorý túto rýchlosť určuje.

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Herný cyklus. Programovanie „hada“ v poznámkovom bloku

Ak vyvíjate konzolovú hru založenú na postavách, nebudete môcť prenášať údaje na obrazovku pomocou bežného výstupu „cout“ – je to veľmi pomalé. Preto musí byť výstup odoslaný do vyrovnávacej pamäte obrazovky. Je to oveľa rýchlejšie a hra pobeží bez závad. Aby som bol úprimný, celkom nerozumiem tomu, čo je vyrovnávacia pamäť obrazovky a ako funguje. Ale dám tu príklad kódu a možno niekto objasní situáciu v komentároch.

Získanie vyrovnávacej pamäte obrazovky (takpovediac):

// create screen buffer for drawings
   HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0,
 							   NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
   DWORD dwBytesWritten = 0;
   SetConsoleActiveScreenBuffer(hConsole);

Priamy výstup na obrazovku určitého riadku scoreLine (riadok na zobrazenie skóre):

// draw the score
   WriteConsoleOutputCharacter(hConsole, scoreLine, GAME_WIDTH, {2,3}, &dwBytesWritten);

Teoreticky v tejto hre nie je nič zložité, zdá sa mi to dobrý príklad základnej hry. Kód je napísaný v jednom súbore a usporiadaný do niekoľkých funkcií. Žiadne triedy, žiadne dedičstvo. Vy sami môžete vidieť všetko v zdrojovom kóde hry tak, že prejdete do úložiska na GitHub.

Hra 2. Crazy Tanks

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Hra Crazy Tanks

Tlač postáv na konzole je asi to najjednoduchšie, čo môžete premeniť na hru. Potom sa však objaví jeden problém: symboly majú rôzne výšky a šírky (výška je väčšia ako šírka). Týmto spôsobom bude všetko vyzerať neprimerane a pohyb nadol alebo nahor sa bude javiť oveľa rýchlejšie ako pohyb doľava alebo doprava. Tento efekt je veľmi viditeľný v hre Snake (1. hra). „Tanky“ (Hra 2) nemajú túto nevýhodu, pretože výstup je organizovaný maľovaním pixelov obrazovky rôznymi farbami. Dalo by sa povedať, že som napísal renderer. Je pravda, že je to trochu zložitejšie, aj keď oveľa zaujímavejšie.

Pre túto hru bude stačiť popísať môj systém zobrazovania pixelov na obrazovke. Toto považujem za hlavnú časť hry. A na všetko ostatné môžete prísť sami.

Takže to, čo vidíte na obrazovke, je len súbor pohyblivých farebných obdĺžnikov.

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Sada obdĺžnikov

Každý obdĺžnik je reprezentovaný maticou vyplnenou číslami. Mimochodom, môžem vyzdvihnúť jednu zaujímavú nuanciu - všetky matice v hre sú naprogramované ako jednorozmerné pole. Nie dvojrozmerné, ale jednorozmerné! S jednorozmernými poliami sa pracuje oveľa jednoduchšie a rýchlejšie.

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Príklad matice herného tanku

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Znázornenie matice herného tanku ako jednorozmerného poľa

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Vizuálnejší príklad reprezentácie matice ako jednorozmerného poľa

Ale prístup k prvkom poľa prebieha v dvojitej slučke, ako keby to nebolo jednorozmerné pole, ale dvojrozmerné. Robí sa to preto, lebo stále pracujeme s matricami.

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Prechádzanie jednorozmerným poľom v dvojitej slučke. Y - identifikátor riadku, X - identifikátor stĺpca

Poznámka: namiesto bežných maticových identifikátorov i, j používam identifikátory x a y. Takto sa mi zdá, že je to príjemnejšie pre oči a zrozumiteľnejšie pre mozog. Okrem toho takýto zápis umožňuje pohodlne premietať použité matice na súradnicové osi dvojrozmerného obrazu.

Teraz o pixeloch, farbách a výstupe na obrazovku. Na výstup sa používa funkcia StretchDIBits (Header: windows.h; Library: gdi32.lib). Táto funkcia okrem iného prijíma nasledovné: zariadenie, na ktorom je obrázok zobrazený (v mojom prípade je to konzola Windows), počiatočné súradnice zobrazenia obrázka, jeho šírka/výška a samotný obrázok v vo forme bitovej mapy reprezentovanej poľom bajtov. Bitová mapa ako bajtové pole!

Funkcia StretchDIBits() v akcii:

// screen output for game field
   StretchDIBits(
               deviceContext,
               OFFSET_LEFT, OFFSET_TOP,
               PMATRIX_WIDTH, PMATRIX_HEIGHT,
               0, 0,
               PMATRIX_WIDTH, PMATRIX_HEIGHT,
               m_p_bitmapMemory, &bitmapInfo,
               DIB_RGB_COLORS,
               SRCCOPY
               );

Pamäť je pre túto bitovú mapu vopred pridelená pomocou funkcie VirtualAlloc(). To znamená, že potrebný počet bajtov je vyhradený na uloženie informácií o všetkých pixeloch, ktoré sa potom zobrazia na obrazovke.

Vytvorenie bitmapy m_p_bitmapMemory:

// create bitmap
   int bitmapMemorySize = (PMATRIX_WIDTH * PMATRIX_HEIGHT) * BYTES_PER_PIXEL;
   void* m_p_bitmapMemory = VirtualAlloc(0, bitmapMemorySize, MEM_COMMIT, PAGE_READWRITE);

Zhruba povedané, bitmapa pozostáva zo sady pixelov. Každé štyri bajty v poli je pixel RGB. Jeden bajt na hodnotu červenej farby, jeden bajt na hodnotu zelenej farby (G) a jeden bajt na hodnotu modrej farby (B). Navyše zostáva jeden bajt na odsadenie. Tieto tri farby – červená/zelená/modrá (RGB) – sa navzájom zmiešajú v rôznych pomeroch, aby vytvorili výslednú farbu pixelov.

Teraz je opäť každý obdĺžnik alebo herný objekt reprezentovaný číselnou maticou. Všetky tieto herné predmety sú umiestnené v zbierke. A potom sa umiestnia na hracie pole a vytvoria jednu veľkú číselnú maticu. Každé číslo v matici som namapoval na konkrétnu farbu. Napríklad číslo 8 je modré, číslo 9 žlté, číslo 10 tmavosivé atď. Môžeme teda povedať, že máme maticu hracieho poľa, kde každé číslo má nejaký druh farby.

Máme teda na jednej strane číselnú maticu celého hracieho poľa a na druhej bitmapu pre zobrazenie obrázku. Zatiaľ je bitmapa „prázdna“ - ešte neobsahuje informácie o pixeloch požadovanej farby. To znamená, že posledným krokom bude naplnenie bitmapy informáciami o každom pixeli na základe číselnej matice hracieho poľa. Jasný príklad takejto transformácie je na obrázku nižšie.

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Príklad naplnenia bitmapy (Pixelovej matice) informáciami na základe digitálnej matice hracieho poľa (farebné indexy sa nezhodujú s indexmi v hre)

Predstavím aj kúsok reálneho kódu z hry. Premennej colorIndex pri každej iterácii cyklu je priradená hodnota (color index) z numerickej matice hracieho poľa (mainDigitalMatrix). Premenná farba sa potom nastaví na samotnú farbu na základe indexu. Výsledná farba sa potom rozdelí na pomer červenej, zelenej a modrej (RGB). A spolu s pixelPadding sa tieto informácie zapisujú do pixelu znova a znova a vytvárajú farebný obraz v bitmape.

Kód používa ukazovatele a bitové operácie, ktoré môžu byť ťažko pochopiteľné. Preto vám odporúčam, aby ste si niekde oddelene prečítali, ako takéto štruktúry fungujú.

Vyplnenie bitmapy informáciami na základe číselnej matice hracieho poľa:

// set pixel map variables
   int colorIndex;
   COLORREF color;
   int pitch;
   uint8_t* p_row;
 
   // arrange pixels for game field
   pitch = PMATRIX_WIDTH * BYTES_PER_PIXEL;     // row size in bytes
   p_row = (uint8_t*)m_p_bitmapMemory;       //cast to uint8 for valid pointer arithmetic
   							(to add by 1 byte (8 bits) at a time)   
   for (int y = 0; y < PMATRIX_HEIGHT; ++y)
   {
       uint32_t* p_pixel = (uint32_t*)p_row;
       for (int x = 0; x < PMATRIX_WIDTH; ++x)
       {
           colorIndex = mainDigitalMatrix[y * PMATRIX_WIDTH + x];
           color = Utils::GetColor(colorIndex);
           uint8_t blue = GetBValue(color);
           uint8_t green = GetGValue(color);
           uint8_t red = GetRValue(color);
           uint8_t pixelPadding = 0;
 
           *p_pixel = ((pixelPadding << 24) | (red << 16) | (green << 8) | blue);
           ++p_pixel;
       }
       p_row += pitch;
   }

Podľa vyššie opísanej metódy sa v hre Crazy Tanks vytvorí jeden obrázok (rámček) a zobrazí sa na obrazovke vo funkcii Draw(). Po zaregistrovaní stlačených klávesov vo funkcii Input() a ich následnom spracovaní vo funkcii Logic() sa vytvorí nový obrázok (rám). Je pravda, že herné predmety už môžu mať inú pozíciu na hracom poli, a preto sú nakreslené na inom mieste. Takto prebieha animácia (pohyb).

Teoreticky (ak ste na nič nezabudli), pochopenie hernej slučky z prvej hry („Snake“) a systému zobrazovania pixelov na obrazovke z druhej hry („Tanks“) je všetko, čo potrebujete na napísanie akéhokoľvek vašich 2D hier pre Windows. Bez zvuku! 😉 Ostatné časti sú len úletom fantázie.

Samozrejme, hra „Tanks“ je oveľa zložitejšia ako „Snake“. Už som používal jazyk C++, to znamená, že som opísal rôzne herné objekty s triedami. Vytvoril som si vlastnú kolekciu - kód je možné zobraziť v hlavičkách/Box.h. Mimochodom, kolekcia má s najväčšou pravdepodobnosťou únik pamäte. Použité ukazovatele. Pracovalo sa s pamäťou. Musím povedať, že kniha mi veľmi pomohla Začiatok C++ cez programovanie hier. Toto je skvelý začiatok pre začiatočníkov v C++. Je malý, zaujímavý a dobre organizovaný.

Vývoj tejto hry trval asi šesť mesiacov. Písal som hlavne počas obeda a občerstvenia v práci. Sedel v kancelárskej kuchyni, šliapal jedlo a písal kód. Alebo na večeru doma. Tak som skončil s týmito „kuchynskými vojnami“. Ako vždy som aktívne používal notebook a v ňom sa rodili všetky koncepčné veci.

Na dokončenie praktickej časti urobím niekoľko skenov môjho notebooku. Aby som ukázal, čo som si presne zapísal, nakreslil, počítal, navrhol...

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Navrhovanie obrázkov tankov. A určiť, koľko pixelov by mal každý tank zaberať na obrazovke

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Výpočet algoritmu a vzorcov na otáčanie nádrže okolo svojej osi

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
Schéma mojej zbierky (s najväčšou pravdepodobnosťou je to tá, v ktorej dochádza k úniku pamäte). Kolekcia je vytvorená podľa typu Linked List

DevOps C++ a „kuchynské vojny“, alebo Ako som začal písať hry pri jedle
A to sú márne pokusy pripojiť k hre umelú inteligenciu

Теория

„Aj cesta dlhá tisíc míľ začína prvým krokom“ (starodávna čínska múdrosť)

Prejdime od praxe k teórii! Ako si nájdete čas na svoje hobby?

  1. Rozhodnite sa, čo naozaj chcete (žiaľ, toto je najťažšie).
  2. Stanovte si priority.
  3. Obetujte všetko „navyše“ kvôli vyšším prioritám.
  4. Pohybujte sa smerom k svojim cieľom každý deň.
  5. Nečakajte, že zostanú dve-tri hodiny voľného času na hobby.

Na jednej strane si musíte určiť, čo chcete a uprednostniť. Na druhej strane je možné upustiť od niektorých aktivít/projektov v prospech týchto priorít. Inými slovami, budete musieť obetovať všetko „navyše“. Niekde som počul, že v živote by mali byť maximálne tri hlavné činnosti. Potom ich budete môcť robiť v najvyššej kvalite. A ďalšie projekty/smery sa jednoducho začnú preťažovať. Ale to je všetko asi subjektívne a individuálne.

Existuje isté zlaté pravidlo: nikdy nemajte 0% deň! Dozvedel som sa o tom v článku jedného nezávislého vývojára. Ak pracujete na projekte, robte s tým niečo každý deň. A nezáleží na tom, koľko robíte. Napíšte jedno slovo alebo jeden riadok kódu, pozrite si jedno inštruktážne video alebo zatĺkajte jeden klinec do dosky – proste niečo urobte. Najťažšie je začať. Akonáhle začnete, pravdepodobne skončíte tak, že urobíte trochu viac, ako ste chceli. Takto sa budete neustále posúvať k svojmu cieľu a verte, že veľmi rýchlo. Koniec koncov, hlavnou prekážkou všetkých vecí je prokrastinácia.

A je dôležité pamätať na to, že by ste nemali podceňovať a ignorovať voľné „piliny“ času za 5, 10, 15 minút, počkať si na nejaké veľké „polená“ trvajúce hodinu-dve. Stojíte v rade? Premýšľajte o niečom pre svoj projekt. Ideš hore po eskalátore? Zapíšte si niečo do poznámkového bloku. Cestujete v autobuse? Dobre, prečítajte si nejaký článok. Využite každú príležitosť. Prestaňte pozerať mačky a psy na YouTube! Neznečisťujte si mozog!

A ešte posledná vec. Ak sa vám po prečítaní tohto článku páčila myšlienka vytvárať hry bez použitia herných motorov, potom si zapamätajte meno Casey Muratori. Tento chlap má webové stránky. V sekcii “pozrieť -> PREDCHÁDZAJÚCE EPIZODY” nájdete úžasné bezplatné videonávody na vytvorenie profesionálnej hry od začiatku. Za päť lekcií Intro to C for Windows sa naučíte pravdepodobne viac ako za päť rokov vysokoškolského štúdia (niekto o tom písal v komentároch pod videom).

Casey tiež vysvetľuje, že vývojom vlastného herného enginu budete lepšie rozumieť všetkým existujúcim enginom. Vo svete frameworkov, kde sa každý snaží automatizovať, sa naučíte vytvárať, nie používať. Pochopte podstatu počítačov. A stanete sa aj oveľa inteligentnejším a vyspelejším programátorom – profíkom.

Veľa šťastia na zvolenej ceste! A urobme svet profesionálnejším.

Autor: Grankin Andrej, DevOps



Zdroj: hab.com