DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies

"Unë e di se nuk di asgjë" Sokrati

Për kë: për njerëzit e IT-së që pështyjnë të gjithë zhvilluesit dhe duan të luajnë lojërat e tyre!

Rreth asaj: si të filloni të shkruani lojëra në C/C++ nëse keni nevojë!

Pse duhet ta lexoni këtë: Zhvillimi i aplikacioneve nuk është specialiteti im i punës, por përpiqem të kodoj çdo javë. Sepse i dua lojërat!

Pershendetje, emri im eshte Andrey Grankin, Unë jam një DevOps në Luxoft. Zhvillimi i aplikacioneve nuk është specialiteti im i punës, por përpiqem të kodoj çdo javë. Sepse i dua lojërat!

Industria e lojërave kompjuterike është e madhe, madje më e përfolur sot se industria e filmit. Lojërat janë shkruar që nga fillimi i zhvillimit të kompjuterëve, duke përdorur, sipas standardeve moderne, metoda komplekse dhe themelore të zhvillimit. Me kalimin e kohës, motorët e lojës filluan të shfaqen me grafikë, fizikë dhe tinguj tashmë të programuar. Ato ju lejojnë të përqendroheni në zhvillimin e vetë lojës dhe të mos shqetësoheni për themelin e saj. Por bashkë me ta, me motorët, zhvilluesit "verbohen" dhe degradojnë. Vetë prodhimi i lojërave vihet në transportues. Dhe sasia e prodhimit fillon të mbizotërojë mbi cilësinë e saj.

Në të njëjtën kohë, kur luajmë lojëra të njerëzve të tjerë, ne jemi vazhdimisht të kufizuar nga vendndodhjet, komploti, personazhet, mekanika e lojës që njerëzit e tjerë kanë dalë. Kështu kuptova se ...

… është koha për të krijuar botët tuaja, të nënshtruara vetëm ndaj meje. Botë ku unë jam Ati, Biri dhe Fryma e Shenjtë!

Dhe sinqerisht besoj se duke shkruar motorin tuaj të lojës dhe një lojë në të, do të jeni në gjendje të hapni sytë, të fshini dritaret dhe të pomponi kabinën tuaj, duke u bërë një programues më me përvojë dhe integral.

Në këtë artikull do të përpiqem t'ju tregoj se si kam filluar të shkruaj lojëra të vogla në C / C ++, cili është procesi i zhvillimit dhe ku gjej kohë për një hobi në një mjedis të ngarkuar. Ai është subjektiv dhe përshkruan procesin e një fillimi individual. Material për injorancën dhe besimin, për pamjen time personale të botës në këtë moment. Me fjalë të tjera, "administrata nuk është përgjegjëse për trurin tuaj personal!".

Praktikë

"Njohuria pa praktikë është e padobishme, praktika pa njohuri është e rrezikshme." Konfuci

Fletorja ime është jeta ime!


Pra, në praktikë, mund të them se gjithçka për mua fillon me një fletore. Unë shkruaj jo vetëm detyrat e mia të përditshme atje, por gjithashtu vizatoj, programoj, hartoj diagrame rrjedhash dhe zgjidh probleme, përfshirë ato matematikore. Përdorni gjithmonë një bllok shënimesh dhe shkruani vetëm me laps. Është i pastër, i rehatshëm dhe i besueshëm, IMHO.

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Fletorja ime (tashmë e mbushur). Kështu duket. Ai përmban detyra të përditshme, ide, vizatime, diagrame, zgjidhje, kontabilitet të zi, kod, etj.

Në këtë fazë, arrita të përfundoj tre projekte (kjo është në kuptimin tim të "përfundimit", sepse çdo produkt mund të zhvillohet relativisht pafundësisht).

  • Projekti 0: kjo është një skenë Architect Demo 3D e shkruar në C# duke përdorur motorin e lojës Unity. Për platformat macOS dhe Windows.
  • Lojë 1: lojë konsol Simple Snake (e njohur për të gjithë si "Snake") për Windows. shkruar në C.
  • Lojë 2: lojë konsol Crazy Tanks (e njohur për të gjithë si "Tanks"), e shkruar tashmë në C ++ (duke përdorur klasa) dhe gjithashtu nën Windows.

Projekti 0 Arkitekt Demo

  • Platforma: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Gjuha: C#
  • Motori i lojës: Unitet
  • Frymëzimi: Darrin Lile
  • Depoja: GitHub

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Demoja e arkitektit të skenës 3D

Projekti i parë u zbatua jo në C/C++, por në C# duke përdorur motorin e lojës Unity. Ky motor nuk ishte aq i kërkuar për harduer sa Unreal Engine, dhe gjithashtu më dukej më e lehtë për t'u instaluar dhe përdorur. Unë nuk kam marrë parasysh motorët e tjerë.

Qëllimi në Unity për mua nuk ishte të zhvilloja një lloj loje. Doja të krijoja një skenë 3D me një lloj karakteri. Ai, ose më mirë ajo (unë modelova vajzën me të cilën isha i dashuruar =) duhej të lëvizte dhe të ndërvepronte me botën e jashtme. Ishte vetëm e rëndësishme të kuptonim se çfarë është Uniteti, cili është procesi i zhvillimit dhe sa përpjekje duhet për të krijuar diçka. Kështu lindi projekti Architect Demo (emri u shpik thuajse nga budallallëqet). Programimi, modelimi, animacioni, teksturimi më mori ndoshta dy muaj punë të përditshme.

Fillova me video mësimore në YouTube se si të krijoni modele 3D në Blender. Blender është një mjet i mrekullueshëm falas për modelimin 3D (dhe më shumë) që nuk kërkon instalim. Dhe këtu më priste një tronditje ... Rezulton se modelimi, animacioni, teksturimi janë tema të mëdha të veçanta për të cilat mund të shkruani libra. Kjo është veçanërisht e vërtetë për personazhet. Për të modeluar gishtat, dhëmbët, sytë dhe pjesët e tjera të trupit, do t'ju duhet njohuri mbi anatominë. Si janë rregulluar muskujt e fytyrës? Si lëvizin njerëzit? Më duhej të "fusja" kockat në çdo krah, këmbë, gisht, nyje!

Modeloni klavikulën, leva shtesë kockore, në mënyrë që animacioni të duket i natyrshëm. Pas mësimeve të tilla, kupton se çfarë pune të madhe bëjnë krijuesit e filmave të animuar, vetëm për të krijuar 30 sekonda video. Por filmat 3D zgjasin me orë të tëra! Dhe pastaj dalim nga kinematë dhe themi diçka si: “Ta, një karikaturë / film i dëshpëruar! Ata mund të kishin bërë më mirë…” Budallenj!

Dhe një gjë tjetër në lidhje me programimin në këtë projekt. Siç doli, pjesa më interesante për mua ishte ajo matematikore. Nëse drejtoni skenën (lidhja me depon në përshkrimin e projektit), do të vini re se kamera rrotullohet rreth personazhit të vajzës në një sferë. Për të programuar një rrotullim të tillë të kamerës, më duhej të llogarisja së pari koordinatat e pikës së pozicionit në rreth (2D), dhe më pas në sferë (3D). Gjëja qesharake është se e urreja matematikën në shkollë dhe e dija me një minus. Pjesërisht, ndoshta, sepse në shkollë ata thjesht nuk ju shpjegojnë se si dreqin zbatohet kjo matematikë në jetë. Por kur jeni të fiksuar pas qëllimit tuaj, ëndërroni, atëherë mendja pastrohet, zbulohet! Dhe ju filloni t'i perceptoni detyrat komplekse si një aventurë emocionuese. Dhe pastaj ju mendoni: "Epo, pse matematikani * i dashur* nuk mund të thoshte normalisht se ku mund të mbështeten këto formula?".

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Llogaritja e formulave për llogaritjen e koordinatave të një pike në një rreth dhe në një sferë (nga fletorja ime)

Loja 1

  • Platforma: Windows (testuar në Windows 7, 10)
  • Gjuha: Unë mendoj se është shkruar në C të pastër
  • Motori i lojës: Konsola e Windows
  • Frymëzimi: javidx9
  • Depoja: GitHub

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Lojë e thjeshtë Snake

Skena 3D nuk është lojë. Përveç kësaj, modelimi dhe animimi i objekteve 3D (veçanërisht personazhet) është i gjatë dhe i vështirë. Pasi luajta me Unity, kuptova se duhej të vazhdoja, ose më mirë të filloja, nga bazat. Diçka e thjeshtë dhe e shpejtë, por në të njëjtën kohë globale, për të kuptuar vetë strukturën e lojërave.

Dhe çfarë kemi të thjeshtë dhe të shpejtë? Kjo është e drejtë, konsol dhe 2D. Më saktësisht, edhe tastiera dhe simbolet. Përsëri, fillova të kërkoja frymëzim në internet (në përgjithësi, e konsideroj internetin shpikjen më revolucionare dhe më të rrezikshme të shekullit të XNUMX-të). Nxrova një video të një programuesi që bëri konsolën Tetris. Dhe në ngjashmërinë e lojës së tij, ai vendosi të presë "gjarpërin". Nga videoja, mësova për dy gjëra themelore - lakun e lojës (me tre funksione / pjesë themelore) dhe daljen në tampon.

Laku i lojës mund të duket diçka si kjo:

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

Kodi paraqet të gjithë funksionin main() menjëherë. Dhe cikli i lojës fillon pas komentit përkatës. Ekzistojnë tre funksione bazë në lak: Input(), Logic(), Draw(). Së pari, futni të dhënat Input (kryesisht kontrolli i goditjeve të tasteve), më pas përpunimi i të dhënave të futura Logic, pastaj shfaqja në ekran - Draw. Dhe kështu çdo kornizë. Animacioni krijohet në këtë mënyrë. Është si filmat vizatimorë. Zakonisht përpunimi i të dhënave hyrëse kërkon më shumë kohë dhe, me sa di unë, përcakton shpejtësinë e kuadrove të lojës. Por këtu funksioni Logic() është shumë i shpejtë. Prandaj, shpejtësia e kornizës duhet të kontrollohet nga funksioni Sleep() me parametrin gameSpeed, i cili përcakton këtë normë.

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
cikli i lojës. Programimi i gjarpërinjve në bllokun e shënimeve

Nëse jeni duke zhvilluar një lojë simbolike të konsolës, atëherë shfaqja e të dhënave në ekran duke përdorur daljen e zakonshme të transmetimit 'cout' nuk do të funksionojë - është shumë e ngadaltë. Prandaj, dalja duhet të kryhet në buferin e ekranit. Shumë më shpejt dhe loja do të funksionojë pa defekte. Për të qenë i sinqertë, nuk e kuptoj fare se çfarë është tamponi i ekranit dhe si funksionon. Por unë do të jap një shembull kodi këtu, dhe ndoshta dikush në komente do të jetë në gjendje të sqarojë situatën.

Marrja e tamponit të ekranit (nëse mund të them kështu):

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

Dalja e drejtpërdrejtë në ekranin e një linje të caktuar të rezultateve (linja për shfaqjen e rezultateve):

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

Në teori, nuk ka asgjë të komplikuar në këtë lojë, më duket një shembull i mirë i një loje të nivelit fillestar. Kodi është i shkruar në një skedar dhe i renditur në disa funksione. Pa klasa, pa trashëgimi. Ju vetë mund të shihni gjithçka në kodin burimor të lojës duke shkuar te depoja në GitHub.

Lojë 2 Crazy Tanks

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Lojë Crazy Tanks

Printimi i karaktereve në tastierë është ndoshta gjëja më e thjeshtë që mund ta shndërroni në lojë. Por më pas shfaqet një telash: personazhet kanë lartësi dhe gjerësi të ndryshme (lartësia është më e madhe se gjerësia). Kështu, gjithçka do të duket joproporcionale, dhe lëvizja poshtë ose lart do të duket shumë më shpejt sesa lëvizja majtas ose djathtas. Ky efekt është shumë i dukshëm në "Gjarpër" (Loja 1). "Tanks" (Loja 2) nuk ka një pengesë të tillë, pasi prodhimi atje organizohet duke lyer pikselat e ekranit me ngjyra të ndryshme. Mund të thuash që kam shkruar një renderer. Vërtetë, kjo tashmë është pak më e ndërlikuar, megjithëse shumë më interesante.

Për këtë lojë, do të mjaftojë të përshkruaj sistemin tim për shfaqjen e pikselëve në ekran. Mendoj se kjo është pjesa kryesore e lojës. Dhe çdo gjë tjetër që mund ta gjeni vetë.

Pra, ajo që shihni në ekran është vetëm një grup drejtkëndëshash me ngjyra në lëvizje.

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Komplet drejtkëndësh

Çdo drejtkëndësh përfaqësohet nga një matricë e mbushur me numra. Nga rruga, mund të theksoj një nuancë interesante - të gjitha matricat në lojë janë programuar si një grup njëdimensional. Jo dydimensionale, por njëdimensionale! Vargjet njëdimensionale janë shumë më të lehta dhe më të shpejta për të punuar.

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Një shembull i matricës së tankeve të lojës

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Përfaqësimi i matricës së një rezervuari loje me një grup njëdimensional

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Një shembull më ilustrues i paraqitjes së matricës nga një grup njëdimensional

Por aksesi në elementët e grupit ndodh në një lak të dyfishtë, sikur të mos ishte një grup njëdimensional, por një grup dydimensional. Kjo është bërë sepse ne ende jemi duke punuar me matricat.

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Përshkimi i një grupi njëdimensional në një lak të dyfishtë. Y është ID e rreshtit, X është ID e kolonës

Ju lutemi vini re se në vend të identifikuesve të zakonshëm të matricës i, j, unë përdor identifikuesit x dhe y. Pra, më duket më e këndshme për syrin dhe më e qartë për trurin. Për më tepër, një shënim i tillë bën të mundur projektimin e përshtatshëm të matricave të përdorura në boshtet koordinative të një imazhi dydimensional.

Tani në lidhje me pikselët, ngjyrën dhe ekranin. Funksioni StretchDIBits (Header: windows.h; Library: gdi32.lib) përdoret për dalje. Ndër të tjera, këtij funksioni i kalohet si më poshtë: pajisja në të cilën shfaqet imazhi (në rastin tim, kjo është tastiera e Windows), koordinatat e fillimit të shfaqjes së figurës, gjerësia / lartësia e tij dhe imazhi vetë në formën e një bitmap (bitmap), e përfaqësuar nga një grup bajtësh. Bitmap si një grup bytesh!

Funksioni StretchDIBits() në punë:

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

Kujtesa ndahet paraprakisht për këtë bitmap duke përdorur funksionin VirtualAlloc(). Kjo do të thotë, numri i kërkuar i bajteve është i rezervuar për të ruajtur informacionin për të gjithë pikselët, të cilët më pas do të shfaqen në ekran.

Krijimi i një bitmap memorie m_p_bitmap:

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

Përafërsisht, një bitmap përbëhet nga një grup pikselësh. Çdo katër bajt në grup është një piksel RGB. Një bajt për vlerë të kuqe, një bajt për vlerë të gjelbër (G) dhe një bajt për ngjyrë blu (B). Plus, ka një bajt për indent. Këto tre ngjyra - e kuqe / jeshile / blu (RGB) - përzihen me njëra-tjetrën në përmasa të ndryshme - dhe fitohet ngjyra e pikselit që rezulton.

Tani, përsëri, çdo drejtkëndësh, ose objekt loje, përfaqësohet nga një matricë numrash. Të gjitha këto objekte të lojës vendosen në një koleksion. Dhe më pas ato vendosen në fushën e lojës, duke formuar një matricë të madhe numerike. Kam vënë në hartë çdo numër në matricë në një ngjyrë të caktuar. Për shembull, numri 8 është blu, numri 9 është i verdhë, numri 10 është gri i errët, etj. Kështu, mund të themi se kemi një matricë të fushës së lojës, ku çdo numër është një lloj ngjyre.

Pra, ne kemi një matricë numerike të të gjithë fushës së lojës nga njëra anë dhe një bitmap për shfaqjen e imazhit nga ana tjetër. Deri më tani, bitmap është "bosh" - nuk ka ende informacion për pikselët e ngjyrës së dëshiruar. Kjo do të thotë se hapi i fundit do të jetë plotësimi i bitmap-it me informacion për çdo piksel bazuar në matricën numerike të fushës së lojës. Një shembull ilustrues i një transformimi të tillë është në foton më poshtë.

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Një shembull i plotësimit të një bitmap (matricë pixel) me informacion të bazuar në matricën numerike (matrica dixhitale) të fushës së lojës (indekset e ngjyrave nuk përputhen me indekset në lojë)

Do të paraqes gjithashtu një pjesë të kodit të vërtetë nga loja. Variabilit colorIndex në çdo përsëritje të ciklit i caktohet një vlerë (indeksi i ngjyrave) nga matrica numerike e fushës së lojës (MainDigitalMatrix). Pastaj vetë ngjyra shkruhet në variablin e ngjyrave bazuar në indeksin. Më tej, ngjyra që rezulton ndahet në raportin e kuqe, jeshile dhe blu (RGB). Dhe së bashku me indent (pixelPadding), ky informacion i shkruhet pikselit pa pushim, duke formuar një imazh me ngjyra në bitmap.

Kodi përdor tregues dhe operacione bit, të cilat mund të jenë të vështira për t'u kuptuar. Ndaj ju këshilloj të lexoni veçmas diku se si funksionojnë struktura të tilla.

Plotësimi i një bitmap me informacion bazuar në matricën numerike të fushës së lojës:

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

Sipas metodës së përshkruar më sipër, një fotografi (kornizë) formohet në lojën Crazy Tanks dhe shfaqet në ekran në funksionin Draw(). Pas regjistrimit të goditjeve të tasteve në funksionin Input() dhe përpunimit të tyre të mëvonshëm në funksionin Logic(), formohet një fotografi (kornizë) e re. Vërtetë, objektet e lojës mund të kenë tashmë një pozicion të ndryshëm në fushën e lojës dhe, në përputhje me rrethanat, të vizatohen në një vend tjetër. Kështu ndodh animacioni (lëvizja).

Në teori (nëse nuk keni harruar asgjë), të kuptuarit e loop-it të lojës nga loja e parë (“Gjarpri”) dhe sistemi për shfaqjen e pikselëve në ekran nga loja e dytë (“Tanks”) është gjithçka që ju nevojitet për të shkruar ndonjë. nga lojërat tuaja 2D për Windows. Pa zë! 😉 Pjesa tjetër e pjesëve janë thjesht një fluturim i fantazisë.

Sigurisht, loja "Tanks" është projektuar shumë më e ndërlikuar sesa "Gjarpri". Unë kam përdorur tashmë gjuhën C++, domethënë kam përshkruar objekte të ndryshme të lojës me klasa. Kam krijuar koleksionin tim - ju mund ta shihni kodin në headers/Box.h. Nga rruga, koleksioni ka shumë të ngjarë të ketë një rrjedhje memorie. Treguesit e përdorur. Punuar me memorie. Duhet të them që libri më ndihmoi shumë. Fillimi i C++ Përmes Programimit të Lojërave. Ky është një fillim i mrekullueshëm për fillestarët në C++. Është i vogël, interesant dhe i organizuar mirë.

U deshën rreth gjashtë muaj për të zhvilluar këtë lojë. Shkruaj kryesisht gjatë drekës dhe ushqimeve në punë. Ai u ul në kuzhinën e zyrës, goditi ushqimin dhe shkroi kodin. Ose në shtëpi për darkë. Kështu që unë mora të tilla "luftëra kuzhine". Si gjithmonë, përdora në mënyrë aktive një fletore dhe në të lindën të gjitha gjërat konceptuale.

Në fund të pjesës praktike, do të nxjerr disa skanime të fletores sime. Për të treguar se çfarë saktësisht po shkruaja, duke vizatuar, duke numëruar, duke projektuar…

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Dizajni i imazhit të rezervuarit. Dhe përkufizimi se sa pikselë duhet të zërë çdo tank në ekran

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Llogaritja e algoritmit dhe formulave për rrotullimin e rezervuarit rreth boshtit të tij

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Diagrami i koleksionit tim (ai me rrjedhje memorie, ka shumë të ngjarë). Koleksioni është krijuar si një listë e lidhur

DevOps C++ dhe "luftërat e kuzhinës", ose Si fillova të shkruaj lojëra gjatë ngrënies
Dhe këto janë përpjekje të kota për të futur inteligjencën artificiale në lojë

teori

"Edhe një udhëtim prej një mijë miljesh fillon me hapin e parë" (Dituria e lashtë kineze)

Le të kalojmë nga praktika në teori! Si e gjeni kohë për hobin tuaj?

  1. Përcaktoni atë që dëshironi me të vërtetë (mjerisht, kjo është më e vështira).
  2. Vendosni prioritete.
  3. Sakrifikoni të gjitha "të tepërt" për hir të prioriteteve më të larta.
  4. Lëvizni drejt qëllimeve tuaja çdo ditë.
  5. Mos prisni që do të ketë dy ose tre orë kohë të lirë për një hobi.

Nga njëra anë, ju duhet të përcaktoni atë që dëshironi dhe t'i jepni përparësi. Nga ana tjetër, është e mundur që të braktisen disa raste/projekte në favor të këtyre prioriteteve. Me fjalë të tjera, do t'ju duhet të sakrifikoni gjithçka "të tepërt". Kam dëgjuar diku se në jetë duhet të ketë maksimumi tre aktivitete kryesore. Atëherë do të jeni në gjendje t'i trajtoni ato në mënyrën më të mirë të mundshme. Dhe projektet/udhëzimet shtesë do të fillojnë të mbingarkojnë korny. Por kjo është e gjitha, me siguri, subjektive dhe individuale.

Ekziston një rregull i caktuar i artë: kurrë mos keni një ditë 0%! Mësova për këtë në një artikull nga një zhvillues indie. Nëse jeni duke punuar në një projekt, atëherë bëni diçka për të çdo ditë. Dhe nuk ka rëndësi se sa fitoni. Shkruani një fjalë ose një rresht kodi, shikoni një video mësimore ose goditni një gozhdë në tabelë—thjesht bëni diçka. Pjesa më e vështirë është fillimi. Sapo të filloni, ndoshta do të bëni pak më shumë nga sa keni dashur. Kështu që ju do të lëvizni vazhdimisht drejt qëllimit tuaj dhe, më besoni, shumë shpejt. Në fund të fundit, frena kryesore për të gjitha gjërat është zvarritja.

Dhe është e rëndësishme të mbani mend se nuk duhet të nënvlerësoni dhe të injoroni "tallashin" e lirë të kohës në 5, 10, 15 minuta, të prisni disa "loga" të mëdha që zgjasin një ose dy orë. A jeni duke qëndruar në radhë? Mendoni për diçka për projektin tuaj. A po ngjiteni në shkallë lëvizëse? Shkruani diçka në një fletore. A hani në autobus? Mirë, lexo një artikull. Përdorni çdo mundësi. Ndaloni së shikuari mace dhe qen në YouTube! Mos u ngatërroni me trurin tuaj!

Dhe e fundit. Nëse, pasi të keni lexuar këtë artikull, ju pëlqeu ideja e krijimit të lojërave pa përdorur motorë lojërash, atëherë mbani mend emrin Casey Muratori. Ky djalë ka faqe interneti. Në seksionin "shikoni -> EPISODET E MËPARSHME" do të gjeni video mësime të mahnitshme falas se si të krijoni një lojë profesionale nga e para. Ju mund të mësoni më shumë në pesë mësime Intro to C për Windows sesa në pesë vjet studim në universitet (dikush ka shkruar për këtë në komentet nën video).

Casey shpjegon gjithashtu se duke zhvilluar motorin tuaj të lojës, do të keni një kuptim më të mirë të çdo motori ekzistues. Në botën e kornizave, ku të gjithë përpiqen të automatizojnë, ju do të mësoni se si të krijoni, jo të përdorni. Kuptoni vetë natyrën e kompjuterëve. Dhe gjithashtu do të bëheni një programues shumë më inteligjent dhe i pjekur - një profesionist.

Fat i mirë në rrugën tuaj të zgjedhur! Dhe le ta bëjmë botën më profesionale.

Author: Grankin Andrey, DevOps



Burimi: www.habr.com