DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım

"Mən heç nə bilmədiyimi bilirəm" Sokrat

Kimin üçün: bütün tərtibatçılara tüpürən və onların oyunlarını oynamaq istəyən İT adamları üçün!

Nə haqqında: Ehtiyacınız olarsa C/C++ dilində oyun yazmağa necə başlamaq olar!

Bunu niyə oxumalısınız: Proqram inkişafı mənim iş ixtisasım deyil, amma hər həftə kodlaşdırmağa çalışıram. Çünki oyunları sevirəm!

Salam mənim adım Andrey Qrankin, Mən Luxoft-da DevOps-dayam. Tətbiqlərin hazırlanması mənim iş ixtisasım deyil, amma hər həftə kodlamağa çalışıram. Çünki oyunları sevirəm!

Kompüter oyunları sənayesi nəhəngdir, bu gün kino sənayesindən daha çox şayiələr yayılır. Oyunlar müasir standartlara uyğun olaraq kompleks və əsas inkişaf metodlarından istifadə etməklə kompüterlərin inkişafının başlanğıcından yazılır. Vaxt keçdikcə artıq proqramlaşdırılmış qrafika, fizika və səslə oyun mühərrikləri görünməyə başladı. Onlar sizə oyunun özünün inkişafına diqqət yetirməyə imkan verir və onun təməli haqqında narahat olmayın. Ancaq onlarla yanaşı, mühərriklərlə birlikdə tərtibatçılar "kor olurlar" və pisləşirlər. Oyunların çox istehsalı konveyerə qoyulur. Və istehsalın kəmiyyəti onun keyfiyyətindən üstün olmağa başlayır.

Eyni zamanda, başqalarının oyunlarını oynayarkən, biz daim digər insanların yaratdığı yerlər, süjet, personajlar, oyun mexanikası ilə məhdudlaşırıq. Beləliklə, anladım ki...

... yalnız mənə tabe olaraq öz dünyalarınızı yaratmağın vaxtıdır. Ata, Oğul və Müqəddəs Ruh olduğum aləmlər!

Və mən ürəkdən inanıram ki, öz oyun motorunuzu və onun üzərinə bir oyun yazmaqla siz daha təcrübəli və ayrılmaz bir proqramçı olmaqla gözlərinizi aça, pəncərələri silə və kabinənizi pompalaya biləcəksiniz.

Bu yazıda sizə C / C ++ dilində kiçik oyunlar yazmağa necə başladığımı, inkişaf prosesinin nə olduğunu və məşğul mühitdə hobbi üçün vaxt tapdığımı izah etməyə çalışacağam. O, subyektivdir və fərdi başlanğıc prosesini təsvir edir. Cahillik və iman haqqında material, hazırda mənim şəxsi dünya mənzərəm haqqında. Başqa sözlə, "İdarə sizin şəxsi beyninizə cavabdeh deyil!".

Praktika

"Təcrübəsiz bilik faydasızdır, biliksiz təcrübə təhlükəlidir." Konfutsi

Mənim dəftərim mənim həyatımdır!


Beləliklə, praktikada deyə bilərəm ki, mənim üçün hər şey notebookdan başlayır. Mən orada təkcə gündəlik tapşırıqlarımı yazıram, həm də riyazi də daxil olmaqla, qrafiklər çəkir, proqramlaşdırır, sxemlər tərtib edir və problemləri həll edirəm. Həmişə bloknotdan istifadə edin və yalnız qələmlə yazın. Təmiz, rahat və etibarlıdır, IMHO.

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Mənim (artıq doldurulmuş) dəftərim. Bu belə görünür. Burada gündəlik tapşırıqlar, ideyalar, rəsmlər, diaqramlar, həllər, qara mühasibatlıq, kod və s.

Bu mərhələdə üç layihəni tamamlaya bildim (bu, mənim “sonluq” anlayışımdadır, çünki istənilən məhsulu nisbətən sonsuz inkişaf etdirmək olar).

  • Layihə 0: Bu Unity oyun mühərrikindən istifadə edərək C# dilində yazılmış Architect Demo 3D səhnəsidir. macOS və Windows platformaları üçün.
  • Oyun 1: Windows üçün konsol oyunu Simple Snake (hamıya "Snake" kimi tanınır). C-də yazılmışdır.
  • Oyun 2: konsol oyunu Crazy Tanks (hamıya "Tanks" kimi tanınır), artıq C ++ dilində (siniflərdən istifadə etməklə) və həmçinin Windows altında yazılmışdır.

Layihə 0 Architect Demo

  • Platform: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Language: C#
  • Oyun mühərriki: Birlik
  • İlham: Darrin Lile
  • Repozitor: Github

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
3D Scene Architect Demo

İlk layihə C/C++ dilində deyil, Unity oyun mühərrikindən istifadə etməklə C# dilində həyata keçirilib. Bu mühərrik aparat baxımından o qədər də tələbkar deyildi Unreal Engine, həm də mənə quraşdırmaq və istifadə etmək daha asan görünürdü. Başqa mühərrikləri nəzərə almadım.

Birlikdə mənim üçün məqsəd bir növ oyun inkişaf etdirmək deyildi. Bir növ xarakterlə 3D səhnə yaratmaq istədim. O, daha doğrusu O (aşiq olduğum qızı modelləşdirdim =) hərəkət etməli və xarici dünya ilə əlaqə saxlamalı idi. Yalnız Birliyin nə olduğunu, inkişaf prosesinin nə olduğunu və bir şey yaratmaq üçün nə qədər səy tələb olunduğunu anlamaq vacib idi. Architect Demo layihəsi belə doğuldu (ad demək olar ki, boşboğazlıqdan icad edilmişdir). Proqramlaşdırma, modelləşdirmə, animasiya, tekstura mənim yəqin ki, iki aylıq gündəlik işimi apardı.

Mən YouTube-da 3D modellərin necə yaradılması ilə bağlı dərslik videoları ilə başladım Blender. Blender quraşdırma tələb etməyən 3D modelləşdirmə (və daha çox) üçün mükəmməl pulsuz vasitədir. Və burada məni şok gözləyirdi... Belə çıxır ki, modelləşdirmə, animasiya, tekstura kitablar yaza biləcəyiniz böyük ayrı-ayrı mövzulardır. Bu, xüsusilə personajlar üçün doğrudur. Barmaqları, dişləri, gözləri və bədənin digər hissələrini modelləşdirmək üçün anatomiya biliklərinə ehtiyacınız olacaq. Üz əzələləri necə düzülür? İnsanlar necə hərəkət edirlər? Mən hər qola, ayağına, barmağına, oynaqlarına sümüklər "daxil etməli" idim!

Klavikula, əlavə sümük qollarını modelləşdirin ki, animasiya təbii görünsün. Belə dərslərdən sonra anlayırsan ki, cizgi filmlərinin yaradıcıları sadəcə 30 saniyəlik video yaratmaq üçün nə qədər böyük iş görürlər. Ancaq 3D filmlər saatlarla davam edir! Sonra teatrlardan çıxıb belə bir şey deyirik: “Ta, pis cizgi filmi / filmi! Daha yaxşısını edə bilərdilər...” Axmaqlar!

Və bu layihədə proqramlaşdırma haqqında daha bir şey. Məlum oldu ki, mənim üçün ən maraqlısı riyazi hissə idi. Səhnəni işə salsanız (layihənin təsvirindəki depoya keçid), kameranın sferada qız obrazının ətrafında fırlandığını görəcəksiniz. Belə bir kamera fırlanmasını proqramlaşdırmaq üçün əvvəlcə dairədə (2D), sonra isə kürədə (3D) mövqe nöqtəsinin koordinatlarını hesablamalı oldum. Gülməlisi odur ki, məktəbdə riyaziyyata nifrət edirdim və onu mənfi bilirdim. Qismən, yəqin ki, məktəbdə bu riyaziyyatın həyatda necə tətbiq olunduğunu sizə izah etmirlər. Ancaq məqsədinə, xəyalına bağlı olanda, o zaman ağıl təmizlənir, üzə çıxır! Və siz mürəkkəb tapşırıqları maraqlı bir macəra kimi qəbul etməyə başlayırsınız. Və sonra düşünürsən: "Yaxşı, niyə *sevimli* riyaziyyatçı normal olaraq bu düsturların hara söykənə biləcəyini deyə bilmədi?".

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Dairə və kürə üzərindəki nöqtənin koordinatlarını hesablamaq üçün düsturların hesablanması (dəftərimdən)

Oyun 1

  • Platform: Windows (Windows 7, 10-da sınaqdan keçirilmişdir)
  • Language: Məncə təmiz C hərfində yazılmışdı
  • Oyun mühərriki: Windows konsolu
  • İlham: javidx9
  • Repozitor: Github

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Sadə ilan oyunu

3D səhnə oyun deyil. Bundan əlavə, 3D obyektləri (xüsusilə simvolları) modelləşdirmək və canlandırmaq uzun və çətindir. Unity ilə oynadıqdan sonra başa düşdüm ki, əsaslardan davam etməli, daha doğrusu, başlamalıyam. Oyunların quruluşunu başa düşmək üçün sadə və sürətli, lakin eyni zamanda qlobal bir şey.

Bəs bizdə sadə və sürətli nə var? Doğrudur, konsol və 2D. Daha doğrusu, hətta konsol və simvollar. Yenə də internetdə ilham axtarmağa başladım (ümumiyyətlə, mən interneti XNUMX-ci əsrin ən inqilabi və təhlükəli ixtirası hesab edirəm). Tetris konsolunu hazırlayan bir proqramçının videosunu qazdım. Və öz oyununa bənzəyərək, "ilan"ı kəsmək qərarına gəldi. Videodan mən iki əsas şey haqqında öyrəndim - oyun döngəsi (üç əsas funksiya / hissə ilə) və buferə çıxış.

Oyun döngəsi belə görünə bilər:

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

Kod bir anda bütün main() funksiyasını təqdim edir. Və oyun dövrü müvafiq şərhdən sonra başlayır. Döngüdə üç əsas funksiya var: Input(), Logic(), Draw(). Birincisi, daxil edilmiş məlumatların daxil edilməsi (əsasən düymələrin vuruşlarına nəzarət), sonra daxil edilmiş məlumatların məntiqinin işlənməsi, sonra ekranda göstərilməsi - Draw. Və beləliklə hər çərçivə. Animasiya bu şəkildə yaradılır. Cizgi filmləri kimidir. Adətən daxil olan məlumatların işlənməsi ən çox vaxt aparır və bildiyimə görə oyunun kadr sürətini müəyyən edir. Amma burada Logic() funksiyası çox sürətlidir. Buna görə də, kadr sürəti bu sürəti təyin edən gameSpeed ​​parametri ilə Sleep() funksiyası tərəfindən idarə edilməlidir.

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
oyun dövrü. Notepadda ilan proqramlaşdırması

Əgər siz simvolik konsol oyunu hazırlayırsınızsa, o zaman adi axın çıxışı 'cout' istifadə edərək məlumatların ekranda göstərilməsi işləməyəcək - bu, çox yavaşdır. Buna görə çıxış ekran buferində aparılmalıdır. Çox daha sürətli və oyun qüsursuz işləyəcək. Düzünü desəm, ekran buferinin nə olduğunu və necə işlədiyini tam başa düşə bilmirəm. Ancaq mən burada bir kod nümunəsi verəcəyəm və bəlkə şərhlərdə kimsə vəziyyəti aydınlaşdıra biləcək.

Ekran buferinin alınması (əgər belə deyə bilərəmsə):

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

Müəyyən bir xətt hesabının ekranına birbaşa çıxış (balları göstərmək üçün xətt):

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

Teorik olaraq, bu oyunda mürəkkəb bir şey yoxdur, mənə giriş səviyyəli oyunun yaxşı nümunəsi kimi görünür. Kod bir faylda yazılır və bir neçə funksiyada düzülür. Nə siniflər var, nə miras. Siz özünüz GitHub-dakı repozitoriyaya keçərək oyunun mənbə kodunda hər şeyi görə bilərsiniz.

Oyun 2 Crazy Tanks

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Crazy Tanks oyunu

Konsolda simvolların çapı, yəqin ki, oyuna çevirə biləcəyiniz ən sadə şeydir. Ancaq sonra bir problem ortaya çıxır: simvolların müxtəlif hündürlükləri və genişlikləri var (hündürlük genişlikdən böyükdür). Beləliklə, hər şey qeyri-mütənasib görünəcək və aşağı və ya yuxarı hərəkət sola və ya sağa hərəkət etməkdən daha sürətli görünəcək. Bu təsir "İlan"da (1-ci oyun) çox nəzərə çarpır. "Tanklar"ın (Oyun 2) belə bir çatışmazlığı yoxdur, çünki orada çıxış ekran piksellərinin müxtəlif rənglərlə rənglənməsi ilə təşkil edilir. Deyə bilərsiniz ki, mən render yazdım. Düzdür, bu, daha maraqlı olsa da, artıq bir az daha mürəkkəbdir.

Bu oyun üçün ekranda pikselləri göstərmək üçün sistemimi təsvir etmək kifayətdir. Məncə, bu oyunun əsas hissəsidir. Və başqa hər şeyi özünüzlə tapa bilərsiniz.

Beləliklə, ekranda gördükləriniz sadəcə hərəkət edən rəngli düzbucaqlılar toplusudur.

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Düzbucaqlı dəsti

Hər bir düzbucaqlı ədədlərlə dolu matrislə təmsil olunur. Yeri gəlmişkən, bir maraqlı nüansı vurğulaya bilərəm - oyundakı bütün matrislər bir ölçülü massiv kimi proqramlaşdırılıb. İki ölçülü deyil, bir ölçülü! Birölçülü massivlərlə işləmək çox asan və daha sürətlidir.

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Oyun tankı matrisinin nümunəsi

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Bir Ölçülü Massiv ilə Oyun Tankının Matrisini təmsil edir

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Bir ölçülü massiv ilə matris təmsilinin daha illüstrativ nümunəsi

Lakin massivin elementlərinə giriş ikiqat dövrədə baş verir, sanki birölçülü deyil, ikiölçülü massivdir. Bu, hələ də matrislərlə işlədiyimiz üçün edilir.

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Birölçülü massivin ikiqat dövrədə keçməsi. Y sətir ID-sidir, X sütun ID-sidir

Nəzərə alın ki, adi i, j matris identifikatorları əvəzinə mən x və y identifikatorlarından istifadə edirəm. Deməli, mənə elə gəlir ki, gözə daha xoş, beyinə daha aydındır. Bundan əlavə, belə bir qeyd istifadə olunan matrisləri iki ölçülü təsvirin koordinat oxlarına rahat şəkildə proyeksiya etməyə imkan verir.

İndi piksellər, rəng və ekran haqqında. Çıxış üçün StretchDIBits funksiyası (Başlıq: windows.h; Kitabxana: gdi32.lib) istifadə olunur. Digər şeylər arasında, bu funksiyaya aşağıdakılar ötürülür: təsvirin göstərildiyi cihaz (mənim vəziyyətimdə bu Windows konsoludur), təsvirin göstərilməsinə başlama koordinatları, eni / hündürlüyü və təsvir özü bayt massivi ilə təmsil olunan bitmap (bitmap) şəklindədir. Bitmap bayt massivi kimi!

StretchDIBits() funksiyası işləyir:

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

VirtualAlloc() funksiyasından istifadə edərək bu bitmap üçün əvvəlcədən yaddaş ayrılır. Yəni, bütün piksellər haqqında məlumatın saxlanması üçün tələb olunan bayt sayı qorunur və bu, daha sonra ekranda göstərilir.

m_p_bitmapMemory bitmapının yaradılması:

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

Kobud şəkildə desək, bitmap piksellər dəstindən ibarətdir. Massivdəki hər dörd bayt bir RGB pikselidir. Qırmızı dəyər üçün bir bayt, yaşıl dəyər üçün bir bayt (G) və mavi rəng üçün bir bayt (B). Üstəlik, hər abzas üçün bir bayt var. Bu üç rəng - Qırmızı / Yaşıl / Mavi (RGB) müxtəlif nisbətlərdə bir-biri ilə qarışdırılır və nəticədə piksel rəngi alınır.

İndi yenə də hər bir düzbucaqlı və ya oyun obyekti ədəd matrisi ilə təmsil olunur. Bu oyun obyektlərinin hamısı kolleksiyaya yerləşdirilib. Və sonra onlar bir böyük ədədi matris təşkil edərək, oyun sahəsinə yerləşdirilir. Matrisdəki hər bir nömrəni müəyyən bir rəngə uyğunlaşdırdım. Məsələn, 8 rəqəmi göy, 9 rəqəmi sarı, 10 rəqəmi tünd boz və s. Beləliklə, hər bir nömrənin bir növ rəng olduğu oyun sahəsinin matrisinin olduğunu söyləyə bilərik.

Beləliklə, bir tərəfdən bütün oyun sahəsinin ədədi matrisi, digər tərəfdən isə təsviri göstərmək üçün bitmap var. Hələ ki, bitmap "boşdur" - hələ istədiyiniz rəngin pikselləri haqqında məlumat yoxdur. Bu o deməkdir ki, son addım oyun sahəsinin ədədi matrisinə əsaslanaraq bitmapın hər piksel haqqında məlumatla doldurulması olacaq. Belə bir çevrilmənin illüstrativ nümunəsi aşağıdakı şəkildədir.

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Oyun sahəsinin ədədi matrisinə (Rəqəmsal matrisa) əsaslanan məlumatla bitmapın (Piksel matrisi) doldurulmasına nümunə (rəng indeksləri oyundakı indekslərə uyğun gəlmir)

Mən də oyundan real kod parçası təqdim edəcəyəm. Döngənin hər iterasiyasında colorIndex dəyişəninə oyun sahəsinin ədədi matrisindən (mainDigitalMatrix) bir dəyər (rəng indeksi) təyin edilir. Sonra rəngin özü indeks əsasında rəng dəyişəninə yazılır. Bundan əlavə, yaranan rəng qırmızı, yaşıl və mavi (RGB) nisbətinə bölünür. Və abzas (pixelPadding) ilə birlikdə bu məlumat pikselə təkrar-təkrar yazılır və bitmapda rəngli təsvir əmələ gətirir.

Kod başa düşmək çətin ola bilən göstəricilərdən və bit əməliyyatlarından istifadə edir. Buna görə də, bu cür strukturların necə işlədiyini bir yerdə ayrıca oxumağı məsləhət görürəm.

Oyun sahəsinin ədədi matrisinə əsaslanan məlumatla bitmapın doldurulması:

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

Yuxarıda təsvir edilən üsula əsasən, Crazy Tanks oyununda bir şəkil (çərçivə) formalaşır və Draw() funksiyasında ekranda göstərilir. Input() funksiyasında düymələrin vuruşlarını qeydiyyatdan keçirdikdən və onların Logic() funksiyasında sonrakı işlənməsindən sonra yeni şəkil (çərçivə) formalaşır. Doğrudur, oyun obyektləri artıq oyun sahəsində fərqli mövqeyə malik ola bilər və müvafiq olaraq fərqli bir yerdə çəkilir. Animasiya (hərəkət) belə baş verir.

Nəzəriyyə olaraq (heç nəyi unutmamısınızsa) ilk oyundan (“İlan”) oyun dövrəsini və ikinci oyundan (“Tanklar”) ekranda piksellərin göstərilməsi sistemini başa düşmək hər hansı bir şey yazmaq üçün kifayətdir. Windows üçün 2D oyunlarınızdan. Səssiz! 😉 Qalan hissələr sadəcə fantaziya uçuşudur.

Əlbəttə ki, "Tanklar" oyunu "İlan" dan daha mürəkkəbdir. Mən artıq C++ dilindən istifadə etmişəm, yəni müxtəlif oyun obyektlərini siniflərlə təsvir etmişəm. Mən öz kolleksiyamı yaratdım - kodu başlıqlarda/Box.h-də görə bilərsiniz. Yeri gəlmişkən, kolleksiyada çox güman ki, yaddaş sızması var. İstifadə olunmuş göstəricilər. Yaddaşla işləyirdi. Deyim ki, kitab mənə çox kömək etdi. Oyun Proqramlaşdırması vasitəsilə C++ dilinin başlanğıcı. Bu, C++ dilini yeni başlayanlar üçün əla başlanğıcdır. Kiçik, maraqlı və yaxşı təşkil edilmişdir.

Bu oyunu hazırlamaq üçün təxminən altı ay çəkdi. Əsasən işdə nahar və qəlyanaltılar zamanı yazırdım. O, ofisin mətbəxində oturub, yeməyi tapdalayıb kod yazıb. Və ya evdə nahar üçün. Beləliklə, məndə belə "mətbəx müharibələri" var. Həmişə olduğu kimi, aktiv şəkildə notebookdan istifadə etdim və bütün konseptual şeylər onda doğuldu.

Praktiki hissənin sonunda dəftərimin bir neçə skanını çıxaracağam. Tam olaraq nəyi yazdığımı, çəkdiyimi, saydığımı, dizayn etdiyimi göstərmək üçün...

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Tank təsvir dizaynı. Və ekranda hər bir tankın neçə piksel tutacağının tərifi

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Tankın öz oxu ətrafında fırlanması üçün alqoritm və düsturların hesablanması

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Kolleksiyamın diaqramı (çox güman ki, yaddaş sızması olan). Kolleksiya Əlaqəli Siyahı kimi yaradılmışdır

DevOps C++ və "mətbəx müharibələri" və ya yemək yeyərkən oyun yazmağa necə başladım
Və bunlar süni intellekti oyuna daxil etmək üçün əbəs cəhdlərdir

Теория

"Min mil səyahət belə ilk addımdan başlayır" (Qədim Çin müdrikliyi)

Gəlin təcrübədən nəzəriyyəyə keçək! Hobbiniz üçün necə vaxt tapırsınız?

  1. Həqiqətən nə istədiyinizi müəyyənləşdirin (təəssüf ki, bu ən çətindir).
  2. Prioritetləri təyin edin.
  3. Daha yüksək prioritetlər naminə bütün "artıqları" qurban verin.
  4. Hər gün hədəflərinizə doğru irəliləyin.
  5. Bir hobbi üçün iki və ya üç saat boş vaxt olacağını gözləməyin.

Bir tərəfdən nə istədiyinizi müəyyənləşdirməli və prioritetləşdirməlisiniz. Digər tərəfdən, bu prioritetlərin xeyrinə bəzi hallardan/layihələrdən imtina etmək mümkündür. Başqa sözlə, "artıq" hər şeyi qurban verməli olacaqsınız. Hardasa eşitmişəm ki, həyatda maksimum üç əsas fəaliyyət olmalıdır. Sonra onlarla ən yaxşı şəkildə məşğul ola biləcəksiniz. Və əlavə layihələr/istiqamətlər qarğıdalı yükləməyə başlayacaq. Ancaq bunların hamısı, ehtimal ki, subyektiv və fərdidir.

Müəyyən bir qızıl qayda var: heç vaxt 0% gün keçirməyin! Bu barədə indie tərtibatçısının məqaləsində öyrəndim. Əgər bir layihə üzərində işləyirsinizsə, onda hər gün onunla bağlı bir şey edin. Və nə qədər qazandığınızın əhəmiyyəti yoxdur. Bir söz və ya bir kod sətri yazın, bir dərslik videosuna baxın və ya lövhəyə bir mismar vurun - sadəcə bir şey edin. Ən çətin hissəsi başlamaqdır. Başladıqdan sonra, yəqin ki, istədiyinizdən bir az daha çox şey edəcəksiniz. Beləliklə, siz daim öz məqsədinizə doğru irəliləyəcəksiniz və inanın mənə, çox tez. Axı, hər şeyin əsas əyləci süründürməçilikdir.

Və yadda saxlamaq lazımdır ki, 5, 10, 15 dəqiqə ərzində zamanın pulsuz "yonqar tozunu" qiymətləndirməməli və görməməzlikdən gəlməməli, bir-iki saat davam edən bəzi böyük "logları" gözləyin. Növbədə dayanırsınız? Layihəniz üçün bir şey düşünün. Eskalatorla qalxırsan? Bir notebooka bir şey yazın. Avtobusda yemək yeyirsən? Yaxşı, bir məqalə oxuyun. Hər fürsətdən istifadə edin. YouTube-da it və pişiklərə baxmağı dayandırın! Beyninizlə qarışmayın!

Və sonuncu. Bu yazını oxuduqdan sonra oyun mühərriklərindən istifadə etmədən oyun yaratmaq fikri xoşunuza gəldisə, Casey Muratori adını xatırlayın. Bu adamda var website. "Baxla -> ƏVVƏLKİ BÖLÜMLƏR" bölməsində siz sıfırdan peşəkar oyun yaratmağa dair heyrətamiz pulsuz video dərsləri tapa bilərsiniz. Windows üçün Intro to C-nin beş dərsində siz universitetdə beş illik təhsildən daha çox şey öyrənə bilərsiniz (kimsə bu barədə videonun altındakı şərhlərdə yazıb).

Keysi həmçinin izah edir ki, öz oyun mühərrikinizi inkişaf etdirməklə siz mövcud olan mühərrikləri daha yaxşı başa düşəcəksiniz. Hər kəsin avtomatlaşdırmağa çalışdığı çərçivələr dünyasında siz necə istifadə etməyi deyil, yaratmağı öyrənəcəksiniz. Kompüterlərin mahiyyətini anlayın. Həm də daha ağıllı və yetkin bir proqramçı olacaqsınız - peşəkar.

Seçdiyiniz yolda uğurlar! Gəlin dünyanı daha peşəkar edək.

Author: Qrankin Andrey, DevOps



Mənbə: www.habr.com