DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula

"Ninajua kuwa sijui chochote" Socrates

Kwa nani: kwa watu wa IT ambao hutemea watengenezaji wote na wanataka kucheza michezo yao!

Kuhusu nini: jinsi ya kuanza kuandika michezo katika C/C++ ikiwa unahitaji!

Kwa nini unapaswa kusoma hii: Ukuzaji wa programu sio utaalam wangu wa kazi, lakini ninajaribu kuweka nambari kila wiki. Kwa sababu napenda michezo!

Habari Jina langu ni Andrey Grankin, Mimi ni DevOps katika Luxoft. Ukuzaji wa programu sio utaalam wangu wa kazi, lakini ninajaribu kuweka nambari kila wiki. Kwa sababu napenda michezo!

Sekta ya michezo ya kompyuta ni kubwa, ambayo ina uvumi zaidi leo kuliko tasnia ya sinema. Michezo imeandikwa tangu mwanzo wa maendeleo ya kompyuta, kwa kutumia, kwa viwango vya kisasa, njia ngumu na za msingi za maendeleo. Baada ya muda, injini za mchezo zilianza kuonekana na picha zilizopangwa tayari, fizikia na sauti. Wanakuwezesha kuzingatia maendeleo ya mchezo yenyewe na usijisumbue kuhusu msingi wake. Lakini pamoja nao, pamoja na injini, watengenezaji "huenda kipofu" na kuharibu. Uzalishaji wenyewe wa michezo huwekwa kwenye conveyor. Na wingi wa uzalishaji huanza kushinda juu ya ubora wake.

Wakati huo huo, tunapocheza michezo ya watu wengine, tunazuiliwa kila wakati na maeneo, njama, wahusika, mechanics ya mchezo ambayo watu wengine walikuja nayo. Kwa hivyo niligundua kuwa ...

... ni wakati wa kuunda ulimwengu wako mwenyewe, chini yangu tu. Ulimwengu ambapo Mimi ni Baba, na Mwana, na Roho Mtakatifu!

Na ninaamini kwa dhati kwamba kwa kuandika injini yako ya mchezo na mchezo juu yake, utaweza kufungua macho yako, kuifuta madirisha na kusukuma cabin yako, kuwa programu ya uzoefu zaidi na muhimu.

Katika makala hii nitajaribu kukuambia jinsi nilianza kuandika michezo ndogo katika C / C ++, ni mchakato gani wa maendeleo na wapi ninapata wakati wa hobby katika mazingira yenye shughuli nyingi. Ni ya kibinafsi na inaelezea mchakato wa mwanzo wa mtu binafsi. Nyenzo kuhusu ujinga na imani, kuhusu picha yangu ya kibinafsi ya ulimwengu kwa sasa. Kwa maneno mengine, "Utawala hauwajibiki kwa akili zako za kibinafsi!".

Mazoezi

"Maarifa bila mazoezi hayafai, mazoezi bila maarifa ni hatari." Confucius

Daftari yangu ni maisha yangu!


Kwa hiyo, kwa mazoezi, naweza kusema kwamba kila kitu kwangu huanza na daftari. Siandiki tu kazi zangu za kila siku huko, lakini pia kuchora, programu, chati za muundo na kutatua shida, pamoja na zile za hesabu. Tumia daftari kila wakati na uandike na penseli pekee. Ni safi, vizuri na ya kuaminika, IMHO.

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Daftari yangu (tayari imejazwa). Hivi ndivyo inavyoonekana. Ina kazi za kila siku, mawazo, michoro, michoro, ufumbuzi, uwekaji hesabu nyeusi, kanuni, na kadhalika.

Katika hatua hii, niliweza kukamilisha miradi mitatu (hii ni katika ufahamu wangu wa "mwisho", kwa sababu bidhaa yoyote inaweza kuendelezwa kwa kiasi kikubwa).

  • Mradi 0: hili ni tukio la Mbunifu Demo 3D lililoandikwa kwa C# kwa kutumia injini ya mchezo wa Unity. Kwa majukwaa ya macOS na Windows.
  • Mchezo wa 1: mchezo wa console Nyoka Rahisi (inayojulikana kwa kila mtu kama "Nyoka") kwa Windows. iliyoandikwa katika C.
  • Mchezo wa 2: mchezo wa console Crazy Tank (inayojulikana kwa kila mtu kama "Mizinga"), tayari imeandikwa katika C ++ (kwa kutumia madarasa) na pia chini ya Windows.

Mradi 0 Onyesho la Mbunifu

  • Jukwaa: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Lugha: C#
  • Injini ya mchezo: Umoja
  • Msukumo: Darrin Lile
  • Hifadhi: GitHub

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Onyesho la Mbunifu wa Scene ya 3D

Mradi wa kwanza haukutekelezwa kwa C/C++, lakini katika C# kwa kutumia injini ya mchezo wa Unity. Injini hii haikuwa ya kuhitaji sana kwenye vifaa kama Unreal Engine, na pia ilionekana kwangu kuwa rahisi kusakinisha na kutumia. Sikuzingatia injini zingine.

Lengo katika Umoja kwangu halikuwa kuendeleza aina fulani ya mchezo. Nilitaka kuunda tukio la 3D na aina fulani ya mhusika. Yeye, au tuseme Yeye (niliiga msichana ambaye nilikuwa nikimpenda =) alilazimika kusonga na kuingiliana na ulimwengu wa nje. Ilikuwa muhimu tu kuelewa Umoja ni nini, mchakato wa maendeleo ni nini, na ni juhudi ngapi inachukua kuunda kitu. Hivi ndivyo mradi wa Demo ya Mbunifu ulivyozaliwa (jina lilivumbuliwa karibu kutoka kwa ng'ombe). Kupanga, kuiga mfano, uhuishaji, kutuma maandishi kulinichukua pengine miezi miwili ya kazi ya kila siku.

Nilianza na video za mafunzo kwenye YouTube kuhusu jinsi ya kuunda miundo ya 3D ndani Blender. Blender ni zana nzuri ya bure ya uundaji wa 3D (na zaidi) ambayo hauitaji usakinishaji. Na hapa mshtuko uliningoja ... Inageuka kuwa modeli, uhuishaji, maandishi ni mada kubwa tofauti ambayo unaweza kuandika vitabu. Hii ni kweli hasa kwa wahusika. Ili kuiga vidole, meno, macho na sehemu nyingine za mwili, utahitaji ujuzi wa anatomy. Misuli ya uso imepangwaje? Je, watu wanahamaje? Ilinibidi "kuingiza" mifupa katika kila mkono, mguu, kidole, vifundo!

Mfano clavicle, levers ziada mfupa, ili uhuishaji inaonekana asili. Baada ya masomo kama haya, unatambua kazi kubwa sana ambayo waundaji wa filamu za uhuishaji hufanya, kuunda sekunde 30 za video. Lakini filamu za 3D hudumu kwa saa! Na kisha tunatoka kwenye sinema na kusema kitu kama: "Ta, katuni / sinema mbaya! Wangefanya vizuri zaidi…” Wapumbavu!

Na jambo moja zaidi kuhusu programu katika mradi huu. Kama ilivyotokea, sehemu ya kuvutia zaidi kwangu ilikuwa ile ya hisabati. Ukiendesha tukio (kiungo cha hazina katika maelezo ya mradi), utaona kwamba kamera inazunguka mhusika msichana katika nyanja. Ili kupanga mzunguko wa kamera kama hiyo, ilinibidi kwanza kuhesabu kuratibu za sehemu ya msimamo kwenye mduara (2D), na kisha kwenye nyanja (3D). Jambo la kufurahisha ni kwamba nilichukia hesabu shuleni na nilijua kwa minus. Kwa sehemu, labda, kwa sababu shuleni hawakuelezei jinsi hesabu hii inavyotumika maishani. Lakini unapozingatia lengo lako, ndoto, basi akili inafutwa, imefunuliwa! Na unaanza kugundua kazi ngumu kama adha ya kufurahisha. Na kisha unafikiri: "Sawa, kwa nini * mwanahisabati mpendwa * hakuweza kusema kwa kawaida ambapo fomula hizi zinaweza kutegemea?".

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Uhesabuji wa fomula za kuhesabu kuratibu za nukta kwenye duara na kwenye nyanja (kutoka kwa daftari langu)

Mchezo 1

  • Jukwaa: Windows (iliyojaribiwa kwenye Windows 7, 10)
  • Lugha: Nadhani iliandikwa kwa C safi
  • Injini ya mchezo: Windows console
  • Msukumo: javidx9
  • Hifadhi: GitHub

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Mchezo rahisi wa nyoka

Tukio la 3D sio mchezo. Kwa kuongeza, kuiga na kuhuisha vitu vya 3D (hasa wahusika) ni ndefu na ngumu. Baada ya kucheza na Umoja, niligundua kwamba nilipaswa kuendelea, au tuseme kuanza, kutoka kwa misingi. Kitu rahisi na ya haraka, lakini wakati huo huo kimataifa, kuelewa muundo sana wa michezo.

Na tuna nini rahisi na haraka? Hiyo ni kweli, console na 2D. Kwa usahihi, hata console na alama. Tena, nilianza kutafuta msukumo kwenye mtandao (kwa ujumla, ninaona mtandao kuwa uvumbuzi wa mapinduzi na hatari zaidi wa karne ya XNUMX). Nilichimba video ya mtayarishaji programu mmoja aliyetengeneza console Tetris. Na kwa mfano wa mchezo wake, aliamua kukata "nyoka". Kutoka kwa video hiyo, nilijifunza juu ya vitu viwili vya msingi - kitanzi cha mchezo (na kazi / sehemu tatu za msingi) na matokeo kwa bafa.

Kitanzi cha mchezo kinaweza kuonekana kama hii:

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

Nambari inawasilisha kazi kuu kuu () mara moja. Na mzunguko wa mchezo huanza baada ya maoni yanayolingana. Kuna vipengele vitatu vya msingi kwenye kitanzi: Ingizo(), Mantiki(), Chora(). Kwanza, Ingizo la data ya pembejeo (hasa udhibiti wa vibonye), kisha usindikaji wa data iliyoingia Mantiki, kisha kuonyesha kwenye skrini - Chora. Na hivyo kila sura. Uhuishaji umeundwa kwa njia hii. Ni kama katuni. Kawaida kuchakata data ya ingizo huchukua muda mwingi na, nijuavyo, huamua kasi ya fremu ya mchezo. Lakini hapa kazi ya Logic() ni haraka sana. Kwa hivyo, kasi ya fremu lazima idhibitiwe na kipengele cha Kulala() chenye kigezo cha Kasi ya mchezo, ambacho huamua kiwango hiki.

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
mzunguko wa mchezo. Kupanga nyoka kwenye notepad

Ikiwa unaunda mchezo wa kiweko wa mfano, basi kuonyesha data kwenye skrini kwa kutumia mkondo wa kawaida wa kutoa 'cout' haitafanya kazi - ni polepole sana. Kwa hivyo, pato lazima lifanyike kwenye bafa ya skrini. Kwa haraka sana na mchezo utafanya kazi bila glitches. Kuwa mkweli, sielewi kabisa buffer ya skrini ni nini na jinsi inavyofanya kazi. Lakini nitatoa mfano wa kificho hapa, na labda mtu katika maoni ataweza kufafanua hali hiyo.

Kupata bafa ya skrini (ikiwa naweza kusema hivyo):

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

Pato la moja kwa moja kwenye skrini ya Mstari fulani wa alama (mstari wa kuonyesha alama):

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

Kwa nadharia, hakuna kitu ngumu katika mchezo huu, inaonekana kwangu mfano mzuri wa mchezo wa ngazi ya kuingia. Nambari imeandikwa katika faili moja na kupangwa katika kazi kadhaa. Hakuna madarasa, hakuna urithi. Wewe mwenyewe unaweza kuona kila kitu kwenye msimbo wa chanzo wa mchezo kwa kwenda kwenye hazina kwenye GitHub.

Mchezo 2 Crazy mizinga

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Crazy mizinga mchezo

Kuchapisha wahusika kwenye koni labda ni jambo rahisi zaidi unaweza kugeuza kuwa mchezo. Lakini basi shida moja inaonekana: wahusika wana urefu na upana tofauti (urefu ni mkubwa zaidi kuliko upana). Kwa hivyo, kila kitu kitaonekana kisicho sawa, na kusonga chini au juu kutaonekana haraka zaidi kuliko kusonga kushoto au kulia. Athari hii inaonekana sana katika "Nyoka" (Mchezo 1). "Mizinga" (Mchezo wa 2) hawana upungufu huo, kwani pato huko hupangwa kwa kuchora saizi za skrini na rangi tofauti. Unaweza kusema niliandika mtoaji. Ukweli, hii tayari ni ngumu zaidi, ingawa inavutia zaidi.

Kwa mchezo huu, itatosha kuelezea mfumo wangu wa kuonyesha saizi kwenye skrini. Nadhani hii ndio sehemu kuu ya mchezo. Na kila kitu kingine unaweza kuja na wewe mwenyewe.

Kwa hivyo, unachokiona kwenye skrini ni seti tu ya mistatili ya rangi inayosonga.

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Seti ya mstatili

Kila mstatili unawakilishwa na matrix iliyojaa nambari. Kwa njia, ninaweza kuangazia nuance moja ya kuvutia - matiti yote kwenye mchezo yamepangwa kama safu ya mwelekeo mmoja. Sio mbili-dimensional, lakini moja-dimensional! Safu zenye mwelekeo mmoja ni rahisi zaidi na haraka kufanya kazi nazo.

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Mfano wa matrix ya tank ya mchezo

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Inawakilisha Matrix ya Tangi ya Mchezo yenye Safu ya Umbo Moja

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Mfano wa kielelezo zaidi wa uwakilishi wa matrix kwa safu ya mwelekeo mmoja

Lakini upatikanaji wa vipengele vya safu hutokea kwa kitanzi mara mbili, kana kwamba sio moja-dimensional, lakini safu mbili-dimensional. Hii inafanywa kwa sababu bado tunafanya kazi na matrices.

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Kupitia safu ya mwelekeo mmoja katika kitanzi mara mbili. Y ni kitambulisho cha safu mlalo, X ni kitambulisho cha safu wima

Tafadhali kumbuka kuwa badala ya vitambulishi vya kawaida vya matrix i, j, ninatumia vitambulisho x na y. Kwa hiyo, inaonekana kwangu, zaidi ya kupendeza kwa jicho na wazi kwa ubongo. Kwa kuongezea, nukuu kama hiyo hufanya iwezekane kupanga matiti zinazotumiwa kwa urahisi kwenye shoka za kuratibu za picha ya pande mbili.

Sasa kuhusu saizi, rangi na onyesho. Chaguo za kukokotoa za StretchDIBits (Kichwa: windows.h; Maktaba: gdi32.lib) hutumika kutoa matokeo. Miongoni mwa mambo mengine, yafuatayo yanapitishwa kwa kazi hii: kifaa ambacho picha inaonyeshwa (kwa upande wangu, hii ni console ya Windows), kuratibu za mwanzo wa kuonyesha picha, upana / urefu wake, na picha. yenyewe katika mfumo wa bitmap (bitmap), inayowakilishwa na safu ya baiti. Bitmap kama safu ya ka!

Kitendaji cha StretchDIBits() kazini:

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

Kumbukumbu imetengwa mapema kwa bitmap hii kwa kutumia chaguo la kukokotoa la VirtualAlloc(). Hiyo ni, nambari inayotakiwa ya byte imehifadhiwa ili kuhifadhi habari kuhusu saizi zote, ambazo zitaonyeshwa kwenye skrini.

Kuunda bitmap ya 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);

Kwa kusema, bitmap ina seti ya saizi. Kila baiti nne katika safu ni saizi ya RGB. Baiti moja kwa kila thamani nyekundu, baiti moja kwa kila thamani ya kijani (G), na baiti moja kwa kila rangi ya bluu (B). Zaidi, kuna baiti moja kwa kila ujongezaji ndani. Rangi hizi tatu - Nyekundu / Kijani / Bluu (RGB) - zimechanganywa na kila mmoja kwa idadi tofauti - na rangi ya saizi inayopatikana hupatikana.

Sasa, tena, kila mstatili, au kitu cha mchezo, kinawakilishwa na matriki ya nambari. Vitu hivi vyote vya mchezo vimewekwa kwenye mkusanyiko. Na kisha huwekwa kwenye uwanja, na kutengeneza matrix moja kubwa ya nambari. Niliweka kila nambari kwenye tumbo kwa rangi maalum. Kwa mfano, nambari ya 8 ni bluu, nambari 9 ni ya manjano, nambari 10 ni kijivu giza, na kadhalika. Kwa hivyo, tunaweza kusema kwamba tunayo matrix ya uwanja, ambapo kila nambari ni aina fulani ya rangi.

Kwa hivyo, tunayo matrix ya nambari ya uwanja mzima wa kucheza kwa upande mmoja na bitmap ya kuonyesha picha kwa upande mwingine. Hadi sasa, bitmap ni "tupu" - bado haina taarifa kuhusu saizi za rangi inayotaka. Hii ina maana kwamba hatua ya mwisho itakuwa ikijaza bitmap taarifa kuhusu kila pikseli kulingana na matrix ya nambari ya uwanja. Mfano wa kielelezo wa mabadiliko kama haya upo kwenye picha hapa chini.

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Mfano wa kujaza bitmap (Pixel matrix) na maelezo kulingana na matrix ya nambari (Digital matrix) ya uwanja (fahirisi za rangi hazilingani na fahirisi za mchezo)

Pia nitawasilisha kipande cha msimbo halisi kutoka kwa mchezo. Kielezo cha rangi tofauti katika kila marudio ya kitanzi hupewa thamani (kiashiria cha rangi) kutoka kwa mkusanyiko wa nambari wa sehemu ya kuchezea (mainDigitalMatrix). Kisha rangi yenyewe imeandikwa kwa kutofautiana kwa rangi kulingana na index. Zaidi ya hayo, rangi inayotokana imegawanywa katika uwiano wa nyekundu, kijani na bluu (RGB). Na pamoja na indent (pixelPadding), habari hii imeandikwa kwa pixel tena na tena, na kutengeneza picha ya rangi kwenye bitmap.

Nambari hutumia viashiria na shughuli za busara, ambazo zinaweza kuwa ngumu kuelewa. Kwa hivyo nakushauri usome kando mahali fulani jinsi miundo kama hiyo inavyofanya kazi.

Kujaza bitmap na habari kulingana na matrix ya nambari ya uwanja:

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

Kwa mujibu wa njia iliyoelezwa hapo juu, picha moja (fremu) huundwa kwenye mchezo wa Crazy Tanks na kuonyeshwa kwenye skrini katika kazi ya Chora (). Baada ya kusajili vibonye kwenye kitendakazi cha Input() na usindikaji wao unaofuata katika kazi ya Mantiki(), picha mpya (fremu) huundwa. Kweli, vitu vya mchezo vinaweza kuwa na nafasi tofauti kwenye uwanja wa kucheza na, ipasavyo, hutolewa mahali tofauti. Hivi ndivyo uhuishaji (harakati) hufanyika.

Kinadharia (ikiwa haujasahau chochote), kuelewa kitanzi cha mchezo kutoka kwa mchezo wa kwanza ("Nyoka") na mfumo wa kuonyesha saizi kwenye skrini kutoka kwa mchezo wa pili ("Mizinga") ndio unahitaji kuandika yoyote. ya michezo yako ya 2D kwa Windows. Isiyo na sauti! πŸ˜‰ Sehemu zingine ni za kupendeza tu.

Bila shaka, mchezo "Mizinga" imeundwa ngumu zaidi kuliko "Nyoka". Tayari nilitumia lugha ya C ++, ambayo ni, nilielezea vitu tofauti vya mchezo na madarasa. Niliunda mkusanyiko wangu mwenyewe - unaweza kuona msimbo kwenye vichwa/Box.h. Kwa njia, mkusanyiko uwezekano mkubwa una uvujaji wa kumbukumbu. Viashiria vilivyotumika. Ilifanya kazi na kumbukumbu. Lazima niseme kwamba kitabu hicho kilinisaidia sana. Kuanza C++ Kupitia Upangaji wa Mchezo. Huu ni mwanzo mzuri kwa wanaoanza katika C++. Ni ndogo, ya kuvutia na iliyopangwa vizuri.

Ilichukua takriban miezi sita kuendeleza mchezo huu. Niliandika hasa wakati wa chakula cha mchana na vitafunio kazini. Alikaa jikoni ofisini, akakanyaga chakula na kuandika kanuni. Au nyumbani kwa chakula cha jioni. Kwa hivyo nilipata "vita vya jikoni" vile. Kama kawaida, nilitumia daftari kwa bidii, na vitu vyote vya dhana vilizaliwa ndani yake.

Mwishoni mwa sehemu ya vitendo, nitatoa alama chache za daftari langu. Kuonyesha ni nini hasa nilikuwa nikiandika, kuchora, kuhesabu, kubuni…

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Ubunifu wa picha ya tank. Na ufafanuzi wa saizi ngapi kila tank inapaswa kuchukua kwenye skrini

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Uhesabuji wa algorithm na fomula za kuzunguka kwa tank karibu na mhimili wake

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Mchoro wa mkusanyiko wangu (ile iliyo na uvujaji wa kumbukumbu, uwezekano mkubwa). Mkusanyiko huundwa kama Orodha Iliyounganishwa

DevOps C++ na "vita vya jikoni", au Jinsi nilivyoanza kuandika michezo wakati wa kula
Na haya ni majaribio ya bure ya kuingiza akili bandia kwenye mchezo

Nadharia

"Hata safari ya maili elfu huanza na hatua ya kwanza" (Hekima ya Wachina wa Kale)

Wacha tuhame kutoka kwa mazoezi hadi nadharia! Unapataje wakati wa hobby yako?

  1. Amua unachotaka kweli (ole, hii ndio ngumu zaidi).
  2. Weka vipaumbele.
  3. Toa dhabihu yote "ya kupita kiasi" kwa ajili ya vipaumbele vya juu.
  4. Songa kuelekea malengo yako kila siku.
  5. Usitarajia kuwa kutakuwa na saa mbili au tatu za wakati wa bure kwa hobby.

Kwa upande mmoja, unahitaji kuamua unachotaka na kuweka kipaumbele. Kwa upande mwingine, inawezekana kuacha baadhi ya kesi/miradi kwa ajili ya vipaumbele hivi. Kwa maneno mengine, utalazimika kutoa kila kitu "kinachozidi". Nilisikia mahali fulani kwamba katika maisha kunapaswa kuwa na upeo wa shughuli tatu kuu. Kisha utaweza kukabiliana nao kwa njia bora zaidi. Na miradi/maelekezo ya ziada yataanza kupakia corny. Lakini hii yote ni, pengine, subjective na mtu binafsi.

Kuna kanuni fulani ya dhahabu: usiwe na siku 0%! Nilijifunza juu yake katika nakala ya msanidi programu wa indie. Ikiwa unafanya kazi kwenye mradi, basi fanya kitu kuhusu hilo kila siku. Na haijalishi unapata pesa ngapi. Andika neno moja au mstari mmoja wa msimbo, tazama video moja ya mafunzo, au upige msumari mmoja ubaoniβ€”fanya jambo fulani. Sehemu ngumu zaidi ni kuanza. Mara tu unapoanza, labda utafanya zaidi ya ulivyotaka. Kwa hivyo utasonga kila wakati kuelekea lengo lako na, niamini, haraka sana. Baada ya yote, breki kuu juu ya mambo yote ni kuchelewesha.

Na ni muhimu kukumbuka kwamba hupaswi kudharau na kupuuza "sawdust" ya bure ya muda katika dakika 5, 10, 15, kusubiri "magogo" makubwa ya kudumu saa moja au mbili. Je, umesimama kwenye mstari? Fikiria juu ya kitu kwa mradi wako. Je, unapanda eskaleta? Andika kitu kwenye daftari. Je, unakula kwenye basi? Sawa, soma makala fulani. Tumia kila fursa. Acha kutazama paka na mbwa kwenye YouTube! Usichanganye na ubongo wako!

Na ya mwisho. Ikiwa, baada ya kusoma nakala hii, ulipenda wazo la kuunda michezo bila kutumia injini za mchezo, basi kumbuka jina la Casey Muratori. Huyu jamaa ana tovuti. Katika sehemu ya "tazama -> VIPINDI VILIVYOPITA" utapata mafunzo ya ajabu ya video bila malipo kuhusu jinsi ya kuunda mchezo wa kitaalamu kuanzia mwanzo. Unaweza kujifunza zaidi katika Intro hadi C tano kwa masomo ya Windows kuliko katika miaka mitano ya masomo katika chuo kikuu (mtu aliandika kuhusu hili katika maoni chini ya video).

Casey pia anaelezea kuwa kwa kutengeneza injini yako ya mchezo, utakuwa na ufahamu bora wa injini zozote zilizopo. Katika ulimwengu wa mifumo, ambapo kila mtu anajaribu kujiendesha, utajifunza jinsi ya kuunda, sio kutumia. Kuelewa asili ya kompyuta. Na pia utakuwa mpangaji programu mwenye akili zaidi na mkomavu - pro.

Bahati nzuri kwenye njia uliyochagua! Na tuifanye dunia kuwa ya kitaalamu zaidi.

Mwandishi: Grankin Andrey, DevOps



Chanzo: mapenzi.com