DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus

„Aš žinau, kad nieko nežinau“ Sokratas

Kam: IT žmonėms, kurie spjauna į visus kūrėjus ir nori žaisti savo žaidimus!

Apie ką: kaip pradėti rašyti žaidimus C/C++, jei to reikia!

Kodėl verta skaityti tai: Programėlių kūrimas nėra mano darbo specialybė, bet kiekvieną savaitę stengiuosi koduoti. Nes man patinka žaidimai!

Labas mano vardas yra Andrejus Grankinas, Esu „Luxoft“ „DevOps“ darbuotojas. Programų kūrimas nėra mano darbo specialybė, bet kiekvieną savaitę stengiuosi koduoti. Nes man patinka žaidimai!

Kompiuterinių žaidimų pramonė yra didžiulė, šiandien sklando dar daugiau gandų nei kino industrija. Žaidimai buvo rašomi nuo kompiuterių kūrimo pradžios, naudojant, pagal šiuolaikinius standartus, sudėtingus ir pagrindinius kūrimo metodus. Laikui bėgant pradėjo atsirasti žaidimų varikliai su jau užprogramuota grafika, fizika ir garsu. Jie leidžia sutelkti dėmesį į paties žaidimo kūrimą ir nesijaudinti dėl jo pagrindo. Tačiau kartu su jais, su varikliais, kūrėjai „apakina“ ir degraduoja. Pati žaidimų gamyba uždedama ant konvejerio. Ir produkcijos kiekybė pradeda vyrauti prieš jos kokybę.

Tuo pačiu metu žaidžiant kitų žmonių žaidimus mus nuolat riboja vietos, siužetas, personažai, žaidimų mechanika, kurią sugalvojo kiti. Taigi aš supratau, kad...

... laikas kurti savo pasaulius, pavaldžius tik man. Pasauliai, kuriuose aš esu Tėvas, Sūnus ir Šventoji Dvasia!

Ir aš nuoširdžiai tikiu, kad parašę savo žaidimo variklį ir žaidimą ant jo, galėsite atsimerkti, nusišluostyti langus ir pumpuoti savo saloną, tapdami labiau patyrusiu ir neatsiejamu programuotoju.

Šiame straipsnyje pabandysiu papasakoti, kaip pradėjau rašyti mažus žaidimus C / C ++, koks yra kūrimo procesas ir kur randu laiko hobiui judrioje aplinkoje. Jis yra subjektyvus ir apibūdina individualaus starto procesą. Medžiaga apie nežinojimą ir tikėjimą, apie mano asmeninį šio momento pasaulio vaizdą. Kitaip tariant, „Administracija neatsako už jūsų asmenines smegenis!“.

Praktika

"Žinios be praktikos yra nenaudingos, praktika be žinių yra pavojinga." Konfucijus

Mano užrašų knygelė yra mano gyvenimas!


Taigi praktiškai galiu pasakyti, kad viskas man prasideda nuo sąsiuvinio. Ten užsirašau ne tik savo kasdienes užduotis, bet ir piešiu, programuoju, kuriu struktūrines schemas, sprendžiu uždavinius, taip pat ir matematinius. Visada naudokite bloknotą ir rašykite tik pieštuku. Tai švaru, patogu ir patikima, IMHO.

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Mano (jau užpildytas) sąsiuvinis. Štai kaip atrodo. Jame yra kasdienės užduotys, idėjos, brėžiniai, diagramos, sprendimai, juodoji buhalterija, kodas ir pan.

Šiame etape man pavyko užbaigti tris projektus (tai mano supratimu apie „baigtumą“, nes bet kurį produktą galima sukurti palyginti be galo).

  • 0 projektas: tai Architect Demo 3D scena, parašyta C# naudojant Unity žaidimo variklį. „MacOS“ ir „Windows“ platformoms.
  • 1 žaidimas: konsolinis žaidimas Simple Snake (visiems žinomas kaip „Snake“), skirtas Windows. parašyta C.
  • 2 žaidimas: konsolinis žaidimas Crazy Tanks (visiems žinomas kaip "Tanks"), jau parašytas C ++ (naudojant klases) ir taip pat Windows.

Projektas 0 Architektas Demo

  • Platforma: „Windows“ („Windows 7“, „10“), „Mac OS“ („OS X El Capitan v. 10.11.6“)
  • Kalba: C#
  • Žaidimo variklis: Vienybė
  • Įkvėpimas: Darrinas Lilis
  • Saugykla: GitHub

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
3D scenos architekto demonstracija

Pirmasis projektas buvo įgyvendintas ne C/C++, o C# kalba naudojant Unity žaidimo variklį. Šis variklis nebuvo toks reiklus techninei įrangai kaip "Unreal Engine", taip pat man atrodė lengviau įdiegti ir naudoti. Kitų variklių negalvojau.

„Unity“ tikslas man nebuvo sukurti kažkokį žaidimą. Norėjau sukurti 3D sceną su kažkokiu personažu. Jis, o tiksliau Ji (aš modeliavau merginą, kurią įsimylėjau =) turėjo judėti ir bendrauti su išoriniu pasauliu. Svarbu buvo tik suprasti, kas yra „Unity“, koks yra kūrimo procesas ir kiek pastangų reikia ką nors sukurti. Taip gimė projektas „Architect Demo“ (pavadinimas sugalvotas beveik iš nesąmonės). Programavimas, modeliavimas, animacija, tekstūravimas užtruko turbūt du mėnesius kasdienio darbo.

Pradėjau nuo mokymo vaizdo įrašų „YouTube“, kaip kurti 3D modelius Maišytuvo. Blender yra puikus nemokamas 3D modeliavimo (ir daugiau) įrankis, kurio nereikia įdiegti. Ir čia manęs laukė šokas... Pasirodo, modeliavimas, animacija, faktūravimas yra didžiulės atskiros temos, kuriomis galima rašyti knygas. Tai ypač pasakytina apie veikėjus. Norėdami modeliuoti pirštus, dantis, akis ir kitas kūno dalis, jums reikės anatomijos žinių. Kaip išsidėstę veido raumenys? Kaip žmonės juda? Aš turėjau „įkišti“ kaulus į kiekvieną ranką, koją, pirštą, pirštus!

Modeliuokite raktikaulį, papildomas kaulo svirtis, kad animacija atrodytų natūraliai. Po tokių pamokų supranti, kokį didžiulį darbą atlieka animacinių filmų kūrėjai, kad tik sukurtų 30 sekundžių vaizdo įrašą. Tačiau 3D filmai trunka valandas! Ir tada mes išeiname iš kino teatrų ir sakome kažką panašaus į: „Ta, šlykštus animacinis filmas / filmas! Jie galėjo padaryti geriau...“ Kvailiai!

Ir dar vienas dalykas apie programavimą šiame projekte. Kaip paaiškėjo, man įdomiausia buvo matematinė dalis. Jei paleisite sceną (nuoroda į saugyklą projekto aprašyme), pastebėsite, kad kamera sukasi aplink merginos personažą sferoje. Norint užprogramuoti tokį kameros sukimąsi, pirmiausia turėjau apskaičiuoti padėties taško koordinates apskritime (2D), o po to sferoje (3D). Juokingiausia, kad mokykloje nekenčiau matematikos ir mokėjau ją su minusu. Iš dalies tikriausiai todėl, kad mokykloje jums tiesiog neaiškina, kaip ši matematika pritaikoma gyvenime. Bet kai esi apsėstas savo tikslo, svajonės, tada protas išsivalo, atsiskleidžia! Ir jūs pradedate suvokti sudėtingas užduotis kaip įdomų nuotykį. Ir tada tu pagalvoji: „Na, kodėl *mylimasis* matematikas negalėjo paprastai pasakyti, kur šios formulės gali būti nukreiptos?

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Apskaičiavimas formulių taško koordinatėms apskritime ir sferoje apskaičiuoti (iš mano užrašų knygelės)

1 žaidimas

  • Platforma: „Windows“ (išbandyta „Windows 7“, „10“)
  • Kalba: Manau, kad tai buvo parašyta gryna C
  • Žaidimo variklis: Windows konsolė
  • Įkvėpimas: javidx9
  • Saugykla: GitHub

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Paprastas žaidimas „Snake“.

3D scena nėra žaidimas. Be to, modeliuoti ir animuoti 3D objektus (ypač personažus) yra ilgas ir sunkus. Pažaidęs su „Unity“ supratau, kad turiu tęsti, tiksliau, pradėti nuo pagrindų. Kažkas paprasto ir greito, bet kartu ir globalaus, norint suprasti pačią žaidimų struktūrą.

O ką mes turime paprasto ir greito? Teisingai, konsolė ir 2D. Tiksliau, net konsolė ir simboliai. Vėl ėmiau ieškoti įkvėpimo internete (apskritai internetą laikau revoliucingiausiu ir pavojingiausiu XXI amžiaus išradimu). Išrausiau vieno programuotojo, kuris sukūrė konsolę Tetris, vaizdo įrašą. Ir pagal savo žaidimą jis nusprendė nupjauti „gyvatę“. Iš vaizdo įrašo sužinojau apie du pagrindinius dalykus - žaidimo kilpą (su trimis pagrindinėmis funkcijomis / dalimis) ir išvestį į buferį.

Žaidimo ciklas gali atrodyti maždaug taip:

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

Kodas vienu metu pateikia visą main() funkciją. O žaidimo ciklas prasideda po atitinkamo komentaro. Cikle yra trys pagrindinės funkcijos: Input (), Logic (), Draw (). Pirmiausia įvesti duomenys Įvestis (daugiausia klavišų paspaudimų valdymas), tada įvestų duomenų apdorojimas Logika, tada atvaizdavimas ekrane - Piešti. Ir taip kiekvienas kadras. Animacija kuriama tokiu būdu. Tai kaip animaciniai filmai. Paprastai įvesties duomenų apdorojimas užima daugiausiai laiko ir, kiek žinau, lemia žaidimo kadrų dažnį. Bet čia Logic() funkcija yra labai greita. Todėl kadrų dažnį turi valdyti funkcija Sleep() su gameSpeed ​​​​parametru, kuris nustato šį dažnį.

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
žaidimo ciklas. Gyvatės programavimas užrašų knygelėje

Jei kuriate simbolinį konsolinį žaidimą, duomenų rodymas ekrane naudojant įprastą srauto išvestį 'cout' neveiks – tai labai lėta. Todėl išvestis turi būti atlikta ekrano buferyje. Taip daug greičiau ir žaidimas veiks be trikdžių. Tiesą sakant, aš nelabai suprantu, kas yra ekrano buferis ir kaip jis veikia. Bet čia pateiksiu kodo pavyzdį ir galbūt kas nors komentaruose galės paaiškinti situaciją.

Ekrano buferio gavimas (jei galiu taip pasakyti):

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

Tiesioginė išvestis į tam tikros eilutės scoreLine ekraną (balų rodymo eilutė):

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

Teoriškai šiame žaidime nėra nieko sudėtingo, man tai atrodo geras pradinio lygio žaidimo pavyzdys. Kodas parašytas viename faile ir išdėstytas keliomis funkcijomis. Jokių klasių, jokio paveldėjimo. Viską galite pamatyti žaidimo šaltinio kode, apsilankę „GitHub“ saugykloje.

Žaidimas 2 Crazy Tanks

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Crazy Tanks žaidimas

Simbolių spausdinimas konsolėje yra bene paprasčiausias dalykas, kurį galite paversti žaidimu. Bet tada iškyla viena bėda: simboliai yra skirtingo aukščio ir pločio (aukštis didesnis už plotį). Taigi viskas atrodys neproporcinga, o judėjimas žemyn ar aukštyn atrodys daug greičiau nei judėjimas į kairę ar dešinę. Šis efektas labai pastebimas „Gyvatėje“ (1 žaidimas). „Tankai“ (2 žaidimas) tokio trūkumo neturi, nes ten išvestis organizuojama nudažant ekrano pikselius skirtingomis spalvomis. Galima sakyti, parašiau atvaizdą. Tiesa, tai jau šiek tiek sudėtingiau, nors ir daug įdomiau.

Šiam žaidimui pakaks aprašyti mano pikselių rodymo ekrane sistemą. Manau, kad tai yra pagrindinė žaidimo dalis. O visa kita galite sugalvoti patys.

Taigi, tai, ką matote ekrane, yra tik judančių spalvotų stačiakampių rinkinys.

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Stačiakampio komplektas

Kiekvienas stačiakampis pavaizduotas matrica, užpildyta skaičiais. Beje, galiu išskirti vieną įdomų niuansą – visos matricos žaidime užprogramuotos kaip vienmatis masyvas. Ne dvimatis, o vienmatis! Su vienmačiais masyvais dirbti daug lengviau ir greičiau.

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Žaidimo tanko matricos pavyzdys

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Žaidimo bako matricos su vienmačiu matricos atvaizdavimas

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Iliustratyvesnis matricos vaizdavimo vienmačiu masyvu pavyzdys

Bet prieiga prie masyvo elementų vyksta dviguba kilpa, tarsi tai būtų ne vienmatis, o dvimatis masyvas. Tai daroma, nes vis dar dirbame su matricomis.

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Vienmačio masyvo perėjimas dviguba kilpa. Y yra eilutės ID, X yra stulpelio ID

Atkreipkite dėmesį, kad vietoj įprastų matricos identifikatorių i, j naudoju identifikatorius x ir y. Taigi, man atrodo, maloniau akiai ir aiškiau smegenims. Be to, toks žymėjimas leidžia patogiai projektuoti naudojamas matricas į dvimačio vaizdo koordinačių ašis.

Dabar apie pikselius, spalvas ir ekraną. Išvestiei naudojama funkcija StretchDIBits (Antraštė: windows.h; Library: gdi32.lib). Be kita ko, šiai funkcijai perduodama: įrenginys, kuriame rodomas vaizdas (mano atveju tai yra „Windows“ konsolė), vaizdo rodymo pradžios koordinatės, jo plotis / aukštis ir vaizdas pati bitmap (bitmap) forma, pavaizduota baitų masyvu. Bitmap kaip baitų masyvas!

Funkcija StretchDIBits() veikia:

// 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
               );

Atmintis šiai bitų schemai iš anksto paskirstoma naudojant VirtualAlloc() funkciją. Tai yra, reikalingas baitų skaičius yra rezervuotas informacijai apie visus pikselius saugoti, kuri vėliau bus rodoma ekrane.

m_p_bitmapAtminties bitmap kūrimas:

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

Grubiai tariant, bitmap susideda iš pikselių rinkinio. Kas keturi masyvo baitai yra RGB pikselis. Vienas baitas kiekvienai raudonai vertei, vienas baitas vienai žaliai (G) ir vienas baitas kiekvienai mėlynai spalvai (B). Be to, kiekvienoje įtraukoje yra vienas baitas. Šios trys spalvos - Raudona / Žalia / Mėlyna (RGB) - maišomos viena su kita skirtingomis proporcijomis - ir gaunama gauta pikselių spalva.

Dabar vėlgi, kiekvienas stačiakampis arba žaidimo objektas yra pavaizduotas skaičių matrica. Visi šie žaidimo objektai dedami į kolekciją. Tada jie dedami į žaidimo lauką, sudarydami vieną didelę skaitinę matricą. Kiekvieną skaičių matricoje susiejau su tam tikra spalva. Pavyzdžiui, skaičius 8 yra mėlynas, 9 – geltonas, 10 – tamsiai pilkas ir t.t. Taigi galime sakyti, kad turime žaidimo lauko matricą, kurioje kiekvienas skaičius yra tam tikros spalvos.

Taigi, viena vertus, turime skaitinę viso žaidimo lauko matricą ir, kita vertus, taškinę schemą, skirtą vaizdui rodyti. Kol kas bitmap yra „tuščias“ – jame dar nėra informacijos apie norimos spalvos pikselius. Tai reiškia, kad paskutinis žingsnis bus taškinės schemos užpildymas informacija apie kiekvieną pikselį, remiantis žaidimo lauko skaitine matrica. Iliustratyvus tokios transformacijos pavyzdys pateiktas paveikslėlyje žemiau.

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Taškinės schemos (pikselių matricos) užpildymo informacija, pagrįsta žaidimo lauko skaitine matrica (skaitmenine matrica), pavyzdys (spalvų indeksai nesutampa su žaidimo indeksais)

Taip pat pateiksiu dalelę tikro kodo iš žaidimo. Kintamajam colorIndex kiekvienoje ciklo iteracijoje priskiriama reikšmė (spalvų indeksas) iš žaidimo lauko skaitinės matricos (mainDigitalMatrix). Tada pagal indeksą į spalvos kintamąjį įrašoma pati spalva. Be to, gauta spalva yra padalinta į raudonos, žalios ir mėlynos spalvos santykį (RGB). Ir kartu su įtrauka (pixelPadding) ši informacija vėl ir vėl įrašoma į pikselį, formuojant spalvotą vaizdą bitų schemoje.

Kode naudojamos rodyklės ir bitinės operacijos, kurias gali būti sunku suprasti. Tad patariu kur nors atskirai pasiskaityti, kaip tokios struktūros veikia.

Ratinių schemos užpildymas informacija, pagrįsta žaidimo lauko skaitine matrica:

// 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;
   }

Pagal aukščiau aprašytą metodą Crazy Tanks žaidime suformuojamas vienas paveikslėlis (rėmas) ir rodomas ekrane Draw() funkcijoje. Užregistravus klavišų paspaudimus funkcijoje Input() ir vėlesnį jų apdorojimą Logic() funkcijoje, susidaro naujas paveikslėlis (kadras). Tiesa, žaidimo objektai jau gali turėti skirtingą vietą žaidimo lauke ir atitinkamai yra nupiešti kitoje vietoje. Taip vyksta animacija (judesys).

Teoriškai (jei nieko nepamiršote) norint parašyti tereikia suprasti žaidimo kilpą iš pirmojo žaidimo („Snake“) ir pikselių rodymo ekrane sistemą iš antrojo žaidimo („Tanks“). 2D žaidimų, skirtų „Windows“. Be garso! 😉 Likusios dalys yra tik išgalvotas skrydis.

Žinoma, žaidimas „Tankai“ sukurtas daug sudėtingesnis nei „Gyvatė“. Jau naudojau C++ kalbą, tai yra aprašiau skirtingus žaidimo objektus su klasėmis. Sukūriau savo kolekciją – kodą galite pamatyti headers/Box.h. Beje, kolekcijoje greičiausiai yra atminties nutekėjimo. Naudotos rodyklės. Dirbo su atmintimi. Turiu pasakyti, kad knyga man labai padėjo. C++ pradžia per žaidimų programavimą. Tai puiki pradžia pradedantiesiems C++. Jis mažas, įdomus ir gerai organizuotas.

Šiam žaidimui sukurti prireikė maždaug šešių mėnesių. Rašiau daugiausia per pietus ir užkandžius darbe. Jis sėdėjo biuro virtuvėje, trypė maistą ir rašė kodą. Arba namuose vakarienei. Taip ir susilaukiau tokių „virtuvinių karų“. Kaip visada aktyviai naudojausi sąsiuvinį, joje ir gimė visi konceptualūs dalykai.

Praktinės dalies pabaigoje ištrauksiu keletą savo sąsiuvinio nuskaitytų nuotraukų. Kad parodyčiau, ką tiksliai užsirašiau, piešiau, skaičiavau, projektavau...

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Tanko vaizdo dizainas. Ir apibrėžimas, kiek pikselių turi užimti kiekvienas bakas ekrane

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Bako sukimosi aplink savo ašį algoritmo ir formulių apskaičiavimas

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Mano kolekcijos diagrama (greičiausiai su atminties nutekėjimu). Kolekcija sukurta kaip susietas sąrašas

DevOps C++ ir „virtuvės karai“, arba Kaip valgydamas pradėjau rašyti žaidimus
Ir tai yra bergždi bandymai į žaidimą įsukti dirbtinį intelektą

Теория

„Net tūkstančio mylių kelionė prasideda nuo pirmo žingsnio“ (Senovės kinų išmintis)

Nuo praktikos pereikime prie teorijos! Kaip randate laiko savo hobiui?

  1. Nustatykite, ko iš tikrųjų norite (deja, tai yra sunkiausia).
  2. Nustatykite prioritetus.
  3. Paaukokite viską, kas „perteklinė“ dėl aukštesnių prioritetų.
  4. Kiekvieną dieną judėkite savo tikslų link.
  5. Nesitikėkite, kad pomėgiui atsiras dvi ar trys valandos laisvo laiko.

Viena vertus, turite nustatyti, ko norite, ir teikti pirmenybę. Kita vertus, kai kurių atvejų/projektų galima atsisakyti šių prioritetų naudai. Kitaip tariant, teks paaukoti viską, kas „perteklinė“. Kažkur girdėjau, kad gyvenime turi būti daugiausia trys pagrindinės veiklos. Tada galėsite su jais susidoroti geriausiu įmanomu būdu. Ir papildomi projektai / kryptys pradės perkrauti. Bet visa tai tikriausiai yra subjektyvu ir individualu.

Yra tam tikra auksinė taisyklė: niekada neturėk 0% dienos! Apie tai sužinojau iš nepriklausomo kūrėjo straipsnio. Jei dirbate su projektu, darykite ką nors su juo kiekvieną dieną. Ir nesvarbu, kiek uždirbi. Parašykite vieną žodį ar vieną kodo eilutę, pažiūrėkite vieną mokomąjį vaizdo įrašą arba įkalkite vieną vinį į lentą – tiesiog padarykite ką nors. Sunkiausia yra pradėti. Kai tik pradėsite, tikriausiai padarysite šiek tiek daugiau, nei norėjote. Taigi savo tikslo link judėsite nuolat ir, patikėkite, labai greitai. Juk pagrindinis visų dalykų stabdis yra atidėliojimas.

Ir svarbu nepamiršti, kad nereikėtų nuvertinti ir ignoruoti laisvų laiko „pjuvenų“ 5, 10, 15 minučių, laukti kokių nors didelių „rąstų“, trunkančių valandą ar dvi. Ar stovi eilėje? Pagalvokite apie ką nors savo projekto. Ar lipate eskalatoriumi? Užsirašykite ką nors į sąsiuvinį. Ar valgai autobuse? Gerai, paskaityk kokį nors straipsnį. Pasinaudokite kiekviena galimybe. Nustokite žiūrėti kačių ir šunų „YouTube“! Nemaišyk savo smegenų!

Ir paskutinis. Jei perskaičius šį straipsnį jums patiko idėja kurti žaidimus nenaudojant žaidimų variklių, prisiminkite Casey Muratori vardą. Šis vaikinas turi Interneto svetainė. Skiltyje „žiūrėti -> ANKSTESNĖS SERIJOS“ rasite nuostabių nemokamų vaizdo pamokų, kaip sukurti profesionalų žaidimą nuo nulio. Per penkias „Windows“ įvado C pamokas galite išmokti daugiau nei per penkerius studijų metus universitete (kažkas apie tai rašė komentaruose po vaizdo įrašu).

Casey taip pat paaiškina, kad sukūrę savo žaidimo variklį geriau suprasite visus esamus variklius. Karkasų pasaulyje, kur visi bando automatizuoti, išmoksite kurti, o ne naudoti. Supraskite pačią kompiuterių prigimtį. Taip pat tapsite daug protingesniu ir brandesniu programuotoju – profesionalu.

Sėkmės pasirinktame kelyje! Ir padarykime pasaulį profesionalesnį.

Autorius: Grankinas Andrejus, DevOps



Šaltinis: www.habr.com