DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım

"Hiçbir şey bilmediğimi biliyorum" Sokrates

Kimin için: tüm geliştiricilere tüküren ve oyunlarını oynamak isteyen BT çalışanları için!

Ne hakkında: Eğer ihtiyacınız varsa C/C++ ile oyun yazmaya nasıl başlayabilirsiniz!

Bunu neden okumalısınız: Uygulama geliştirme benim uzmanlık alanım değil ama her hafta kodlamaya çalışıyorum. Çünkü oyunları seviyorum!

Merhaba benim adım Andrey Grankin, Luxoft'ta bir DevOps'um. Uygulama geliştirme benim uzmanlık alanım değil ama her hafta kodlamaya çalışıyorum. Çünkü oyunları seviyorum!

Bilgisayar oyunu endüstrisi çok büyük ve bugün film endüstrisinden bile daha büyük olduğu söyleniyor. Oyunlar, bilgisayarların doğuşundan bu yana, modern standartlara göre karmaşık ve temel geliştirme yöntemleri kullanılarak yazılmıştır. Zamanla önceden programlanmış grafiklere, fiziğe ve sese sahip oyun motorları ortaya çıkmaya başladı. Oyunun kendisini geliştirmeye odaklanmanıza ve temeli konusunda endişelenmenize izin vermezler. Ancak onlarla birlikte, motorlarla birlikte geliştiriciler de "körleşiyor" ve bozuluyor. Oyunların üretimi taşıma bandına konur. Ve ürünlerin miktarı, kalitesinin önüne geçmeye başlar.

Aynı zamanda başkalarının oyunlarını oynarken, sürekli olarak başkalarının bulduğu yerler, olay örgüsü, karakterler, oyun mekanikleri ile sınırlıyız. Böylece anladım ki...

… sadece bana bağlı olarak kendi dünyalarınızı yaratmanın zamanı geldi. Baba, Oğul ve Kutsal Ruh olduğum dünyalar!

Ve kendi oyun motorunuzu ve üzerine bir oyun yazarak gözlerinizi açabileceğinize, camları silebileceğinize ve kabininizi pompalayabileceğinize, daha deneyimli ve bütünleyici bir programcı olacağına içtenlikle inanıyorum.

Bu yazımda sizlere C/C++ ile küçük oyunlar yazmaya nasıl başladığımı, geliştirme sürecinin nasıl olduğunu ve yoğun bir ortamda hobi olarak nereden vakit bulduğumu anlatmaya çalışacağım. Sübjektiftir ve bireysel bir başlangıç ​​sürecini tanımlar. Cehalet ve inançla ilgili materyal, şu anda dünyayla ilgili kişisel resmim hakkında. Yani "Yönetim kişisel beyinlerinizden sorumlu değildir!".

Uygulama

"Uygulama olmadan bilgi işe yaramaz, bilgi olmadan uygulama tehlikelidir." Konfüçyüs

Defterim benim hayatım!


Yani pratikte benim için her şeyin bir defterle başladığını söyleyebilirim. Orada sadece günlük işlerimi yazmakla kalmıyor, aynı zamanda çiziyor, programlıyor, akış şemaları tasarlıyor ve matematiksel olanlar da dahil olmak üzere problem çözüyorum. Her zaman bir not defteri kullanın ve yalnızca kalemle yazın. Temiz, konforlu ve güvenilir, IMHO.

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
(Zaten doldurulmuş) defterim. Görünüşü böyle. Günlük görevleri, fikirleri, çizimleri, diyagramları, çözümleri, kara defter tutmayı, kodu vb. içerir.

Bu aşamada, üç projeyi tamamlamayı başardım (bu benim "kesinlik" anlayışıma göre, çünkü herhangi bir ürün nispeten sonsuz bir şekilde geliştirilebilir).

  • Proje 0: Bu, Unity oyun motoru kullanılarak C# ile yazılmış bir Architect Demo 3D sahnesidir. macOS ve Windows platformları için.
  • Oyun 1: Windows için konsol oyunu Simple Snake (herkes tarafından "Snake" olarak bilinir). C ile yazılmış
  • Oyun 2: konsol oyunu Crazy Tanks (herkes tarafından "Tanklar" olarak bilinir), zaten C ++ (sınıflar kullanılarak) ve ayrıca Windows altında yazılmıştır.

Proje 0 Mimar Demosu

  • Platform: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Dil: C#
  • Oyun motoru: Birlik
  • Esin: darrin lile
  • Depo: GitHub

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
3D Sahne Mimarı Demosu

İlk proje C/C++ ile değil, Unity oyun motoru kullanılarak C# ile hayata geçirildi. Bu motor, donanım açısından eskisi kadar talepkâr değildi. Unreal Engineve ayrıca kurulumu ve kullanımı bana daha kolay göründü. Diğer motorları düşünmedim.

Benim için Unity'deki amaç bir tür oyun geliştirmek değildi. Bir çeşit karakter içeren bir 3D sahne yaratmak istedim. O, daha doğrusu O (aşık olduğum kızı modelledim =) dış dünyayla hareket etmek ve etkileşim kurmak zorundaydı. Unity'nin ne olduğunu, geliştirme sürecinin ne olduğunu ve bir şey yaratmak için ne kadar çaba gerektiğini anlamak önemliydi. Architect Demo projesi böyle doğdu (adı neredeyse saçmalıktan icat edildi). Programlama, modelleme, animasyon, tekstüre etme muhtemelen iki aylık günlük çalışmamı aldı.

YouTube'da 3B modellerin nasıl oluşturulacağına ilişkin öğretici videolarla başladım. karıştırıcı. Blender, kurulum gerektirmeyen 3B modelleme (ve daha fazlası) için harika bir ücretsiz araçtır. Ve burada beni bir şok bekliyordu ... Modelleme, animasyon, doku oluşturmanın üzerine kitap yazabileceğiniz çok büyük ayrı konular olduğu ortaya çıktı. Bu özellikle karakterler için geçerlidir. Parmakları, dişleri, gözleri ve vücudun diğer kısımlarını modellemek için anatomi bilgisine ihtiyacınız olacak. Yüz kasları nasıl düzenlenir? İnsanlar nasıl hareket eder? Her kola, bacağa, parmağa, eklemlere kemik "yerleştirmek" zorunda kaldım!

Animasyonun doğal görünmesi için köprücük kemiğini ve ek kemik kaldıraçlarını modelleyin. Bu tür derslerden sonra, animasyon filmlerinin yaratıcılarının sadece 30 saniyelik video oluşturmak için ne kadar büyük bir iş yaptıklarını anlıyorsunuz. Ancak 3D filmler saatlerce sürer! Sonra sinemalardan çıkıp şöyle bir şey söylüyoruz: “Ta, boktan bir çizgi film / film! Daha iyisini yapabilirlerdi…” Aptallar!

Ve bu projede programlamayla ilgili bir şey daha. Benim için en ilginç kısmın matematiksel kısım olduğu ortaya çıktı. Sahneyi çalıştırırsanız (proje açıklamasındaki depoya bağlantı), kameranın kız karakterin etrafında bir küre içinde döndüğünü fark edeceksiniz. Kameranın böyle bir dönüşünü programlamak için önce daire (2D) ve ardından küre (3D) üzerindeki konum noktasının koordinatlarını hesaplamam gerekiyordu. Komik olan şu ki okulda matematikten nefret ediyordum ve bunu C-eksi ile biliyordum. Kısmen, muhtemelen okulda size bu matematiğin hayatta nasıl uygulandığını açıklamadıkları için. Ama hedefinize, hayalinize takıntılı olduğunuzda zihniniz berraklaşır ve açılır! Ve zor görevleri heyecan verici bir macera olarak algılamaya başlıyorsunuz. Ve sonra şunu düşünüyorsunuz: "Peki, neden *en sevdiğiniz* matematikçiniz size bu formüllerin nerede uygulanabileceğini normal bir şekilde söyleyemiyor?"

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Daire ve küre üzerindeki bir noktanın koordinatlarını hesaplamak için formüllerin hesaplanması (defterimden)

Oyun 1

  • Platform: Windows (Windows 7, 10'da test edilmiştir)
  • Dil: Saf C ile yazılmış olduğunu düşünüyorum
  • Oyun motoru: Windows konsolu
  • Esin: javidx9
  • Depo: GitHub

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Basit Yılan oyunu

3D sahne bir oyun değildir. Ayrıca 3B nesneleri (özellikle karakterleri) modellemek ve canlandırmak uzun ve zordur. Unity ile oynadıktan sonra, temelden devam etmem veya daha doğrusu başlamam gerektiğini fark ettim. Oyunların yapısını anlamak için basit ve hızlı ama aynı zamanda küresel bir şey.

Ve elimizde basit ve hızlı ne var? Bu doğru, konsol ve 2B. Daha doğrusu konsol ve semboller bile. Yine internetten ilham aramaya başladım (genel olarak interneti XNUMX. yüzyılın en devrimci ve tehlikeli icadı olarak görüyorum). Tetris konsolu yapan bir programcının videosunu buldum. Ve oyununun benzerliğinde "yılanı" kesmeye karar verdi. Videodan iki temel şey öğrendim - oyun döngüsü (üç temel işlev / parça ile) ve arabelleğe çıktı.

Oyun döngüsü şöyle görünebilir:

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

Kod, tüm main() işlevini bir kerede sunar. Ve ilgili yorumdan sonra oyun döngüsü başlar. Döngüde üç temel işlev vardır: Input(), Logic(), Draw(). İlk olarak, Giriş verileri (çoğunlukla tuş vuruşu kontrolü), ardından Logic girilen verileri işler, ardından ekrana çizim - Çiz. Ve böylece her kare. Animasyon bu şekilde oluşturulur. Çizgi film gibi. Genellikle giriş verilerinin işlenmesi en fazla zaman alır ve bildiğim kadarıyla oyunun kare hızını belirler. Ancak burada Logic() işlevi çok hızlıdır. Bu nedenle kare hızı, bu hızı belirleyen gameSpeed ​​​​parametresi ile Sleep() işlevi tarafından kontrol edilmelidir.

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
oyun döngüsü. Not defterinde yılan programlama

Sembolik bir konsol oyunu geliştiriyorsanız, o zaman normal 'cout' akış çıktısını kullanarak verileri ekranda görüntülemek işe yaramaz - çok yavaştır. Bu nedenle, çıktının ekran arabelleğinde gerçekleştirilmesi gerekir. Çok daha hızlı ve oyun hatasız çalışacak. Dürüst olmak gerekirse, ekran arabelleğinin ne olduğunu ve nasıl çalıştığını tam olarak anlamıyorum. Ama burada bir kod örneği vereceğim ve belki yorumlarda birileri durumu açıklığa kavuşturabilir.

Ekran arabelleğini alma (eğer söyleyebilirsem):

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

Belirli bir çizginin ekrana doğrudan çıktısı ScoreLine (puanları görüntülemek için satır):

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

Teorik olarak bu oyunda karmaşık bir şey yok, bana giriş seviyesi bir oyuna güzel bir örnek gibi geliyor. Kod tek bir dosyaya yazılır ve çeşitli işlevlerde düzenlenir. Sınıf yok, miras yok. GitHub'daki depoya giderek oyunun kaynak kodundaki her şeyi kendiniz görebilirsiniz.

Oyun 2 Çılgın Tanklar

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Çılgın Tanklar oyunu

Karakterleri konsola yazdırmak muhtemelen bir oyuna dönüştürebileceğiniz en basit şeydir. Ama sonra bir sorun ortaya çıkıyor: karakterlerin farklı yükseklikleri ve genişlikleri var (yükseklik genişlikten daha büyük). Böylece, her şey orantısız görünecek ve aşağı veya yukarı hareket etmek, sola veya sağa hareket etmekten çok daha hızlı görünecektir. Bu etki "Yılan" da (Oyun 1) çok belirgindir. "Tanklar" (Oyun 2) böyle bir dezavantaja sahip değildir, çünkü oradaki çıktı, ekran piksellerini farklı renklerle boyayarak düzenlenir. Bir oluşturucu yazdığımı söyleyebilirsin. Doğru, bu çok daha ilginç olmasına rağmen zaten biraz daha karmaşık.

Bu oyun için ekranda piksel görüntüleme sistemimi anlatmak yeterli olacaktır. Bence oyunun ana kısmı bu. Ve kendin bulabileceğin diğer her şey.

Yani, ekranda gördüğünüz sadece bir dizi hareketli renkli dikdörtgen.

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Dikdörtgen seti

Her dikdörtgen, sayılarla dolu bir matrisle temsil edilir. Bu arada, ilginç bir nüansı vurgulayabilirim - oyundaki tüm matrisler tek boyutlu bir dizi olarak programlanmıştır. İki boyutlu değil, tek boyutlu! Tek boyutlu dizilerle çalışmak çok daha kolay ve hızlıdır.

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Oyun tankı matrisi örneği

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Bir Oyun Tankının Matrisini Tek Boyutlu Bir Diziyle Temsil Etmek

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Tek boyutlu bir dizi ile matris temsilinin daha açıklayıcı bir örneği

Ancak dizinin öğelerine erişim, sanki tek boyutlu değil de iki boyutlu bir diziymiş gibi çift döngüde gerçekleşir. Bu, hala matrislerle çalıştığımız için yapıldı.

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Tek boyutlu bir diziyi çift döngüde çaprazlama. Y, satır kimliğidir, X, sütun kimliğidir

Lütfen normal matris tanımlayıcıları i, j yerine x ve y tanımlayıcılarını kullandığımı unutmayın. Yani bana öyle geliyor ki göze daha hoş ve beyin için daha net. Ek olarak, böyle bir notasyon, kullanılan matrislerin iki boyutlu bir görüntünün koordinat eksenlerine uygun şekilde yansıtılmasını mümkün kılar.

Şimdi pikseller, renk ve ekran hakkında. Çıktı için StretchDIBits işlevi (Header: windows.h; Library: gdi32.lib) kullanılır. Diğer şeylerin yanı sıra, bu işleve aşağıdakiler iletilir: görüntünün görüntülendiği cihaz (benim durumumda bu Windows konsolu), görüntüyü görüntülemeye başlama koordinatları, genişliği / yüksekliği ve görüntü bir bayt dizisiyle temsil edilen bir bitmap (bitmap) biçimindedir. Bir bayt dizisi olarak bitmap!

StretchDIBits() işlevi iş başında:

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

Bellek, VirtualAlloc() işlevi kullanılarak bu bitmap için önceden ayrılır. Yani, ekranda görüntülenecek olan tüm pikseller hakkında bilgi depolamak için gereken bayt sayısı ayrılmıştır.

Bir m_p_bitmapMemory bitmap oluşturma:

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

Kabaca söylemek gerekirse, bir bitmap bir dizi pikselden oluşur. Dizideki her dört bayt bir RGB pikselidir. Kırmızı değer başına bir bayt, yeşil değer başına bir bayt (G) ve mavi renk başına bir bayt (B). Artı, girinti başına bir bayt vardır. Bu üç renk - Kırmızı / Yeşil / Mavi (RGB) - farklı oranlarda birbirleriyle karıştırılır - ve ortaya çıkan piksel rengi elde edilir.

Şimdi yine her dikdörtgen veya oyun nesnesi bir sayı matrisiyle temsil ediliyor. Tüm bu oyun nesneleri bir koleksiyona yerleştirilmiştir. Ve sonra büyük bir sayısal matris oluşturarak oyun alanına yerleştirilirler. Matristeki her sayıyı belirli bir renge eşledim. Örneğin, 8 sayısı mavi, 9 sayısı sarı, 10 sayısı koyu gri vb. Böylece, her sayının bir tür renk olduğu bir oyun alanı matrisimiz olduğunu söyleyebiliriz.

Yani, bir yanda tüm oyun alanının sayısal bir matrisine, diğer yanda görüntüyü göstermek için bir bitmap'e sahibiz. Şimdiye kadar, bitmap "boş" - henüz istenen rengin pikselleri hakkında bilgiye sahip değil. Bu, son adımın, bitmap'i, oyun alanının sayısal matrisine dayalı olarak her bir piksel hakkındaki bilgilerle doldurmak olacağı anlamına gelir. Böyle bir dönüşümün açıklayıcı bir örneği aşağıdaki resimdedir.

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Bir bitmap'i (Pixel matrix) oyun alanının sayısal matrisine (Dijital matris) dayalı bilgilerle doldurma örneği (renk endeksleri oyundaki endekslerle eşleşmez)

Ayrıca oyundan gerçek bir kod parçası sunacağım. Döngünün her yinelemesinde colorIndex değişkenine, oyun alanının sayısal matrisinden (mainDigitalMatrix) bir değer (renk dizini) atanır. Ardından rengin kendisi indekse göre renk değişkenine yazılır. Ayrıca, ortaya çıkan renk kırmızı, yeşil ve mavi (RGB) oranına bölünür. Ve girinti (pixelPadding) ile birlikte bu bilgi piksele tekrar tekrar yazılarak bitmap'te renkli bir görüntü oluşturulur.

Kod, anlaşılması zor olabilen işaretçiler ve bitsel işlemler kullanır. Bu yüzden, bu tür yapıların nasıl çalıştığını bir yerde ayrıca okumanızı tavsiye ederim.

Bir bitmap'i oyun alanının sayısal matrisine dayalı bilgilerle doldurma:

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

Yukarıda açıklanan yönteme göre, Crazy Tanks oyununda bir resim (çerçeve) oluşturulur ve Draw() işlevinde ekranda görüntülenir. Girdi() işlevinde tuş vuruşlarını kaydettikten ve bunların Logic() işlevinde müteakip işlenmesinden sonra, yeni bir resim (çerçeve) oluşturulur. Doğru, oyun nesneleri oyun alanında zaten farklı bir konuma sahip olabilir ve buna göre farklı bir yere çizilir. Animasyon (hareket) bu şekilde gerçekleşir.

Teorik olarak (hiçbir şeyi unutmadıysanız), ilk oyundan ("Yılan") oyun döngüsünü ve ikinci oyundan ("Tanklar") ekranda piksel görüntüleme sistemini anlamak, herhangi bir şey yazmak için ihtiyacınız olan tek şeydir. Windows için 2D oyunlarınız. Sessiz! 😉 Geri kalan kısımlar sadece bir hayal uçuşu.

Tabii ki, "Tanklar" oyunu "Yılan" dan çok daha karmaşık bir şekilde tasarlanmıştır. Ben zaten C++ dilini kullanıyordum yani farklı oyun nesnelerini sınıflarla tanımlamıştım. Kendi koleksiyonumu oluşturdum - kodu headers/Box.h dosyasında görebilirsiniz. Bu arada, koleksiyonda büyük olasılıkla bir bellek sızıntısı var. Kullanılan işaretçiler. Hafıza ile çalıştı. Kitabın bana çok yardımcı olduğunu söylemeliyim. Oyun Programlama Aracılığıyla C++'a Başlamak. Bu, C++'a yeni başlayanlar için harika bir başlangıç. Küçük, ilginç ve iyi organize edilmiş.

Bu oyunu geliştirmek yaklaşık altı ay sürdü. Ağırlıklı olarak öğle yemeğinde ve iş yerindeki atıştırmalıklarda yazdım. Ofis mutfağında oturdu, yiyecekleri çiğnedi ve kod yazdı. Ya da akşam yemeği için evde. Bu yüzden böyle "mutfak savaşları" yaşadım. Her zaman olduğu gibi aktif olarak bir defter kullandım ve tüm kavramsal şeyler onun içinde doğdu.

Pratik kısmın sonunda defterimden birkaç tarama çıkaracağım. Tam olarak ne yazdığımı, çizdiğimi, saydığımı, tasarladığımı göstermek için…

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Tank görüntü tasarımı. Ve ekranda her bir tankın kaç piksel kaplaması gerektiğinin tanımı

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Tankın kendi ekseni etrafında dönmesi için algoritma ve formüllerin hesaplanması

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Koleksiyonumun şeması (büyük olasılıkla bellek sızıntısı olan). Koleksiyon, Bağlantılı Liste olarak oluşturulur

DevOps C++ ve "mutfak savaşları" veya yemek yerken oyun yazmaya nasıl başladım
Ve bunlar yapay zekayı oyuna sokmak için beyhude girişimler.

Теория

"Bin millik bir yolculuk bile ilk adımla başlar" (Eski Çin bilgeliği)

Pratikten teoriye geçelim! Hobiniz için nasıl zaman buluyorsunuz?

  1. Gerçekten ne istediğinizi belirleyin (ne yazık ki bu en zoru).
  2. Öncelikleri belirleyin.
  3. Daha yüksek öncelikler uğruna tüm "gereksiz" şeyleri feda edin.
  4. Her gün hedeflerinize doğru ilerleyin.
  5. Bir hobi için iki veya üç saat boş zaman olmasını beklemeyin.

Bir yandan ne istediğinizi belirlemeniz ve önceliklendirmeniz gerekiyor. Öte yandan bazı durumlardan/projelerden bu öncelikler lehine vazgeçilmesi de mümkündür. Başka bir deyişle, "gereksiz" her şeyi feda etmeniz gerekecek. Bir yerde hayatta en fazla üç ana faaliyet olması gerektiğini duydum. O zaman onlarla en iyi şekilde başa çıkabileceksiniz. Ve ek projeler/yönlendirmeler bayat bir şekilde aşırı yüklenmeye başlayacak. Ancak bunların hepsi muhtemelen öznel ve bireyseldir.

Kesin bir altın kural vardır: asla %0 gününüz olmasın! Bunu bağımsız bir geliştirici tarafından yazılan bir makalede öğrendim. Bir proje üzerinde çalışıyorsanız, her gün bu konuda bir şeyler yapın. Ve ne kadar kazandığın önemli değil. Bir kelime veya bir satır kod yazın, bir öğretici video izleyin veya tahtaya bir çivi çakın; sadece bir şeyler yapın. En zor kısım başlamaktır. Başladığınızda, muhtemelen istediğinizden biraz daha fazlasını yapacaksınız. Böylece sürekli olarak hedefinize doğru ilerleyecek ve inan bana çok hızlı bir şekilde ilerleyeceksiniz. Sonuçta, her şeyin ana freni ertelemedir.

Ve 5, 10, 15 dakikalık zamanın serbest "talaşını" hafife almamanız ve görmezden gelmemeniz, bir veya iki saat süren bazı büyük "kütükler" beklemeniz gerektiğini hatırlamak önemlidir. Sırada mı duruyorsun? Projeniz için bir şeyler düşünün. Yürüyen merdivenle mi çıkıyorsunuz? Bir deftere bir şeyler yazın. Otobüste yemek yer misin? Tamam, biraz makale oku. Her fırsatı kullanın. YouTube'da kedi ve köpekleri izlemeyi bırakın! Beyninizi karıştırmayın!

Ve sonuncusu. Bu makaleyi okuduktan sonra oyun motorlarını kullanmadan oyun yaratma fikrini beğendiyseniz, Casey Muratori adını hatırlayın. Bu adam var web sitesi. "İzle -> ÖNCEKİ BÖLÜMLER" bölümünde sıfırdan profesyonel bir oyunun nasıl oluşturulacağına dair harika ücretsiz video eğitimleri bulacaksınız. Windows için C'ye Giriş'in beş dersinde, üniversitede beş yıllık eğitimden daha fazlasını öğrenebilirsiniz (birisi videonun altındaki yorumlarda bunun hakkında yazmıştır).

Casey ayrıca kendi oyun motorunuzu geliştirerek mevcut tüm motorları daha iyi anlayacağınızı açıklıyor. Herkesin otomatikleştirmeye çalıştığı çerçeveler dünyasında, kullanmayı değil oluşturmayı öğreneceksiniz. Bilgisayarların doğasını anlayın. Ayrıca çok daha zeki ve olgun bir programcı, bir profesyonel olacaksınız.

Seçtiğiniz yolda iyi şanslar! Ve dünyayı daha profesyonel hale getirelim.

Yazar: Grankin Andrey, DevOps



Kaynak: habr.com