DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan

"Saya tahu bahawa saya tidak tahu apa-apa" Socrates

Untuk siapa: untuk orang IT yang meludahi semua pembangun dan mahu bermain permainan mereka!

Tentang apa: bagaimana untuk mula menulis permainan dalam C/C++ jika anda memerlukannya!

Mengapa anda perlu membaca ini: Pembangunan apl bukanlah kepakaran kerja saya, tetapi saya cuba membuat kod setiap minggu. Kerana saya suka permainan!

Hello nama saya ialah Andrey Grankin, saya seorang DevOps di Luxoft. Pembangunan aplikasi bukanlah kepakaran kerja saya, tetapi saya cuba membuat kod setiap minggu. Kerana saya suka permainan!

Industri permainan komputer adalah besar, malah lebih dikhabarkan hari ini daripada industri filem. Permainan telah ditulis sejak permulaan pembangunan komputer, menggunakan, mengikut piawaian moden, kaedah pembangunan yang kompleks dan asas. Lama kelamaan, enjin permainan mula muncul dengan grafik, fizik dan bunyi yang telah diprogramkan. Mereka membolehkan anda memberi tumpuan kepada pembangunan permainan itu sendiri dan tidak mengganggu asasnya. Tetapi bersama-sama dengan mereka, dengan enjin, pemaju "menjadi buta" dan merendahkan. Pengeluaran permainan diletakkan pada penghantar. Dan kuantiti pengeluaran mula mengatasi kualitinya.

Pada masa yang sama, apabila bermain permainan orang lain, kita sentiasa terhad oleh lokasi, plot, watak, mekanik permainan yang dicipta oleh orang lain. Jadi saya sedar bahawa...

… sudah tiba masanya untuk mencipta dunia anda sendiri, tertakluk hanya kepada saya. Dunia di mana Aku adalah Bapa, dan Anak, dan Roh Kudus!

Dan saya sangat percaya bahawa dengan menulis enjin permainan anda sendiri dan permainan di atasnya, anda akan dapat membuka mata anda, mengelap tingkap dan mengepam kabin anda, menjadi pengaturcara yang lebih berpengalaman dan penting.

Dalam artikel ini saya akan cuba memberitahu anda bagaimana saya mula menulis permainan kecil dalam C / C ++, apakah proses pembangunan dan di mana saya mencari masa untuk hobi dalam persekitaran yang sibuk. Ia subjektif dan menerangkan proses permulaan individu. Bahan tentang kejahilan dan iman, tentang gambaran peribadi saya tentang dunia pada masa ini. Dalam erti kata lain, "Pentadbiran tidak bertanggungjawab untuk otak peribadi anda!".

Amalan

"Ilmu tanpa amalan adalah sia-sia, amalan tanpa ilmu adalah berbahaya." Confucius

Buku nota saya adalah hidup saya!


Jadi, dalam amalan, saya boleh mengatakan bahawa segala-galanya untuk saya bermula dengan buku nota. Saya menulis bukan sahaja tugas harian saya di sana, tetapi juga melukis, memprogram, mereka bentuk carta alir dan menyelesaikan masalah, termasuk matematik. Sentiasa gunakan pad nota dan tulis hanya dengan pensel. Ia bersih, selesa dan boleh dipercayai, IMHO.

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Buku nota saya (sudah diisi). Beginilah rupanya. Ia mengandungi tugas harian, idea, lukisan, rajah, penyelesaian, simpan kira hitam, kod dan sebagainya.

Pada peringkat ini, saya berjaya menyiapkan tiga projek (ini adalah dalam pemahaman saya tentang "muktamad", kerana mana-mana produk boleh dibangunkan secara relatifnya tanpa henti).

  • Projek 0: ini ialah adegan 3D Arkitek Demo yang ditulis dalam C# menggunakan enjin permainan Unity. Untuk platform macOS dan Windows.
  • Permainan 1: permainan konsol Simple Snake (dikenali oleh semua orang sebagai "Snake") untuk Windows. ditulis dalam C.
  • Permainan 2: permainan konsol Crazy Tanks (dikenali oleh semua orang sebagai "Tanks"), sudah ditulis dalam C ++ (menggunakan kelas) dan juga di bawah Windows.

Demo Arkitek Projek 0

  • Platform: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Bahasa: C#
  • Enjin permainan: Perpaduan
  • Inspirasi: Darrin Lile
  • Repositori: GitHub

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Demo Arkitek Pemandangan 3D

Projek pertama dilaksanakan bukan dalam C/C++, tetapi dalam C# menggunakan enjin permainan Unity. Enjin ini tidak menuntut perkakasan seperti Enjin Unreal, dan saya juga nampak lebih mudah untuk memasang dan digunakan. Saya tidak menganggap enjin lain.

Matlamat dalam Unity bagi saya bukanlah untuk membangunkan sejenis permainan. Saya mahu mencipta pemandangan 3D dengan beberapa jenis watak. Dia, atau lebih tepatnya Dia (saya model gadis yang saya cintai =) terpaksa bergerak dan berinteraksi dengan dunia luar. Ia hanya penting untuk memahami apa itu Perpaduan, apakah proses pembangunan, dan berapa banyak usaha yang diperlukan untuk mencipta sesuatu. Ini adalah bagaimana projek Demo Arkitek dilahirkan (nama itu dicipta hampir dari omong kosong). Pengaturcaraan, pemodelan, animasi, penteksunan mungkin mengambil masa dua bulan saya bekerja setiap hari.

Saya bermula dengan video tutorial di YouTube tentang cara mencipta model 3D Blender. Blender ialah alat percuma yang hebat untuk pemodelan 3D (dan banyak lagi) yang tidak memerlukan pemasangan. Dan di sini kejutan menanti saya ... Ternyata pemodelan, animasi, penteksunan adalah topik berasingan yang besar di mana anda boleh menulis buku. Ini benar terutamanya untuk watak-watak. Untuk memodelkan jari, gigi, mata dan bahagian badan yang lain, anda memerlukan pengetahuan tentang anatomi. Bagaimanakah susunan otot muka? Bagaimana orang bergerak? Saya terpaksa "memasukkan" tulang ke setiap lengan, kaki, jari, buku jari!

Model tulang selangka, tuas tulang tambahan, supaya animasi kelihatan semula jadi. Selepas pelajaran sedemikian, anda menyedari betapa besar kerja yang dilakukan oleh pencipta filem animasi, hanya untuk mencipta video selama 30 saat. Tetapi filem 3D bertahan selama berjam-jam! Dan kemudian kami keluar dari pawagam dan berkata seperti: “Ta, kartun / filem yang buruk! Mereka boleh melakukan yang lebih baik…” Bodoh!

Dan satu lagi perkara tentang pengaturcaraan dalam projek ini. Ternyata, bahagian yang paling menarik bagi saya ialah bahagian matematik. Jika anda menjalankan adegan (pautan ke repositori dalam penerangan projek), anda akan melihat bahawa kamera berputar mengelilingi watak gadis dalam sfera. Untuk memprogramkan putaran kamera sedemikian, saya perlu mengira koordinat titik kedudukan pada bulatan (2D) dahulu, dan kemudian pada sfera (3D). Perkara yang lucu ialah saya membenci matematik di sekolah dan mengetahuinya dengan tolak. Sebahagiannya, mungkin, kerana di sekolah mereka tidak menerangkan kepada anda bagaimana sebenarnya matematik ini digunakan dalam kehidupan. Tetapi apabila anda taksub dengan matlamat anda, bermimpi, maka minda dibersihkan, didedahkan! Dan anda mula menganggap tugas yang kompleks sebagai pengembaraan yang menarik. Dan kemudian anda berfikir: "Nah, mengapa ahli matematik *yang dikasihi* biasanya tidak memberitahu di mana formula ini boleh disandarkan?".

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Pengiraan formula untuk mengira koordinat titik pada bulatan dan sfera (dari buku nota saya)

Permainan 1

  • Platform: Windows (diuji pada Windows 7, 10)
  • Bahasa: Saya rasa ia ditulis dalam C tulen
  • Enjin permainan: Konsol Windows
  • Inspirasi: javidx9
  • Repositori: GitHub

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Permainan Ular yang mudah

Adegan 3D bukan permainan. Di samping itu, pemodelan dan menganimasikan objek 3D (terutamanya watak) adalah panjang dan sukar. Selepas bermain-main dengan Unity, saya menyedari bahawa saya perlu meneruskan, atau lebih tepatnya bermula, dari asas. Sesuatu yang mudah dan cepat, tetapi pada masa yang sama global, untuk memahami struktur permainan.

Dan apa yang kita ada mudah dan cepat? Betul, konsol dan 2D. Lebih tepat lagi, walaupun konsol dan simbol. Sekali lagi, saya mula mencari inspirasi di Internet (secara umum, saya menganggap Internet sebagai ciptaan paling revolusioner dan berbahaya pada abad ke-XNUMX). Saya menggali video seorang pengaturcara yang membuat konsol Tetris. Dan dalam rupa permainannya, dia memutuskan untuk memotong "ular". Daripada video itu, saya belajar tentang dua perkara asas - gelung permainan (dengan tiga fungsi / bahagian asas) dan output kepada penimbal.

Gelung permainan mungkin kelihatan seperti ini:

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

Kod membentangkan keseluruhan fungsi main() sekaligus. Dan kitaran permainan bermula selepas komen yang sepadan. Terdapat tiga fungsi asas dalam gelung: Input(), Logic(), Draw(). Pertama, Input data (kebanyakannya kawalan ketukan kekunci), kemudian Logik memproses data yang dimasukkan, kemudian melukis ke skrin - Lukis. Dan sebagainya setiap bingkai. Animasi dicipta dengan cara ini. Ia seperti kartun. Biasanya memproses data input mengambil masa paling lama dan, setakat yang saya tahu, menentukan kadar bingkai permainan. Tetapi di sini fungsi Logic() sangat pantas. Oleh itu, kadar bingkai mesti dikawal oleh fungsi Sleep() dengan parameter Kelajuan permainan, yang menentukan kadar ini.

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
kitaran permainan. Pengaturcaraan ular dalam notepad

Jika anda sedang membangunkan permainan konsol simbolik, maka memaparkan data pada skrin menggunakan 'cout' keluaran aliran biasa tidak akan berfungsi - ia sangat perlahan. Oleh itu, output mesti dijalankan dalam penampan skrin. Lebih pantas dan permainan akan berfungsi tanpa gangguan. Sejujurnya, saya tidak begitu faham apa itu penimbal skrin dan cara ia berfungsi. Tetapi saya akan memberikan contoh kod di sini, dan mungkin seseorang dalam komen akan dapat menjelaskan keadaan.

Mendapatkan penimbal skrin (jika saya boleh berkata demikian):

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

Output terus ke skrin garis markah tertentu (garisan untuk memaparkan markah):

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

Secara teori, tidak ada yang rumit dalam permainan ini, nampaknya saya merupakan contoh yang baik dari permainan peringkat permulaan. Kod ini ditulis dalam satu fail dan disusun dalam beberapa fungsi. Tiada kelas, tiada warisan. Anda sendiri boleh melihat segala-galanya dalam kod sumber permainan dengan pergi ke repositori di GitHub.

Permainan 2 Crazy Tank

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Permainan Crazy Tanks

Mencetak aksara ke konsol mungkin merupakan perkara paling mudah yang boleh anda ubah menjadi permainan. Tetapi kemudian satu masalah muncul: aksara mempunyai ketinggian dan lebar yang berbeza (ketinggian lebih besar daripada lebar). Oleh itu, semuanya akan kelihatan tidak seimbang, dan bergerak ke bawah atau ke atas akan kelihatan lebih cepat daripada bergerak ke kiri atau kanan. Kesan ini sangat ketara dalam "Ular" (Permainan 1). "Tangki" (Permainan 2) tidak mempunyai kelemahan sedemikian, kerana output di sana diatur dengan mengecat piksel skrin dengan warna yang berbeza. Anda boleh katakan saya menulis renderer. Benar, ini sudah sedikit lebih rumit, walaupun lebih menarik.

Untuk permainan ini, sudah cukup untuk menerangkan sistem saya untuk memaparkan piksel pada skrin. Saya fikir ini adalah bahagian utama permainan. Dan segala-galanya yang anda boleh buat sendiri.

Jadi, apa yang anda lihat pada skrin hanyalah satu set segi empat tepat berwarna bergerak.

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Set segi empat tepat

Setiap segi empat tepat diwakili oleh matriks yang diisi dengan nombor. Dengan cara ini, saya boleh menyerlahkan satu nuansa yang menarik - semua matriks dalam permainan diprogramkan sebagai tatasusunan satu dimensi. Bukan dua dimensi, tetapi satu dimensi! Tatasusunan satu dimensi adalah lebih mudah dan pantas untuk digunakan.

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Contoh matriks tangki permainan

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Mewakili Matriks Tangki Permainan dengan Susunan Satu Dimensi

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Contoh yang lebih ilustrasi bagi perwakilan matriks oleh tatasusunan satu dimensi

Tetapi akses kepada elemen tatasusunan berlaku dalam gelung berganda, seolah-olah ia bukan tatasusunan satu dimensi, tetapi tatasusunan dua dimensi. Ini dilakukan kerana kami masih bekerja dengan matriks.

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Melintasi tatasusunan satu dimensi dalam gelung berganda. Y ialah ID baris, X ialah ID lajur

Sila ambil perhatian bahawa bukannya pengecam matriks biasa i, j, saya menggunakan pengecam x dan y. Jadi, nampaknya saya, lebih sedap mata memandang dan lebih jelas untuk otak. Selain itu, tatatanda sedemikian membolehkan untuk menayangkan matriks yang digunakan dengan mudah pada paksi koordinat imej dua dimensi.

Sekarang mengenai piksel, warna dan paparan. Fungsi StretchDIBits (Header: windows.h; Library: gdi32.lib) digunakan untuk output. Antara lain, perkara berikut dihantar ke fungsi ini: peranti di mana imej dipaparkan (dalam kes saya, ini adalah konsol Windows), koordinat permulaan paparan imej, lebar / ketinggiannya, dan imej itu sendiri dalam bentuk peta bit (bitmap), diwakili oleh pelbagai bait. Peta bit sebagai tatasusunan bait!

Fungsi StretchDIBits() di tempat kerja:

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

Memori diperuntukkan terlebih dahulu untuk bitmap ini menggunakan fungsi VirtualAlloc(). Iaitu, bilangan bait yang diperlukan dikhaskan untuk menyimpan maklumat tentang semua piksel, yang kemudiannya akan dipaparkan pada skrin.

Mencipta peta bit 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);

Secara kasarnya, peta bit terdiri daripada satu set piksel. Setiap empat bait dalam tatasusunan ialah piksel RGB. Satu bait setiap nilai merah, satu bait setiap nilai hijau (G), dan satu bait setiap warna biru (B). Selain itu, terdapat satu bait setiap inden. Tiga warna ini - Merah / Hijau / Biru (RGB) - dicampur antara satu sama lain dalam perkadaran yang berbeza - dan warna piksel yang terhasil diperoleh.

Sekarang, sekali lagi, setiap segi empat tepat, atau objek permainan, diwakili oleh matriks nombor. Semua objek permainan ini diletakkan dalam koleksi. Dan kemudian mereka diletakkan di padang permainan, membentuk satu matriks berangka yang besar. Saya memetakan setiap nombor dalam matriks kepada warna tertentu. Contohnya, nombor 8 berwarna biru, nombor 9 berwarna kuning, nombor 10 berwarna kelabu gelap, dan seterusnya. Oleh itu, kita boleh mengatakan bahawa kita mempunyai matriks padang permainan, di mana setiap nombor adalah sejenis warna.

Jadi, kami mempunyai matriks berangka bagi keseluruhan padang permainan di satu pihak dan peta bit untuk memaparkan imej di pihak yang lain. Setakat ini, peta bit adalah "kosong" - ia belum mempunyai maklumat tentang piksel warna yang dikehendaki. Ini bermakna bahawa langkah terakhir akan mengisi bitmap dengan maklumat tentang setiap piksel berdasarkan matriks berangka medan permainan. Contoh ilustrasi transformasi sedemikian adalah dalam gambar di bawah.

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Contoh pengisian bitmap (Matriks piksel) dengan maklumat berdasarkan matriks berangka (Matriks digital) medan permainan (indeks warna tidak sepadan dengan indeks dalam permainan)

Saya juga akan membentangkan sekeping kod sebenar daripada permainan. Indeks warna berubah pada setiap lelaran gelung diberikan nilai (indeks warna) daripada matriks berangka medan permainan (mainDigitalMatrix). Kemudian warna itu sendiri ditulis kepada pembolehubah warna berdasarkan indeks. Selanjutnya, warna yang terhasil dibahagikan kepada nisbah merah, hijau dan biru (RGB). Dan bersama-sama dengan inden (pixelPadding), maklumat ini ditulis pada piksel berulang kali, membentuk imej berwarna dalam peta bit.

Kod ini menggunakan penunjuk dan operasi bitwise, yang mungkin sukar difahami. Oleh itu, saya menasihati anda untuk membaca secara berasingan di suatu tempat bagaimana struktur tersebut berfungsi.

Mengisi bitmap dengan maklumat berdasarkan matriks berangka medan permainan:

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

Mengikut kaedah yang diterangkan di atas, satu gambar (bingkai) dibentuk dalam permainan Crazy Tanks dan dipaparkan pada skrin dalam fungsi Draw(). Selepas mendaftarkan ketukan kekunci dalam fungsi Input() dan pemprosesan seterusnya dalam fungsi Logic(), gambar (bingkai) baharu terbentuk. Benar, objek permainan mungkin sudah mempunyai kedudukan yang berbeza di padang permainan dan, dengan itu, dilukis di tempat yang berbeza. Beginilah bagaimana animasi (pergerakan) berlaku.

Secara teori (jika anda tidak terlupa apa-apa), memahami gelung permainan daripada permainan pertama (“Ular”) dan sistem untuk memaparkan piksel pada skrin daripada permainan kedua (“Kereta kebal”) adalah semua yang anda perlukan untuk menulis sebarang permainan 2D anda untuk Windows. Tanpa bunyi! 😉 Bahagian selebihnya hanyalah penerbangan mewah.

Sudah tentu, permainan "Tangki" direka lebih rumit daripada "Ular". Saya sudah menggunakan bahasa C++, iaitu, saya menerangkan objek permainan yang berbeza dengan kelas. Saya mencipta koleksi saya sendiri - anda boleh melihat kod dalam tajuk/Box.h. Dengan cara ini, koleksi kemungkinan besar mempunyai kebocoran memori. Penunjuk terpakai. Bekerja dengan ingatan. Saya mesti mengatakan bahawa buku itu banyak membantu saya. Memulakan C++ Melalui Pengaturcaraan Permainan. Ini adalah permulaan yang baik untuk pemula dalam C++. Ia kecil, menarik dan teratur.

Ia mengambil masa kira-kira enam bulan untuk membangunkan permainan ini. Saya menulis terutamanya semasa makan tengah hari dan makanan ringan di tempat kerja. Dia duduk di dapur pejabat, memijak makanan dan menulis kod. Atau di rumah untuk makan malam. Jadi saya mendapat "perang dapur" sedemikian. Seperti biasa, saya secara aktif menggunakan buku nota, dan semua perkara konsep lahir di dalamnya.

Di akhir bahagian praktikal, saya akan mengeluarkan beberapa imbasan buku nota saya. Untuk menunjukkan apa sebenarnya yang saya tulis, melukis, mengira, mereka bentuk…

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Reka bentuk imej tangki. Dan takrifan bilangan piksel yang perlu diduduki oleh setiap tangki pada skrin

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Pengiraan algoritma dan formula untuk putaran tangki di sekeliling paksinya

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Gambar rajah koleksi saya (yang mempunyai kebocoran memori, kemungkinan besar). Koleksi dibuat sebagai Senarai Terpaut

DevOps C++ dan "perang dapur", atau Bagaimana saya mula menulis permainan semasa makan
Dan ini adalah percubaan yang sia-sia untuk memasukkan kecerdasan buatan ke dalam permainan

Teori

"Walaupun perjalanan seribu batu bermula dengan langkah pertama" (Kebijaksanaan Cina Kuno)

Mari beralih dari amalan kepada teori! Bagaimana anda mencari masa untuk hobi anda?

  1. Tentukan apa yang anda mahukan (sayangnya, ini yang paling sukar).
  2. Tetapkan keutamaan.
  3. Korbankan semua "berlebihan" demi keutamaan yang lebih tinggi.
  4. Bergerak ke arah matlamat anda setiap hari.
  5. Jangan harap akan ada dua atau tiga jam masa lapang untuk hobi.

Di satu pihak, anda perlu menentukan apa yang anda mahu dan memberi keutamaan. Sebaliknya, ada kemungkinan untuk meninggalkan beberapa kes / projek yang memihak kepada keutamaan ini. Dalam erti kata lain, anda perlu mengorbankan segala-galanya "berlebihan". Saya mendengar di suatu tempat bahawa dalam hidup harus ada maksimum tiga aktiviti utama. Kemudian anda akan dapat menangani mereka dengan cara yang terbaik. Dan projek/arah tambahan akan mula terlalu membebankan. Tetapi ini semua, mungkin, subjektif dan individu.

Terdapat peraturan emas tertentu: jangan sekali-kali mempunyai hari 0%! Saya belajar mengenainya dalam artikel oleh pembangun indie. Jika anda sedang menjalankan projek, maka lakukan sesuatu mengenainya setiap hari. Dan tidak kira berapa banyak yang anda buat. Tulis satu perkataan atau satu baris kod, tonton satu video tutorial atau pukul satu paku pada papan—buat sahaja sesuatu. Bahagian yang paling sukar ialah bermula. Sebaik sahaja anda mula, anda mungkin akan melakukan lebih sedikit daripada yang anda mahu. Jadi anda akan sentiasa bergerak ke arah matlamat anda dan, percayalah, dengan cepat. Lagipun, brek utama pada semua perkara adalah penangguhan.

Dan adalah penting untuk diingat bahawa anda tidak boleh memandang rendah dan mengabaikan "habuk papan" percuma dalam 5, 10, 15 minit, tunggu beberapa "log" besar yang berlangsung satu atau dua jam. Adakah anda berdiri dalam barisan? Fikirkan sesuatu untuk projek anda. Adakah anda menaiki eskalator? Tulis sesuatu dalam buku nota. Adakah anda makan dalam bas? Okay, baca beberapa artikel. Gunakan setiap peluang. Berhenti menonton kucing dan anjing di YouTube! Jangan kacau otak anda!

Dan yang terakhir. Jika, selepas membaca artikel ini, anda menyukai idea mencipta permainan tanpa menggunakan enjin permainan, maka ingat nama Casey Muratori. Lelaki ini mempunyai laman web. Dalam bahagian "tonton -> EPISOD SEBELUMNYA" anda akan menemui tutorial video percuma yang menakjubkan tentang cara mencipta permainan profesional dari awal. Dalam lima pelajaran Pengenalan kepada C untuk Windows, anda mungkin belajar lebih daripada lima tahun pengajian di universiti (seseorang menulis tentang perkara ini dalam komen di bawah video).

Casey juga menerangkan bahawa dengan membangunkan enjin permainan anda sendiri, anda akan mempunyai pemahaman yang lebih baik tentang mana-mana enjin sedia ada. Dalam dunia rangka kerja, di mana semua orang cuba mengautomasikan, anda akan belajar cara mencipta, bukan menggunakan. Fahami sifat komputer. Dan anda juga akan menjadi pengaturcara yang lebih bijak dan matang - seorang profesional.

Semoga berjaya di jalan pilihan anda! Dan mari jadikan dunia lebih profesional.

Pengarang Kakek Andrey, DevOps



Sumber: www.habr.com