DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta

"Mi wn na wn i ddim" Socrates

I bwy: i bobl TG sy'n poeri ar yr holl ddatblygwyr ac eisiau chwarae eu gemau!

Am beth: sut i ddechrau ysgrifennu gemau yn C/C ++ os oes ei angen arnoch chi!

Pam ddylech chi ddarllen hwn: Nid datblygu apiau yw fy arbenigedd gwaith, ond rwy'n ceisio codio bob wythnos. Achos dwi'n caru gemau!

helo fy enw i yw Andrey Grankin, Rwy'n DevOps yn Luxoft. Nid datblygu cymwysiadau yw fy arbenigedd gwaith, ond rwy'n ceisio codio bob wythnos. Achos dwi'n caru gemau!

Mae'r diwydiant gemau cyfrifiadurol yn enfawr, hyd yn oed yn fwy sibrydion heddiw na'r diwydiant ffilm. Mae gemau wedi'u hysgrifennu ers dechrau datblygiad cyfrifiaduron, gan ddefnyddio, yn ôl safonau modern, ddulliau datblygu cymhleth a sylfaenol. Dros amser, dechreuodd peiriannau gêm ymddangos gyda graffeg, ffiseg a sain eisoes wedi'u rhaglennu. Maent yn caniatáu ichi ganolbwyntio ar ddatblygiad y gêm ei hun a pheidio â thrafferthu am ei sylfaen. Ond ynghyd â nhw, gyda'r peiriannau, mae'r datblygwyr yn "mynd yn ddall" ac yn diraddio. Mae cynhyrchu iawn o gemau yn cael ei roi ar y cludwr. Ac mae maint y cynhyrchiad yn dechrau trechu ei ansawdd.

Ar yr un pryd, wrth chwarae gemau pobl eraill, rydyn ni'n cael ein cyfyngu'n gyson gan leoliadau, plot, cymeriadau, mecaneg gêm y mae pobl eraill wedi'u creu. Felly sylweddolais fod...

… mae'n bryd creu eich bydoedd eich hun, yn amodol i mi yn unig. Bydoedd lle yr wyf y Tad, a'r Mab, a'r Ysbryd Glân!

A chredaf yn ddiffuant, trwy ysgrifennu eich injan gêm eich hun a gêm arno, y byddwch chi'n gallu agor eich llygaid, sychu'r ffenestri a phwmpio'ch caban, gan ddod yn rhaglennydd mwy profiadol ac annatod.

Yn yr erthygl hon byddaf yn ceisio dweud wrthych sut y dechreuais ysgrifennu gemau bach yn C / C ++, beth yw'r broses ddatblygu a lle rwy'n dod o hyd i amser ar gyfer hobi mewn amgylchedd prysur. Mae'n oddrychol ac yn disgrifio'r broses o gychwyn unigol. Deunydd am anwybodaeth a ffydd, am fy llun personol o'r byd ar hyn o bryd. Mewn geiriau eraill, "Nid yw'r weinyddiaeth yn gyfrifol am eich ymennydd personol!".

Ymarfer

“Mae gwybodaeth heb ymarfer yn ddiwerth, mae ymarfer heb wybodaeth yn beryglus.” Confucius

Fy llyfr nodiadau yw fy mywyd!


Felly, yn ymarferol, gallaf ddweud bod popeth i mi yn dechrau gyda llyfr nodiadau. Rwy'n ysgrifennu nid yn unig fy nhasgau dyddiol yno, ond hefyd yn lluniadu, rhaglennu, dylunio siartiau llif a datrys problemau, gan gynnwys rhai mathemategol. Defnyddiwch bapur ysgrifennu bob amser ac ysgrifennwch â phensil yn unig. Mae'n lân, yn gyfforddus ac yn ddibynadwy, IMHO.

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Fy llyfr nodiadau (eisoes wedi'i lenwi). Dyma sut mae'n edrych. Mae'n cynnwys tasgau bob dydd, syniadau, lluniadau, diagramau, datrysiadau, cadw llyfrau du, cod, ac ati.

Ar y cam hwn, llwyddais i gwblhau tri phrosiect (mae hyn yn fy nealltwriaeth o “derfynoldeb”, oherwydd gellir datblygu unrhyw gynnyrch yn gymharol ddiddiwedd).

  • Prosiect 0: dyma olygfa 3D Demo Pensaer wedi'i hysgrifennu yn C# gan ddefnyddio injan gêm Unity. Ar gyfer llwyfannau macOS a Windows.
  • Gêm 1: gêm consol Simple Snake (sy'n hysbys i bawb fel "Neidr") ar gyfer Windows. wedi ei ysgrifennu yn C.
  • Gêm 2: gêm consol Crazy Tanciau (sy'n hysbys i bawb fel "Tanciau"), a ysgrifennwyd eisoes yn C ++ (gan ddefnyddio dosbarthiadau) a hefyd o dan Windows.

Prosiect 0 Pensaer Demo

  • Platfform: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Iaith: C#
  • Peiriant gêm: Undod
  • Ysbrydoliaeth: Darrin Lile
  • Ystorfa: GitHub

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Demo Pensaer Golygfa 3D

Gweithredwyd y prosiect cyntaf nid yn C/C++, ond yn C# gan ddefnyddio injan gêm Unity. Nid oedd yr injan hon mor feichus ar galedwedd ag Engine unreal, ac roedd hefyd yn ymddangos i mi yn haws i'w osod a'i ddefnyddio. Nid oeddwn yn ystyried injans eraill.

Nid datblygu rhyw fath o gêm oedd y nod yn Unity i mi. Roeddwn i eisiau creu golygfa 3D gyda rhyw fath o gymeriad. Roedd yn rhaid iddo ef, neu hi yn hytrach (modelais y ferch roeddwn mewn cariad â =) symud a rhyngweithio â'r byd y tu allan. Nid oedd ond yn bwysig deall beth yw Unity, beth yw'r broses ddatblygu, a faint o ymdrech y mae'n ei gymryd i greu rhywbeth. Dyma sut y cafodd y prosiect Pensaer Demo ei eni (ddyfeisiwyd yr enw bron o'r bullshit). Mae'n debyg bod rhaglennu, modelu, animeiddio, gweadu wedi cymryd dau fis o waith dyddiol i mi.

Dechreuais gyda fideos tiwtorial ar YouTube ar sut i greu modelau 3D i mewn Blender. Mae Blender yn offeryn rhad ac am ddim gwych ar gyfer modelu 3D (a mwy) nad oes angen ei osod. A dyma sioc yn fy aros ... Mae'n ymddangos bod modelu, animeiddio, gweadu yn bynciau ar wahân enfawr y gallwch chi ysgrifennu llyfrau arnynt. Mae hyn yn arbennig o wir am y cymeriadau. I fodelu bysedd, dannedd, llygaid a rhannau eraill o'r corff, bydd angen gwybodaeth am anatomeg arnoch. Sut mae cyhyrau'r wyneb wedi'u trefnu? Sut mae pobl yn symud? Roedd yn rhaid i mi “fewnosod” esgyrn ym mhob braich, coes, bys, migwrn!

Efelychu esgyrn collar, liferi asgwrn ychwanegol, fel bod yr animeiddiad yn edrych yn naturiol. Ar ôl gwersi o'r fath, rydych chi'n sylweddoli cymaint o waith y mae crewyr ffilmiau animeiddiedig yn ei wneud, dim ond i greu 30 eiliad o fideo. Ond mae ffilmiau 3D yn para am oriau! Ac wedyn rydyn ni'n dod allan o'r sinemâu a dweud rhywbeth fel: “Ta, cartŵn / ffilm shitty! Gallent fod wedi gwneud yn well…” Ffyliaid!

Ac un peth arall am raglennu yn y prosiect hwn. Fel mae'n digwydd, y rhan fwyaf diddorol i mi oedd yr un fathemategol. Os ydych chi'n rhedeg yr olygfa (dolen i'r ystorfa yn nisgrifiad y prosiect), fe sylwch fod y camera'n cylchdroi o amgylch cymeriad y ferch mewn sffêr. I raglennu cylchdro camera o'r fath, yn gyntaf roedd yn rhaid i mi gyfrifo cyfesurynnau'r pwynt lleoliad ar y cylch (2D), ac yna ar y sffêr (3D). Y peth doniol yw fy mod yn casáu mathemateg yn yr ysgol ac yn ei wybod gyda minws. Yn rhannol, mae'n debyg, oherwydd yn yr ysgol nid ydyn nhw'n esbonio i chi sut mae'r uffern hon yn cael ei chymhwyso mewn bywyd. Ond pan fyddwch chi'n obsesiwn â'ch nod, breuddwyd, yna mae'r meddwl wedi'i glirio, wedi'i ddatgelu! Ac rydych chi'n dechrau gweld tasgau cymhleth fel antur gyffrous. Ac yna rydych chi'n meddwl: “Wel, pam na allai *mathemategydd annwyl* ddweud fel arfer ble y gellir pwyso'r fformiwlâu hyn?”.

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Cyfrifo fformiwlâu ar gyfer cyfrifo cyfesurynnau pwynt ar gylch ac ar sffêr (o fy llyfr nodiadau)

Gêm 1

  • Platfform: Windows (wedi'i brofi ar Windows 7, 10)
  • Iaith: Rwy'n credu ei fod wedi'i ysgrifennu mewn C pur
  • Peiriant gêm: Consol Windows
  • Ysbrydoliaeth: javidx9
  • Ystorfa: GitHub

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Gêm Neidr Syml

Nid gêm yw'r olygfa 3D. Yn ogystal, mae modelu ac animeiddio gwrthrychau 3D (yn enwedig cymeriadau) yn hir ac yn anodd. Ar ôl chwarae o gwmpas gydag Unity, sylweddolais fod yn rhaid i mi barhau, neu yn hytrach ddechrau, o'r pethau sylfaenol. Rhywbeth syml a chyflym, ond ar yr un pryd byd-eang, i ddeall y strwythur iawn o gemau.

A beth sydd gennym yn syml ac yn gyflym? Mae hynny'n iawn, consol a 2D. Yn fwy manwl gywir, hyd yn oed y consol a'r symbolau. Unwaith eto, dechreuais chwilio am ysbrydoliaeth ar y Rhyngrwyd (yn gyffredinol, rwy'n ystyried y Rhyngrwyd yn ddyfais fwyaf chwyldroadol a pheryglus yr XNUMXain ganrif). Cloddiais fideo o un rhaglennydd oedd yn gwneud consol Tetris. Ac yn debygrwydd ei gêm, penderfynodd dorri i lawr y "neidr". O'r fideo, dysgais am ddau beth sylfaenol - y ddolen gêm (gyda thair swyddogaeth / rhan sylfaenol) ac allbwn i'r byffer.

Efallai y bydd y ddolen gêm yn edrych yn rhywbeth fel hyn:

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

Mae'r cod yn cyflwyno'r prif swyddogaeth () gyfan ar unwaith. Ac mae'r cylch gêm yn dechrau ar ôl y sylw cyfatebol. Mae tair swyddogaeth sylfaenol yn y ddolen: Mewnbwn(), Rhesymeg(), Draw(). Yn gyntaf, mewnbwn data Mewnbwn (rheoli trawiadau bysell yn bennaf), yna prosesu'r Logic data a gofnodwyd, yna arddangos ar y sgrin - Tynnwch lun. Ac felly bob ffrâm. Mae animeiddiad yn cael ei greu fel hyn. Mae fel cartwnau. Fel arfer prosesu'r data mewnbwn sy'n cymryd y mwyaf o amser a, hyd y gwn, mae'n pennu cyfradd ffrâm y gêm. Ond yma mae'r swyddogaeth Logic() yn gyflym iawn. Felly, rhaid i'r gyfradd ffrâm gael ei rheoli gan y swyddogaeth Cwsg () gyda'r paramedr gameSpeed ​​​​s, sy'n pennu'r gyfradd hon.

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
cylch gêm. Rhaglennu neidr mewn llyfr nodiadau

Os ydych chi'n datblygu gêm consol symbolaidd, yna ni fydd arddangos data ar y sgrin gan ddefnyddio'r allbwn ffrwd arferol 'cout' yn gweithio - mae'n araf iawn. Felly, rhaid cynnal yr allbwn yn y byffer sgrin. Cymaint yn gyflymach a bydd y gêm yn gweithio heb glitches. A dweud y gwir, dydw i ddim yn deall yn iawn beth yw byffer sgrin a sut mae'n gweithio. Ond rhoddaf enghraifft cod yma, ac efallai y bydd rhywun yn y sylwadau yn gallu egluro'r sefyllfa.

Cael y byffer sgrin (os caf ddweud hynny):

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

Allbwn uniongyrchol i sgrin llinell sgôr llinell benodol (y llinell ar gyfer dangos sgoriau):

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

Mewn theori, nid oes unrhyw beth cymhleth yn y gêm hon, mae'n ymddangos i mi yn enghraifft dda o gêm lefel mynediad. Mae'r cod wedi'i ysgrifennu mewn un ffeil a'i drefnu mewn sawl swyddogaeth. Dim dosbarthiadau, dim etifeddiaeth. Gallwch chi'ch hun weld popeth yng nghod ffynhonnell y gêm trwy fynd i'r ystorfa ar GitHub.

Gêm 2 Tanciau Crazy

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Gêm Crazy Tanciau

Mae'n debyg mai argraffu cymeriadau i'r consol yw'r peth symlaf y gallwch chi ei droi'n gêm. Ond yna mae un drafferth yn ymddangos: mae gan y cymeriadau uchder a lled gwahanol (mae'r uchder yn fwy na'r lled). Felly, bydd popeth yn edrych yn anghymesur, a bydd symud i lawr neu i fyny yn ymddangos yn llawer cyflymach na symud i'r chwith neu'r dde. Mae'r effaith hon yn amlwg iawn yn "Neidr" (Gêm 1). Nid oes gan "Tanciau" (Gêm 2) anfantais o'r fath, gan fod yr allbwn yno yn cael ei drefnu trwy beintio picseli sgrin gyda gwahanol liwiau. Gallech ddweud fy mod wedi ysgrifennu rendr. Yn wir, mae hyn eisoes ychydig yn fwy cymhleth, er yn llawer mwy diddorol.

Ar gyfer y gêm hon, bydd yn ddigon i ddisgrifio fy system ar gyfer arddangos picsel ar y sgrin. Rwy'n meddwl mai dyma brif ran y gêm. A phopeth arall y gallwch chi feddwl amdano'ch hun.

Felly, dim ond set o betryalau lliw symudol yw'r hyn a welwch ar y sgrin.

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Set petryal

Cynrychiolir pob petryal gan fatrics wedi'i lenwi â rhifau. Gyda llaw, gallaf dynnu sylw at un naws ddiddorol - mae'r holl fatricsau yn y gêm wedi'u rhaglennu fel amrywiaeth un dimensiwn. Nid dau-ddimensiwn, ond un-dimensiwn! Mae araeau un dimensiwn yn llawer haws ac yn gyflymach i weithio gyda nhw.

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Enghraifft o fatrics tanc gêm

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Yn cynrychioli Matrics Tanc Gêm gydag Arae Un Dimensiwn

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Enghraifft fwy darluniadol o gynrychioliad matrics gan arae un-dimensiwn

Ond mae mynediad i elfennau'r arae yn digwydd mewn dolen ddwbl, fel pe na bai'n arae un-dimensiwn, ond yn arae dau ddimensiwn. Gwneir hyn oherwydd ein bod yn dal i weithio gyda matricsau.

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Tramwyo arae un-dimensiwn mewn dolen ddwbl. Y yw'r ID rhes, X yw ID y golofn

Sylwch, yn lle'r dynodwyr matrics arferol i, j, rwy'n defnyddio'r dynodwyr x ac y. Felly, mae'n ymddangos i mi, yn fwy dymunol i'r llygad ac yn gliriach i'r ymennydd. Yn ogystal, mae nodiant o'r fath yn ei gwneud hi'n bosibl taflunio'r matricsau a ddefnyddir yn gyfleus ar echelinau cyfesurynnol delwedd dau ddimensiwn.

Nawr am bicseli, lliw ac arddangos. Defnyddir swyddogaeth StretchDIBits (Pennawd: windows.h; Llyfrgell: gdi32.lib) ar gyfer allbwn. Ymhlith pethau eraill, trosglwyddir y canlynol i'r swyddogaeth hon: y ddyfais y mae'r ddelwedd yn cael ei harddangos arni (yn fy achos i, dyma'r consol Windows), cyfesurynnau cychwyn arddangos y ddelwedd, ei lled / uchder, a'r ddelwedd ei hun ar ffurf map didau (bitmap), a gynrychiolir gan amrywiaeth o beitau. Bitmap fel amrywiaeth o beit!

Swyddogaeth StretchDIBits() yn y gwaith:

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

Dyrennir cof ymlaen llaw ar gyfer y map didau hwn gan ddefnyddio'r ffwythiant VirtualAlloc(). Hynny yw, cedwir y nifer gofynnol o beit i storio gwybodaeth am yr holl bicseli, a fydd wedyn yn cael ei arddangos ar y sgrin.

Creu m_p_bitmap Memory bitmap:

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

Yn fras, mae map didau yn cynnwys set o bicseli. Mae pob pedwar beit yn yr arae yn bicseli RGB. Un beit fesul gwerth coch, un beit fesul gwerth gwyrdd (G), ac un beit fesul lliw glas (B). Hefyd, mae un beit fesul mewnoliad. Mae'r tri lliw hyn - Coch / Gwyrdd / Glas (RGB) - yn cael eu cymysgu â'i gilydd mewn cyfrannau gwahanol - a cheir y lliw picsel canlyniadol.

Nawr, unwaith eto, mae pob petryal, neu wrthrych gêm, yn cael ei gynrychioli gan fatrics rhif. Mae'r holl wrthrychau gêm hyn yn cael eu rhoi mewn casgliad. Ac yna fe'u gosodir ar y cae chwarae, gan ffurfio un matrics rhifiadol mawr. Mapiais bob rhif yn y matrics i liw penodol. Er enghraifft, mae'r rhif 8 yn las, mae'r rhif 9 yn felyn, mae'r rhif 10 yn llwyd tywyll, ac ati. Felly, gallwn ddweud bod gennym fatrics o'r cae chwarae, lle mae pob rhif yn rhyw fath o liw.

Felly, mae gennym fatrics rhifiadol o'r cae chwarae cyfan ar y naill law a map didau ar gyfer arddangos y ddelwedd ar y llall. Hyd yn hyn, mae'r map didau yn "wag" - nid oes ganddo wybodaeth eto am bicseli'r lliw a ddymunir. Mae hyn yn golygu mai'r cam olaf fydd llenwi'r map didau gyda gwybodaeth am bob picsel yn seiliedig ar fatrics rhifiadol y cae chwarae. Mae enghraifft enghreifftiol o drawsnewidiad o'r fath yn y llun isod.

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Enghraifft o lenwi map didau (matrics picsel) gyda gwybodaeth yn seiliedig ar fatrics rhifiadol (matrics digidol) y cae chwarae (nid yw mynegeion lliw yn cyd-fynd â mynegeion y gêm)

Byddaf hefyd yn cyflwyno darn o god go iawn o'r gêm. Rhoddir gwerth (mynegai lliw) o fatrics rhifiadol y cae chwarae (prif DigitalMatrix) i'r Mynegai lliw newidiol ym mhob iteriad o'r ddolen. Yna mae'r lliw ei hun wedi'i ysgrifennu i'r newidyn lliw yn seiliedig ar y mynegai. Ymhellach, mae'r lliw canlyniadol wedi'i rannu'n gymhareb coch, gwyrdd a glas (RGB). Ac ynghyd â'r mewnoliad (PixelPadding), mae'r wybodaeth hon yn cael ei hysgrifennu i'r picsel dro ar ôl tro, gan ffurfio delwedd lliw yn y map didau.

Mae'r cod yn defnyddio awgrymiadau a gweithrediadau bitwise, a all fod yn anodd eu deall. Felly rwy'n eich cynghori i ddarllen ar wahân yn rhywle sut mae strwythurau o'r fath yn gweithio.

Llenwi map didau gyda gwybodaeth yn seiliedig ar fatrics rhifiadol y cae chwarae:

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

Yn ôl y dull a ddisgrifir uchod, mae un llun (ffrâm) yn cael ei ffurfio yn y gêm Crazy Tanks a'i arddangos ar y sgrin yn y swyddogaeth Draw (). Ar ôl cofrestru trawiadau bysell yn y swyddogaeth Mewnbwn() a'u prosesu dilynol yn y swyddogaeth Logic(), ffurfir llun (ffrâm) newydd. Yn wir, efallai y bydd gan wrthrychau gêm safle gwahanol eisoes ar y cae chwarae ac, yn unol â hynny, yn cael eu tynnu mewn man gwahanol. Dyma sut mae animeiddio (symudiad) yn digwydd.

Mewn theori (os nad ydych wedi anghofio unrhyw beth), deall y ddolen gêm o'r gêm gyntaf (“Neidr”) a'r system ar gyfer arddangos picseli ar y sgrin o'r ail gêm (“Tanciau”) yw'r cyfan sydd ei angen arnoch i ysgrifennu unrhyw o'ch gemau 2D ar gyfer Windows. Di-sain! 😉 Mae gweddill y rhannau yn ffansi yn unig.

Wrth gwrs, mae'r gêm "Tanks" wedi'i chynllunio'n llawer mwy cymhleth na'r "Neidr". Defnyddiais yr iaith C++ yn barod, hynny yw, disgrifiais wahanol wrthrychau gêm gyda dosbarthiadau. Creais fy nghasgliad fy hun - gallwch weld y cod mewn penawdau/Box.h. Gyda llaw, mae'r casgliad yn fwyaf tebygol o fod â chof yn gollwng. Awgrymiadau wedi'u defnyddio. Wedi gweithio gyda'r cof. Rhaid dweud bod y llyfr wedi fy helpu llawer. Dechrau C++ Trwy Raglennu Gêm. Mae hwn yn ddechrau gwych i ddechreuwyr yn C ++. Mae'n fach, yn ddiddorol ac yn drefnus.

Cymerodd tua chwe mis i ddatblygu'r gêm hon. Ysgrifennais yn bennaf yn ystod cinio a byrbrydau yn y gwaith. Eisteddodd yng nghegin y swyddfa, stompio ar fwyd ac ysgrifennu cod. Neu gartref am swper. Felly cefais "rhyfeloedd cegin" o'r fath. Fel bob amser, defnyddiais lyfr nodiadau yn weithredol, a ganwyd yr holl bethau cysyniadol ynddo.

Ar ddiwedd y rhan ymarferol, byddaf yn tynnu allan ychydig o sganiau o fy llyfr nodiadau. I ddangos beth yn union roeddwn i’n ei ysgrifennu, tynnu llun, cyfrif, dylunio…

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Dyluniad delwedd tanc. A'r diffiniad o faint o bicseli y dylai pob tanc eu meddiannu ar y sgrin

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Cyfrifo'r algorithm a'r fformiwlâu ar gyfer cylchdroi'r tanc o amgylch ei echelin

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Diagram o fy nghasgliad (yr un gyda'r gollyngiad cof, yn fwyaf tebygol). Mae'r casgliad yn cael ei greu fel Rhestr Gysylltiedig

DevOps C ++ a "rhyfeloedd cegin", neu Sut y dechreuais ysgrifennu gemau wrth fwyta
Ac mae'r rhain yn ymdrechion ofer i sgriwio deallusrwydd artiffisial i'r gêm

Теория

"Mae hyd yn oed taith o fil o filltiroedd yn dechrau gyda'r cam cyntaf" (doethineb Tsieineaidd Hynafol)

Gadewch i ni symud o ymarfer i theori! Sut ydych chi'n dod o hyd i amser ar gyfer eich hobi?

  1. Darganfyddwch beth rydych chi ei eisiau mewn gwirionedd (gwaethus, dyma'r anoddaf).
  2. Gosod blaenoriaethau.
  3. Aberthwch yr holl "ddiangen" er mwyn blaenoriaethau uwch.
  4. Symudwch tuag at eich nodau bob dydd.
  5. Peidiwch â disgwyl y bydd dwy neu dair awr o amser rhydd ar gyfer hobi.

Ar y naill law, mae angen i chi benderfynu beth rydych chi ei eisiau a blaenoriaethu. Ar y llaw arall, mae'n bosibl rhoi'r gorau i rai achosion / prosiectau o blaid y blaenoriaethau hyn. Mewn geiriau eraill, bydd yn rhaid i chi aberthu popeth "ddiangen". Clywais yn rhywle y dylai fod uchafswm o dri phrif weithgaredd mewn bywyd. Yna byddwch chi'n gallu delio â nhw yn y ffordd orau bosibl. A bydd prosiectau/cyfarwyddiadau ychwanegol yn dechrau gorlwytho corny. Ond mae hyn i gyd, mae'n debyg, yn oddrychol ac yn unigol.

Mae yna reol euraidd arbennig: peidiwch byth â chael diwrnod 0%! Dysgais amdano mewn erthygl gan ddatblygwr indie. Os ydych chi'n gweithio ar brosiect, yna gwnewch rywbeth amdano bob dydd. Ac nid oes ots faint rydych chi'n ei wneud. Ysgrifennwch un gair neu un llinell o god, gwyliwch un fideo tiwtorial, neu morthwyliwch un hoelen i'r bwrdd - gwnewch rywbeth. Y rhan anoddaf yw dechrau arni. Unwaith y byddwch chi'n dechrau, mae'n debyg y byddwch chi'n gwneud ychydig mwy nag yr oeddech chi eisiau. Felly byddwch yn symud yn gyson tuag at eich nod ac, credwch fi, yn gyflym iawn. Wedi'r cyfan, y prif brêc ar bob peth yw oedi.

Ac mae'n bwysig cofio na ddylech danamcangyfrif ac anwybyddu'r "blawd llif" rhad ac am ddim o amser mewn 5, 10, 15 munud, arhoswch am rai "boncyffion" mawr sy'n para awr neu ddwy. Ydych chi'n sefyll mewn llinell? Meddyliwch am rywbeth ar gyfer eich prosiect. Ydych chi'n mynd i fyny'r grisiau symudol? Ysgrifennwch rywbeth mewn llyfr nodiadau. Ydych chi'n bwyta ar y bws? Iawn, darllenwch ychydig o erthygl. Defnyddiwch bob cyfle. Stopiwch wylio cathod a chŵn ar YouTube! Peidiwch â llanast gyda'ch ymennydd!

A'r olaf. Os oeddech chi, ar ôl darllen yr erthygl hon, yn hoffi'r syniad o greu gemau heb ddefnyddio peiriannau gêm, yna cofiwch yr enw Casey Muratori. Mae gan y boi yma сайт. Yn yr adran "gwylio -> PENNODAU BLAENOROL" fe welwch diwtorialau fideo anhygoel am ddim ar sut i greu gêm broffesiynol o'r dechrau. Efallai y byddwch yn dysgu mwy mewn pum Cyflwyniad i C ar gyfer gwersi Windows nag mewn pum mlynedd o astudio yn y brifysgol (ysgrifennodd rhywun am hyn yn y sylwadau o dan y fideo).

Mae Casey hefyd yn esbonio, trwy ddatblygu eich injan gêm eich hun, y bydd gennych well dealltwriaeth o unrhyw beiriannau sy'n bodoli eisoes. Ym myd fframweithiau, lle mae pawb yn ceisio awtomeiddio, byddwch chi'n dysgu sut i greu, nid defnyddio. Deall union natur cyfrifiaduron. A byddwch hefyd yn dod yn rhaglennydd llawer mwy deallus ac aeddfed - yn pro.

Pob lwc ar eich llwybr dewisol! A gadewch i ni wneud y byd yn fwy proffesiynol.

Awdur: Andrey Grankin, DevOps



Ffynhonnell: hab.com