DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā

"Es zinu, ka es neko nezinu." Sokrats

PriekÅ” kura: IT cilvēkiem, kuri nospļaujas uz visiem izstrādātājiem un vēlas spēlēt savas spēles!

Par ko: kā sākt rakstÄ«t spēles C/C++, ja nepiecieÅ”ams!

Kāpēc jums vajadzētu lasÄ«t Å”o: Lietotņu izstrāde nav mana darba specialitāte, bet cenÅ”os kodēt katru nedēļu. Jo man patÄ«k spēles!

Sveiki, mans vārds ir Andrejs Grankins, Es esmu DevOps uzņēmumā Luxoft. Lietojumprogrammu izstrāde nav mana darba specialitāte, bet cenÅ”os kodēt katru nedēļu. Jo man patÄ«k spēles!

Datorspēļu industrija ir milzÄ«ga, mÅ«sdienās tiek baumots pat vairāk nekā filmu industrija. Spēles tiek rakstÄ«tas kopÅ” datoru izstrādes sākuma, izmantojot, pēc mÅ«sdienu standartiem, sarežģītas un pamata izstrādes metodes. Laika gaitā sāka parādÄ«ties spēļu dzinēji ar jau ieprogrammētu grafiku, fiziku un skaņu. Tie ļauj koncentrēties uz paÅ”as spēles attÄ«stÄ«bu un neuztraukties par tās pamatiem. Bet kopā ar tiem, ar dzinējiem, izstrādātāji "akli" un degradējas. Pati spēļu ražoÅ”ana tiek uzlikta uz konveijera. Un produkcijas kvantitāte sāk dominēt pār tās kvalitāti.

Tajā paŔā laikā, spēlējot citu cilvēku spēles, mÅ«s pastāvÄ«gi ierobežo atraÅ”anās vietas, sižets, varoņi, spēļu mehānika, ko izdomājuÅ”i citi cilvēki. Tāpēc es sapratu, ka...

ā€¦ ir pienācis laiks izveidot savas pasaules, kas ir pakļautas tikai man. Pasaules, kur es esmu Tēvs un Dēls un Svētais Gars!

Un es patiesi ticu, ka, uzrakstot savu spēles dzinēju un uz tā spēli, jÅ«s varēsiet atvērt acis, noslaucÄ«t logus un sÅ«knēt savu salonu, kļūstot par pieredzējuŔāku un neatņemamu programmētāju.

Å ajā rakstā es mēģināŔu pastāstÄ«t, kā es sāku rakstÄ«t mazās spēles C / C ++, kāds ir izstrādes process un kur es atrodu laiku hobijam rosÄ«gā vidē. Tas ir subjektÄ«vs un apraksta individuālā starta procesu. Materiāls par neziņu un ticÄ«bu, par manu personÄ«go Ŕī brīža pasaules ainu. Citiem vārdiem sakot, "Administrācija nav atbildÄ«ga par jÅ«su personÄ«gajām smadzenēm!".

Prakse

"ZināŔanas bez prakses ir bezjēdzÄ«gas, prakse bez zināŔanām ir bÄ«stama." KonfÅ«cijs

Mana piezīmju grāmatiņa ir mana dzīve!


Tātad praksē varu teikt, ka man viss sākas ar piezīmju grāmatiņu. Es tur pierakstu ne tikai savus ikdienas darbus, bet arī zīmēju, programmēju, veidoju blokshēmas un risinu uzdevumus, arī matemātiskos. Vienmēr izmantojiet piezīmju grāmatiņu un rakstiet tikai ar zīmuli. Tas ir tīrs, ērts un uzticams, IMHO.

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Mana (jau aizpildÄ«ta) piezÄ«mju grāmatiņa. Tas izskatās Ŕādi. Tajā ir ikdienas uzdevumi, idejas, zÄ«mējumi, diagrammas, risinājumi, melnā grāmatvedÄ«ba, kods utt.

Å ajā posmā man izdevās pabeigt trÄ«s projektus (tas ir manā izpratnē par ā€œgalÄ«gumuā€, jo jebkuru produktu var attÄ«stÄ«t salÄ«dzinoÅ”i bezgalÄ«gi).

  • Projekts 0: Ŕī ir arhitekta demonstrācijas 3D aina, kas rakstÄ«ta C#, izmantojot Unity spēles dzinēju. MacOS un Windows platformām.
  • 1. spēle: konsoles spēle Simple Snake (visiem zināma kā "Snake") operētājsistēmai Windows. rakstÄ«ts C.
  • 2. spēle: konsoļu spēle Crazy Tanks (visiem zināms kā "Tanks"), kas jau rakstÄ«ts C ++ valodā (izmantojot klases) un arÄ« zem Windows.

Projekta 0 arhitekta demonstrācija

  • Platforma: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Valoda: C#
  • Spēles dzinējs: VienotÄ«ba
  • Iedvesma: Darins Lails
  • Repozitorijs: GitHub

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
3D ainas arhitekta demonstrācija

Pirmais projekts tika realizēts nevis C/C++, bet gan C#, izmantojot Unity spēļu dzinēju. Å is dzinējs nebija tik prasÄ«gs pret aparatÅ«ru kā Unreal Engine, kā arÄ« man Ŕķita vieglāk uzstādÄ«t un lietot. Es nedomāju par citiem dzinējiem.

MērÄ·is VienotÄ«bā man nebija attÄ«stÄ«t kaut kādu spēli. Es gribēju izveidot 3D ainu ar sava veida raksturu. Viņam vai, pareizāk sakot, Viņai (es modelēju meiteni, kurā biju iemÄ«lējusies =) bija jākustas un jāsadarbojas ar ārpasauli. Bija svarÄ«gi tikai saprast, kas ir VienotÄ«ba, kāds ir izstrādes process un cik daudz pūļu, lai kaut ko izveidotu. Tā radās Arhitektu Demo projekts (nosaukums tika izdomāts gandrÄ«z no muļķības). ProgrammÄ“Å”ana, modelÄ“Å”ana, animācija, teksturÄ“Å”ana man prasÄ«ja, iespējams, divus mēneÅ”us ilga ikdienas darba.

Es sāku ar mācÄ«bu video vietnē YouTube par 3D modeļu izveidi blenderis. Blenderis ir lielisks bezmaksas rÄ«ks 3D modelÄ“Å”anai (un citiem), kam nav nepiecieÅ”ama instalÄ“Å”ana. Un te mani sagaidÄ«ja Å”oks... Izrādās, modelÄ“Å”ana, animācija, teksturÄ“Å”ana ir milzÄ«gas atseviŔķas tēmas, par kurām var rakstÄ«t grāmatas. ÄŖpaÅ”i tas attiecas uz varoņiem. Lai modelētu pirkstus, zobus, acis un citas Ä·ermeņa daļas, jums bÅ«s nepiecieÅ”amas zināŔanas par anatomiju. Kā ir sakārtoti sejas muskuļi? Kā cilvēki pārvietojas? Man vajadzēja ā€œieliktā€ kaulus katrā rokā, kājā, pirkstā, pirkstu locÄ«tavās!

Modelējiet atslēgas kaulu, papildu kaula sviras, lai animācija izskatÄ«tos dabiski. Pēc Ŕādām nodarbÄ«bām saproti, kādu milzÄ«gu darbu paveic animācijas filmu veidotāji, lai tikai izveidotu 30 sekunžu video. Bet 3D filmas ilgst stundas! Un tad mēs iznākam no kinoteātriem un sakām kaut ko lÄ«dzÄ«gu: ā€œTa, sÅ«dÄ«ga multfilma/filma! Viņi varēja darÄ«t labākā€¦ā€ Muļķi!

Un vēl viena lieta par programmÄ“Å”anu Å”ajā projektā. Kā izrādÄ«jās, man visinteresantākā bija matemātiskā daļa. Ja palaižat ainu (projekta aprakstā ir saite uz repozitoriju), pamanÄ«sit, ka kamera griežas ap meitenes varoni sfērā. Lai ieprogrammētu Ŕādu kameras rotāciju, man vispirms bija jāaprēķina pozÄ«cijas punkta koordinātas uz apļa (2D), bet pēc tam uz sfēras (3D). SmieklÄ«gākais ir tas, ka es ienÄ«du matemātiku skolā un zināju to ar mÄ«nusu. Daļēji, iespējams, tāpēc, ka skolā jums vienkārÅ”i nepaskaidro, kā Ŕī matemātika tiek pielietota dzÄ«vē. Bet, kad esi apsēsts ar savu mērÄ·i, sapni, tad prāts iztÄ«rās, atklājas! Un jÅ«s sākat uztvert sarežģītus uzdevumus kā aizraujoÅ”u piedzÄ«vojumu. Un tad jÅ«s domājat: "Kāpēc *mīļotais* matemātiÄ·is nevarēja normāli pateikt, kur Ŕīs formulas var izmantot?".

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Formulu aprēķins apļa un sfēras punkta koordinātu aprēķināŔanai (no manas piezÄ«mju grāmatiņas)

1. spēle

  • Platforma: Windows (pārbaudÄ«ts operētājsistēmā Windows 7, 10)
  • Valoda: Es domāju, ka tas bija rakstÄ«ts tÄ«rā C valodā
  • Spēles dzinējs: Windows konsole
  • Iedvesma: javidx9
  • Repozitorijs: GitHub

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
VienkārÅ”a čūskas spēle

3D aina nav spēle. Turklāt 3D objektu (Ä«paÅ”i rakstzÄ«mju) modelÄ“Å”ana un animÄ“Å”ana ir ilga un sarežģīta. Paspēlējoties ar VienotÄ«bu, sapratu, ka jāturpina, pareizāk sakot, jāsāk no pamatiem. Kaut kas vienkārÅ”s un ātrs, bet tajā paŔā laikā globāls, lai saprastu paÅ”u spēļu uzbÅ«vi.

Un kas mums ir vienkārÅ”s un ātrs? TieÅ”i tā, konsole un 2D. PrecÄ«zāk, pat konsole un simboli. Atkal sāku meklēt iedvesmu internetā (vispār internetu uzskatu par XNUMX. gadsimta revolucionārāko un bÄ«stamāko izgudrojumu). Es izraku video ar vienu programmētāju, kurÅ” izveidoja konsoli Tetris. Un savas spēles lÄ«dzÄ«bā viņŔ nolēma nocirst "čūsku". No video es uzzināju par divām fundamentālām lietām - spēles cilpu (ar trim pamatfunkcijām / daļām) un izvadi uz buferi.

Spēles cilpa varētu izskatÄ«ties Ŕādi:

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

Kods vienlaikus parāda visu galveno () funkciju. Un spēles cikls sākas pēc atbilstoŔā komentāra. Ciklā ir trÄ«s pamatfunkcijas: Input (), Logic (), Draw (). Pirmkārt, ievades datu ievade (galvenokārt taustiņu nospieÅ”anas kontrole), pēc tam ievadÄ«to datu apstrāde LoÄ£ika, pēc tam attēloÅ”ana uz ekrāna - Draw. Un tā katrs kadrs. Animācija tiek veidota Ŕādā veidā. Tas ir kā karikatÅ«ras. Parasti ievades datu apstrāde aizņem visvairāk laika un, cik man zināms, nosaka spēles kadru ātrumu. Bet Å”eit funkcija Logic () ir ļoti ātra. Tāpēc kadru nomaiņas ātrums ir jākontrolē, izmantojot funkciju Sleep() ar parametru gameSpeed, kas nosaka Å”o ātrumu.

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
spēļu cikls. Čūsku programmÄ“Å”ana piezÄ«mju grāmatiņā

Ja izstrādājat simbolisku konsoles spēli, tad datu parādÄ«Å”ana ekrānā, izmantojot parasto straumes izvadi 'cout', nedarbosies - tas ir ļoti lēns. Tāpēc izvade jāveic ekrāna buferÄ«. Tik daudz ātrāk, un spēle darbosies bez traucējumiem. GodÄ«gi sakot, es Ä«sti nesaprotu, kas ir ekrāna buferis un kā tas darbojas. Bet es te doÅ”u koda piemēru, un varbÅ«t kāds komentāros varēs noskaidrot situāciju.

Ekrāna bufera iegūŔana (ja tā drīkst teikt):

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

TieŔa izvade uz noteiktas līnijas scoreLine ekrānu (rinda rezultātu parādīŔanai):

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

Teorētiski Å”ajā spēlē nav nekā sarežģīta, man tas Ŕķiet labs sākuma lÄ«meņa spēles piemērs. Kods ir ierakstÄ«ts vienā failā un sakārtots vairākās funkcijās. Nav Ŕķiru, nav mantojuma. JÅ«s pats varat redzēt visu spēles avota kodā, dodoties uz GitHub repozitoriju.

2. spēle Trakie tanki

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Spēle Crazy Tanks

RakstzÄ«mju drukāŔana konsolē, iespējams, ir vienkārŔākā lieta, ko varat pārvērst par spēli. Bet tad parādās viena problēma: rakstzÄ«mēm ir atŔķirÄ«gs augstums un platums (augstums ir lielāks par platumu). Tādējādi viss izskatÄ«sies nesamērÄ«gi, un kustÄ«ba uz leju vai augÅ”up ŔķitÄ«s daudz ātrāka nekā kustÄ«ba pa kreisi vai pa labi. Å is efekts ir ļoti pamanāms "Čūskā" (1. spēle). "Tankiem" (2. spēle) nav Ŕāda trÅ«kuma, jo tur izvade tiek organizēta, krāsojot ekrāna pikseļus ar dažādām krāsām. Varētu teikt, ka uzrakstÄ«ju renderētāju. Tiesa, Å”is jau ir nedaudz sarežģītāks, lai gan daudz interesantāks.

Å ai spēlei pietiks, lai aprakstÄ«tu manu sistēmu pikseļu parādÄ«Å”anai ekrānā. Manuprāt, Ŕī ir spēles galvenā daļa. Un visu pārējo jÅ«s varat izdomāt pats.

Tātad ekrānā redzamais ir tikai kustīgu krāsainu taisnstūru kopums.

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Taisnstūra komplekts

Katru taisnstÅ«ri attēlo matrica, kas piepildÄ«ta ar cipariem. Starp citu, varu izcelt vienu interesantu niansi ā€“ visas matricas spēlē ir ieprogrammētas kā viendimensionāls masÄ«vs. Nevis divdimensionāls, bet viendimensionāls! Ar viendimensijas masÄ«viem ir daudz vieglāk un ātrāk strādāt.

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Spēles tvertnes matricas piemērs

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Spēles tvertnes matricas attēlojums ar viendimensiju masīvu

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Ilustratīvāks piemērs matricas attēlojumam ar viendimensijas masīvu

Bet piekļuve masīva elementiem notiek dubultā cilpā, it kā tas nebūtu viendimensionāls, bet gan divdimensiju masīvs. Tas tiek darīts, jo mēs joprojām strādājam ar matricām.

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Viendimensijas masÄ«va ŔķērsoÅ”ana dubultā cilpā. Y ir rindas ID, X ir kolonnas ID

LÅ«dzu, ņemiet vērā, ka parasto matricas identifikatoru i, j vietā es izmantoju identifikatorus x un y. Tātad, man Ŕķiet, acij tÄ«kamāk un smadzenēm skaidrāk. Turklāt Ŕāds apzÄ«mējums ļauj ērti projicēt izmantotās matricas uz divdimensiju attēla koordinātu asÄ«m.

Tagad par pikseļiem, krāsām un displeju. Izvadei tiek izmantota funkcija StretchDIBits (galvene: windows.h; bibliotēka: gdi32.lib). Cita starpā Å”ai funkcijai tiek nodots: ierÄ«ce, kurā tiek parādÄ«ts attēls (manā gadÄ«jumā tā ir Windows konsole), attēla parādÄ«Å”anas sākuma koordinātas, tā platums/augstums un attēls pati bitkartes (bitkartes) formā, ko attēlo baitu masÄ«vs. Bitkarte kā baitu masÄ«vs!

Funkcija StretchDIBits() darbojas:

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

Atmiņa Å”ai bitkartei tiek pieŔķirta iepriekÅ”, izmantojot funkciju VirtualAlloc(). Tas ir, nepiecieÅ”amais baitu skaits ir rezervēts, lai saglabātu informāciju par visiem pikseļiem, kas pēc tam tiks parādÄ«ti ekrānā.

m_p_bitmapMemory bitkartes izveide:

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

Aptuveni runājot, bitkarte sastāv no pikseļu kopas. Katrs četri baiti masīvā ir RGB pikseļi. Viens baits katrai sarkanajai vērtībai, viens baits katrai zaļajai vērtībai (G) un viens baits katrai zilajai krāsai (B). Turklāt katrā ievilkumā ir viens baits. Šīs trīs krāsas - Red / Green / Blue (RGB) - tiek sajauktas savā starpā dažādās proporcijās - un tiek iegūta iegūtā pikseļu krāsa.

Tagad atkal katrs taisnstÅ«ris vai spēles objekts tiek attēlots ar skaitļu matricu. Visi Å”ie spēles objekti ir ievietoti kolekcijā. Un tad tie tiek novietoti spēles laukumā, veidojot vienu lielu skaitlisku matricu. Es kartēju katru matricas skaitli ar noteiktu krāsu. Piemēram, cipars 8 ir zils, cipars 9 ir dzeltens, cipars 10 ir tumÅ”i pelēks utt. Tādējādi mēs varam teikt, ka mums ir spēles lauka matrica, kur katrs skaitlis ir sava veida krāsa.

Tātad, no vienas puses, mums ir visa spēles lauka skaitliskā matrica un, no otras puses, bitkarte attēla parādÄ«Å”anai. Pagaidām bitkarte ir "tukÅ”a" ā€“ tajā vēl nav informācijas par vēlamās krāsas pikseļiem. Tas nozÄ«mē, ka pēdējais solis bÅ«s bitkartes aizpildÄ«Å”ana ar informāciju par katru pikseļu, pamatojoties uz spēles lauka skaitlisko matricu. IlustratÄ«vs Ŕādas transformācijas piemērs ir attēlā zemāk.

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Piemērs bitkartes (pikseļu matricas) aizpildÄ«Å”anai ar informāciju, kuras pamatā ir spēles lauka skaitliskā matrica (digitālā matrica) (krāsu indeksi nesakrÄ«t ar spēles rādÄ«tājiem)

Es arÄ« iepazÄ«stināŔu ar reālu kodu no spēles. MainÄ«gajam colorIndex katrā cilpas iterācijā tiek pieŔķirta vērtÄ«ba (krāsu indekss) no spēles lauka skaitliskās matricas (mainDigitalMatrix). Pēc tam pati krāsa tiek ierakstÄ«ta krāsu mainÄ«gajā, pamatojoties uz indeksu. Turklāt iegÅ«tā krāsa tiek sadalÄ«ta sarkanās, zaļās un zilās (RGB) attiecÄ«bās. Un kopā ar atkāpi (pixelPadding) Ŕī informācija tiek ierakstÄ«ta pikselÄ« atkal un atkal, veidojot krāsainu attēlu bitkartē.

Kods izmanto norādes un bitu darbÄ«bas, kuras var bÅ«t grÅ«ti saprast. Tāpēc iesaku kaut kur atseviŔķi izlasÄ«t, kā Ŕādas struktÅ«ras darbojas.

Bitkartes aizpildÄ«Å”ana ar informāciju, pamatojoties uz spēles lauka skaitlisko matricu:

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

Saskaņā ar iepriekÅ” aprakstÄ«to metodi Crazy Tanks spēlē tiek izveidots viens attēls (rāmis), kas tiek parādÄ«ts ekrānā funkcijā Draw(). Pēc taustiņsitienu reÄ£istrÄ“Å”anas funkcijā Input() un to turpmākās apstrādes funkcijā Logic() veidojas jauns attēls (rāmis). Tiesa, spēles objektiem jau var bÅ«t cita pozÄ«cija spēles laukumā un attiecÄ«gi tie tiek zÄ«mēti citā vietā. Tā notiek animācija (kustÄ«ba).

Teorētiski (ja jÅ«s neko neesat aizmirsis), lai izprastu spēles cilpu no pirmās spēles (ā€œSnakeā€) un pikseļu parādÄ«Å”anas sistēmu ekrānā no otrās spēles (ā€œTanksā€), ir viss, kas jums nepiecieÅ”ams, lai uzrakstÄ«tu jebkuru no jÅ«su 2D spēlēm operētājsistēmai Windows. Bez skaņas! šŸ˜‰ Pārējās daļas ir tikai iedomas lidojums.

Protams, spēle "Tanks" ir izstrādāta daudz sarežģītāk nekā "Čūska". Es jau izmantoju C++ valodu, tas ir, aprakstÄ«ju dažādus spēļu objektus ar klasēm. Es izveidoju savu kolekciju - kodu var redzēt headers/Box.h. Starp citu, kolekcijai, visticamāk, ir atmiņas noplÅ«de. Lietotas norādes. Strādāja ar atmiņu. Jāsaka, ka grāmata man ļoti palÄ«dzēja. C++ sākums, izmantojot spēļu programmÄ“Å”anu. Å is ir lielisks sākums C++ iesācējiem. Tas ir mazs, interesants un labi organizēts.

Å Ä«s spēles izstrāde aizņēma apmēram seÅ”us mēneÅ”us. RakstÄ«ju galvenokārt pusdienu un uzkodu laikā darbā. ViņŔ sēdēja biroja virtuvē, stutēja ar ēdienu un rakstÄ«ja kodu. Vai arÄ« mājās vakariņās. Tā nu man sanāca tādi "virtuves kari". Kā vienmēr aktÄ«vi izmantoju piezÄ«mju grāmatiņu, un tajā dzima visas konceptuālās lietas.

Praktiskās daļas beigās izvilkÅ”u dažus savas piezÄ«mju grāmatiņas skenējumus. ParādÄ«t, ko tieÅ”i es pierakstÄ«ju, zÄ«mēju, skaitÄ«ju, projektēju...

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Tvertnes attēla dizains. Un definīcija par to, cik pikseļu katrai tvertnei vajadzētu aizņemt ekrānā

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Algoritma un formulu aprēķins tvertnes grieÅ”anai ap savu asi

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Manas kolekcijas diagramma (visticamāk, ar atmiņas noplūdi). Kolekcija ir izveidota kā saistītais saraksts

DevOps C++ un "virtuves kari" jeb Kā es sāku rakstÄ«t spēles Ä“Å”anas laikā
Un tie ir veltīgi mēģinājumi ieskrūvēt spēlē mākslīgo intelektu

Š¢ŠµŠ¾Ń€Šøя

"Pat tūkstoŔ jūdžu ceļojums sākas ar pirmo soli" (Senās ķīnieŔu gudrības)

Pārejam no prakses uz teoriju! Kā atrodi laiku savam hobijam?

  1. Nosakiet, ko jÅ«s patieŔām vēlaties (diemžēl tas ir visgrÅ«tākais).
  2. Nosakiet prioritātes.
  3. Upurē visu "lieko" augstāku prioritāŔu vārdā.
  4. Katru dienu virzieties uz saviem mērķiem.
  5. Negaidiet, ka hobijam būs divas vai trīs stundas brīva laika.

No vienas puses, jums ir jānosaka, ko vēlaties, un jānosaka prioritāte. No otras puses, ir iespējams atteikties no dažiem gadÄ«jumiem / projektiem par labu Ŕīm prioritātēm. Citiem vārdiem sakot, jums bÅ«s jāupurē viss "liekais". Kaut kur dzirdēju, ka dzÄ«vē jābÅ«t maksimāli trim galvenajām aktivitātēm. Tad jÅ«s varēsiet ar tiem tikt galā vislabākajā iespējamajā veidā. Un papildu projekti/virzieni sāks pārslodzes. Bet tas viss, iespējams, ir subjektÄ«vi un individuāli.

Ir zināms zelta likums: nekad nav 0% dienas! Es par to uzzināju indie izstrādātāja rakstā. Ja strādājat pie projekta, dariet kaut ko lietas labā katru dienu. Un tas nav svarÄ«gi, cik daudz jÅ«s nopelnāt. Uzrakstiet vienu vārdu vai vienu koda rindiņu, noskatieties vienu mācÄ«bu video vai ieduriet vienu naglu tāfelē ā€” vienkārÅ”i dariet kaut ko. GrÅ«tākais ir sākt. Kad sāksit, iespējams, darÄ«sit nedaudz vairāk, nekā gribējāt. Tātad jÅ«s pastāvÄ«gi virzÄ«sities uz savu mērÄ·i un, ticiet man, ļoti ātri. Galu galā galvenā visu lietu bremze ir vilcināŔanās.

Un ir svarÄ«gi atcerēties, ka nevajadzētu par zemu novērtēt un ignorēt brÄ«vās laika "zāģu skaidas" 5, 10, 15 minÅ«tēs, gaidÄ«t kādu lielu "baļķi", kas ilgst stundu vai divas. Vai jÅ«s stāvat rindā? Padomājiet par kaut ko savam projektam. Vai jÅ«s dodaties augŔā pa eskalatoru? Pierakstiet kaut ko piezÄ«mju grāmatiņā. Vai tu ēd autobusā? Labi, izlasi kādu rakstu. Izmantojiet katru iespēju. Pārtrauciet skatÄ«ties kaÄ·us un suņus pakalpojumā YouTube! Nejauciet smadzenes!

Un pēdējais. Ja pēc Ŕī raksta izlasÄ«Å”anas jums patika ideja izveidot spēles, neizmantojot spēļu dzinējus, atcerieties vārdu Keisijs Muratori. Å im puisim ir mājas lapa. Sadaļā "skatÄ«ties -> IEPRIEKŠĒJĀS SĒRIJAS" jÅ«s atradÄ«siet pārsteidzoÅ”as bezmaksas video pamācÄ«bas par to, kā izveidot profesionālu spēli no nulles. JÅ«s varat uzzināt vairāk piecās C intro nodarbÄ«bās operētājsistēmai Windows nekā piecu gadu laikā, mācoties universitātē (kāds par to rakstÄ«ja komentāros zem videoklipa).

Keisijs arÄ« paskaidro, ka, izstrādājot savu spēļu dzinēju, jÅ«s labāk izpratÄ«sit visus esoÅ”os dzinējus. Ietvaru pasaulē, kur visi cenÅ”as automatizēt, jÅ«s uzzināsiet, kā izveidot, nevis izmantot. Izprast datoru bÅ«tÄ«bu. Un jÅ«s kļūsiet arÄ« daudz inteliÄ£entāks un nobrieduŔāks programmētājs - profesionālis.

Veiksmi izvēlētajā ceļā! Un padarīsim pasauli profesionālāku.

Autors: Grankins Andrejs, DevOps



Avots: www.habr.com