DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan

“Saya tahu bahwa saya tidak tahu apa-apa” Socrates

Untuk siapa: untuk orang IT yang tidak peduli dengan semua pengembang dan ingin memainkan game mereka!

Tentang apa: tentang cara mulai menulis game dalam C/C++, jika Anda tiba-tiba membutuhkannya!

Mengapa Anda harus membaca ini: Pengembangan aplikasi bukanlah bidang keahlian saya, tetapi saya mencoba membuat kode setiap minggu. Karena saya suka permainan!

Halo, namaku adalah Andrey Grankin, saya DevOps di Luxoft. Pengembangan aplikasi bukanlah keahlian saya, tetapi saya mencoba membuat kode setiap minggu. Karena saya suka permainan!

Industri game komputer sangatlah besar, bahkan dikabarkan lebih besar dari industri film saat ini. Game telah ditulis sejak awal mula komputer, menurut standar modern, menggunakan metode pengembangan yang kompleks dan mendasar. Seiring waktu, mesin permainan dengan grafik, fisika, dan suara yang sudah terprogram mulai bermunculan. Mereka memungkinkan Anda untuk fokus pada pengembangan game itu sendiri dan tidak mengkhawatirkan fondasinya. Namun seiring dengan itu, dengan mesin, pengembang “menjadi buta” dan mengalami degradasi. Produksi game itu sendiri ditempatkan di ban berjalan. Dan kuantitas produk mulai mengalahkan kualitasnya.

Pada saat yang sama, saat memainkan game orang lain, kita selalu dibatasi oleh lokasi, plot, karakter, dan mekanisme game yang dibuat oleh orang lain. Jadi saya menyadari bahwa...

... waktunya telah tiba untuk menciptakan duniaku sendiri, yang hanya tunduk padaku. Dunia di mana Aku adalah Bapa, Putra, dan Roh Kudus!

Dan saya sangat yakin bahwa dengan menulis mesin permainan Anda sendiri dan memainkannya, Anda akan dapat melepas sepatu Anda, menyeka jendela dan meningkatkan kabin Anda, menjadi programmer yang lebih berpengalaman dan lengkap.

Pada artikel ini saya akan mencoba memberi tahu Anda bagaimana saya mulai menulis game kecil di C/C++, seperti apa proses pengembangannya, dan di mana saya menemukan waktu untuk melakukan hobi di lingkungan yang sibuk. Ini subjektif dan menggambarkan proses permulaan individu. Materi tentang kebodohan dan keimanan, tentang gambaran pribadi saya tentang dunia saat ini. Dengan kata lain, “Pemerintah tidak bertanggung jawab atas otak pribadi Anda!”

Praktek

“Ilmu tanpa amalan tidak ada gunanya, amalan tanpa ilmu itu berbahaya” Konfusius

Buku catatanku adalah hidupku!


Jadi, dalam praktiknya, saya dapat mengatakan bahwa bagi saya semuanya dimulai dengan buku catatan. Saya tidak hanya menuliskan tugas sehari-hari saya di sana, saya juga menggambar, memprogram, mendesain flowchart dan memecahkan masalah, termasuk masalah matematika. Selalu gunakan buku catatan dan tulislah hanya dengan pensil. Ini bersih, nyaman dan dapat diandalkan, IMHO.

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Buku catatan saya (sudah terisi). Seperti inilah rupanya. Ini berisi tugas sehari-hari, ide, gambar, diagram, solusi, pembukuan hitam, kode dan sebagainya

Pada tahap ini, saya berhasil menyelesaikan tiga proyek (ini dalam pemahaman saya tentang “kelengkapan”, karena produk apa pun dapat dikembangkan secara relatif tanpa henti).

  • Proyek 0: Ini adalah adegan Demo Arsitek 3D yang ditulis dalam C# menggunakan mesin game Unity. Untuk platform macOS dan Windows.
  • Game 1: game konsol Simple Snake (dikenal semua orang sebagai "Snake") untuk Windows. Ditulis dalam C.
  • Game 2: game konsol Crazy Tanks (dikenal semua orang sebagai “Tank”), ditulis dalam C++ (menggunakan kelas) dan juga untuk Windows.

Proyek 0. Demo Arsitek

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

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Demo Arsitek Pemandangan 3D

Proyek pertama diimplementasikan bukan di C/C++, tapi di C# menggunakan mesin game Unity. Mesin ini tidak terlalu menuntut perangkat keras seperti Mesin tidak nyata, dan juga tampak lebih mudah dipasang dan digunakan. Saya tidak mempertimbangkan mesin lain.

Tujuan saya di Unity bukanlah untuk mengembangkan game. Saya ingin membuat adegan 3D dengan beberapa karakter. Dia, atau lebih tepatnya Dia (saya mencontoh gadis yang saya cintai =) harus bergerak dan berinteraksi dengan dunia di sekitarnya. Penting untuk memahami apa itu Unity, apa proses pengembangannya, dan berapa banyak upaya yang diperlukan untuk menciptakan sesuatu. Ini adalah bagaimana proyek Demo Arsitek lahir (namanya hampir ditemukan entah dari mana). Pemrograman, pemodelan, animasi, pembuatan tekstur mungkin membutuhkan waktu dua bulan kerja sehari-hari.

Saya mulai dengan video tutorial di YouTube tentang cara membuat model 3D Pencampur. Blender adalah alat gratis luar biasa untuk pemodelan 3D (dan lebih banyak lagi) yang tidak memerlukan instalasi. Dan di sini kejutan menanti saya... Ternyata modeling, animasi, texturing adalah topik terpisah yang sangat besar di mana Anda dapat menulis buku. Hal ini terutama berlaku untuk karakter. Untuk memodelkan jari, gigi, mata dan bagian tubuh lainnya, diperlukan pengetahuan tentang anatomi. Bagaimana struktur otot wajah? Bagaimana cara orang bergerak? Saya harus “memasukkan” tulang ke setiap lengan, kaki, jari, dan ruas jari!

Modelkan tulang selangka dan tulang tuas tambahan untuk membuat animasi terlihat natural. Setelah pelajaran seperti itu, Anda menyadari betapa banyak pekerjaan yang dilakukan pembuat film animasi hanya untuk membuat video berdurasi 30 detik. Tapi film 3D bertahan berjam-jam! Lalu kita meninggalkan bioskop dan mengatakan sesuatu seperti: “Itu kartun/film jelek! Mereka seharusnya bisa melakukan yang lebih baik..." Bodoh!

Dan satu hal lagi mengenai pemrograman dalam proyek ini. Ternyata, bagian yang paling menarik bagi saya adalah bagian matematika. Jika Anda menjalankan adegan tersebut (tautan ke repositori dalam deskripsi proyek), Anda akan melihat bahwa kamera berputar di sekitar karakter gadis dalam sebuah bola. Untuk memprogram perputaran kamera seperti itu, saya harus menghitung terlebih dahulu koordinat posisi titik pada lingkaran (2D), dan kemudian pada bola (3D). Lucunya, saya benci matematika di sekolah dan mengetahuinya dengan nilai C-minus. Mungkin sebagian karena di sekolah mereka tidak menjelaskan kepada Anda bagaimana matematika ini diterapkan dalam kehidupan. Namun ketika Anda terobsesi dengan tujuan Anda, impian Anda, pikiran Anda menjadi jernih dan terbuka! Dan Anda mulai menganggap tugas-tugas sulit sebagai petualangan yang mengasyikkan. Lalu Anda berpikir: “Mengapa ahli matematika *favorit* Anda tidak bisa memberi tahu Anda secara normal di mana rumus ini dapat diterapkan?”

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Perhitungan rumus menghitung koordinat titik pada lingkaran dan bola (dari buku catatan saya)

Permainan 1. Ular Sederhana

  • Platform: Windows (diuji pada Windows 7, 10)
  • Bahasa: Saya rasa saya menulisnya dalam C murni
  • Mesin permainan: Konsol Windows
  • Inspirasi: javidx9
  • Gudang: GitHub

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Permainan Ular Sederhana

Adegan 3D bukanlah sebuah permainan. Selain itu, pemodelan dan animasi objek 3D (terutama karakter) memakan waktu dan sulit. Setelah bermain-main dengan Unity, saya sadar bahwa saya perlu melanjutkan, atau lebih tepatnya memulai, dari dasar. Sesuatu yang sederhana dan cepat, tetapi pada saat yang sama bersifat global, untuk memahami struktur permainan.

Apa yang sederhana dan cepat? Benar, konsol dan 2D. Lebih tepatnya, bahkan konsol dan simbolnya. Sekali lagi saya mencari inspirasi di Internet (secara umum, menurut saya Internet adalah penemuan paling revolusioner dan berbahaya di abad ke-XNUMX). Saya menggali video seorang programmer yang membuat konsol Tetris. Dan mirip dengan permainannya, saya memutuskan untuk membuat "ular". Dari video tersebut saya belajar tentang dua hal mendasar - game loop (dengan tiga fungsi/bagian dasar) dan output ke buffer.

Putaran permainan mungkin terlihat seperti ini:

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

Kode ini menampilkan seluruh fungsi main() sekaligus. Dan siklus permainan dimulai setelah komentar yang sesuai. Ada tiga fungsi dasar dalam loop: Input(), Logic(), Draw(). Pertama, input data Input (terutama kontrol penekanan tombol), lalu pemrosesan logika data yang dimasukkan, lalu output ke layar - Gambar. Begitu seterusnya di setiap frame. Beginilah cara animasi dibuat. Ini seperti di kartun. Biasanya, pemrosesan data yang dimasukkan membutuhkan waktu paling lama dan, sejauh yang saya tahu, menentukan kecepatan frame game. Namun di sini fungsi Logic() dijalankan dengan sangat cepat. Oleh karena itu, Anda harus mengontrol frame rate menggunakan fungsi Sleep() dengan parameter gameSpeed ​​yang menentukan kecepatan ini.

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Siklus permainan. Memprogram “ular” di notepad

Jika Anda mengembangkan game konsol berbasis karakter, Anda tidak akan dapat mengeluarkan data ke layar menggunakan keluaran aliran 'cout' biasa - ini sangat lambat. Oleh karena itu, keluarannya harus dikirim ke buffer layar. Ini jauh lebih cepat dan permainan akan berjalan tanpa gangguan. Sejujurnya, saya kurang paham apa itu screen buffer dan cara kerjanya. Tapi saya akan memberikan contoh kode di sini, dan mungkin seseorang dapat memperjelas situasinya di komentar.

Mendapatkan buffer layar (bisa dikatakan):

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

Tampilan langsung dari string tertentu scoreLine (garis tampilan skor):

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

Secara teori, tidak ada yang rumit dalam game ini; menurut saya ini adalah contoh level awal yang bagus. Kode ditulis dalam satu file dan diformat dalam beberapa fungsi. Tidak ada kelas, tidak ada warisan. Anda dapat melihat semuanya sendiri di kode sumber game dengan membuka repositori di GitHub.

Game 2. Tank Gila

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Permainan Tank Gila

Mencetak karakter ke konsol mungkin merupakan hal paling sederhana yang dapat Anda ubah menjadi sebuah game. Namun kemudian muncul satu masalah: simbol-simbol tersebut memiliki tinggi dan lebar yang berbeda (tingginya lebih besar dari lebarnya). Dengan cara ini, semuanya akan terlihat tidak proporsional, dan gerakan ke bawah atau ke atas akan terlihat jauh lebih cepat daripada bergerak ke kiri atau ke kanan. Efek ini sangat terasa di Snake (Game 1). “Tank” (Game 2) tidak memiliki kelemahan ini, karena keluarannya diatur melalui pengecatan piksel layar dengan warna berbeda. Bisa dibilang saya menulis penyaji. Benar, ini sedikit lebih rumit, meski jauh lebih menarik.

Untuk game ini, cukup menjelaskan sistem saya dalam menampilkan piksel di layar. Saya menganggap ini sebagai bagian utama dari permainan. Dan Anda bisa memikirkan semuanya sendiri.

Jadi, apa yang Anda lihat di layar hanyalah sekumpulan persegi panjang berwarna-warni yang bergerak.

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Kumpulan persegi panjang

Setiap persegi panjang diwakili oleh matriks yang diisi dengan angka. Omong-omong, saya dapat menyoroti satu nuansa menarik - semua matriks dalam game diprogram sebagai array satu dimensi. Bukan dua dimensi, tapi satu dimensi! Array satu dimensi jauh lebih mudah dan cepat untuk dikerjakan.

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Contoh matriks tangki permainan

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Representasi matriks tangki permainan sebagai array satu dimensi

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Contoh yang lebih visual dalam merepresentasikan matriks sebagai array satu dimensi

Tetapi akses ke elemen array terjadi dalam loop ganda, seolah-olah itu bukan array satu dimensi, tetapi array dua dimensi. Hal ini dilakukan karena kita masih bekerja dengan matriks.

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Melintasi array satu dimensi dalam loop ganda. Y - pengidentifikasi baris, X - pengidentifikasi kolom

Harap diperhatikan: alih-alih pengidentifikasi matriks i, j, saya menggunakan pengidentifikasi x dan y. Dengan cara ini, menurut saya, lebih enak dipandang dan lebih mudah dipahami otak. Selain itu, notasi seperti itu memungkinkan untuk dengan mudah memproyeksikan matriks yang digunakan ke sumbu koordinat gambar dua dimensi.

Sekarang tentang piksel, warna dan keluaran layar. Fungsi StretchDIBits digunakan untuk keluaran (Header: windows.h; Library: gdi32.lib). Fungsi ini, antara lain, menerima hal-hal berikut: perangkat tempat gambar ditampilkan (dalam kasus saya, ini adalah konsol Windows), koordinat awal tampilan gambar, lebar/tingginya, dan gambar itu sendiri di bentuk bitmap, diwakili oleh array byte. Bitmap sebagai array byte!

Fungsi StretchDIBits() beraksi:

// 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 dialokasikan terlebih dahulu untuk bitmap ini menggunakan fungsi VirtualAlloc(). Artinya, jumlah byte yang diperlukan dicadangkan untuk menyimpan informasi tentang semua piksel, yang kemudian akan ditampilkan di layar.

Membuat bitmap 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 kasar, bitmap terdiri dari sekumpulan piksel. Setiap empat byte dalam array adalah piksel RGB. Satu byte per nilai warna merah, satu byte per nilai warna hijau (G), dan satu byte per nilai warna biru (B). Ditambah lagi ada satu byte tersisa untuk lekukan. Ketiga warna ini - Merah/Hijau/Biru (RGB) - dicampur satu sama lain dalam proporsi berbeda untuk menciptakan warna piksel yang dihasilkan.

Sekarang, sekali lagi, setiap persegi panjang, atau objek permainan, diwakili oleh matriks numerik. Semua objek permainan ini ditempatkan dalam sebuah koleksi. Dan kemudian mereka ditempatkan di lapangan permainan, membentuk satu matriks numerik besar. Saya mengaitkan setiap angka dalam matriks dengan warna tertentu. Misalnya, angka 8 berarti biru, angka 9 berarti kuning, angka 10 berarti abu-abu tua, dan seterusnya. Jadi, kita dapat mengatakan bahwa kita memiliki matriks lapangan permainan, yang setiap angkanya adalah sebuah warna.

Jadi, kita memiliki matriks numerik dari seluruh lapangan permainan di satu sisi dan bitmap untuk menampilkan gambar di sisi lain. Sejauh ini, bitmap tersebut “kosong” - belum berisi informasi tentang piksel warna yang diinginkan. Artinya, langkah terakhir adalah mengisi bitmap dengan informasi tentang setiap piksel berdasarkan matriks numerik lapangan permainan. Contoh nyata transformasi tersebut dapat dilihat pada gambar di bawah ini.

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Contoh pengisian bitmap (Matriks piksel) dengan informasi berdasarkan matriks digital lapangan permainan (indeks warna tidak sesuai dengan indeks dalam game)

Saya juga akan menyajikan sepotong kode asli dari game tersebut. Variabel colorIndex pada setiap iterasi loop diberi nilai (indeks warna) dari matriks numerik lapangan permainan (mainDigitalMatrix). Variabel warna kemudian diatur ke warna itu sendiri berdasarkan indeks. Warna yang dihasilkan kemudian dibagi menjadi perbandingan merah, hijau dan biru (RGB). Dan bersama dengan pixelPadding, informasi ini ditulis ke dalam piksel berulang kali, membentuk gambar berwarna dalam bitmap.

Kode ini menggunakan pointer dan operasi bitwise, yang mungkin sulit dipahami. Jadi saya menyarankan Anda untuk membaca secara terpisah cara kerja struktur tersebut.

Mengisi bitmap dengan informasi berdasarkan matriks numerik lapangan 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;
   }

Berdasarkan cara yang dijelaskan di atas, dalam game Crazy Tanks satu gambar (bingkai) dibentuk dan ditampilkan di layar dalam fungsi Draw(). Setelah mencatat penekanan tombol di fungsi Input() dan pemrosesan selanjutnya di fungsi Logic(), gambar (bingkai) baru akan terbentuk. Benar, objek permainan mungkin sudah memiliki posisi berbeda di lapangan permainan dan, karenanya, digambar di tempat lain. Beginilah animasi (gerakan) terjadi.

Secara teori (jika saya tidak melupakan apa pun), memahami game loop dari game pertama (“Snake”) dan sistem untuk menampilkan piksel di layar dari game kedua (“Tank”) adalah semua yang Anda perlukan untuk menulis apa pun game 2D Anda di Windows. Tanpa suara! 😉 Bagian-bagian lainnya hanyalah sebuah kemewahan.

Tentu saja, permainan “Tank” jauh lebih kompleks daripada “Ular”. Saya sudah menggunakan bahasa C++, yaitu saya mendeskripsikan objek permainan yang berbeda dengan kelas. Saya membuat koleksi saya sendiri - kodenya dapat dilihat di headers/Box.h. Omong-omong, koleksi tersebut kemungkinan besar mengalami kebocoran memori. Petunjuk yang digunakan. Bekerja dengan memori. Saya harus mengatakan bahwa buku itu banyak membantu saya Memulai C++ Melalui Pemrograman Game. Ini adalah awal yang baik untuk pemula di C++. Ini kecil, menarik dan terorganisir dengan baik.

Butuh waktu sekitar enam bulan untuk mengembangkan game ini. Saya menulis terutama saat makan siang dan makanan ringan di tempat kerja. Dia duduk di dapur kantor, menginjak-injak makanan dan menulis kode. Atau saat makan malam di rumah. Jadi saya berakhir dengan “perang dapur” ini. Seperti biasa, saya aktif menggunakan buku catatan, dan semua konsep lahir di dalamnya.

Untuk menyelesaikan bagian praktisnya, saya akan mengambil beberapa scan buku catatan saya. Untuk menunjukkan apa sebenarnya yang saya tulis, gambar, hitung, desain...

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Merancang gambar tank. Dan menentukan berapa banyak piksel yang harus ditempati setiap tangki di layar

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Perhitungan algoritma dan rumus putaran tangki pada porosnya

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Skema koleksi saya (kemungkinan besar ada kebocoran memori). Koleksi dibuat sesuai dengan tipe Linked List

DevOps C++ dan "perang dapur", atau Bagaimana saya mulai menulis game sambil makan
Dan ini adalah upaya sia-sia untuk memasukkan kecerdasan buatan ke dalam game

Teori

“Bahkan perjalanan seribu mil dimulai dengan langkah pertama” (Kebijaksanaan Tiongkok Kuno)

Mari beralih dari praktik ke teori! Bagaimana cara menemukan waktu untuk hobi Anda?

  1. Tentukan apa yang sebenarnya Anda inginkan (sayangnya, ini bagian tersulit).
  2. Mengatur prioritas.
  3. Korbankan segala sesuatu yang “ekstra” demi prioritas yang lebih tinggi.
  4. Bergerak menuju tujuan setiap hari.
  5. Jangan berharap dua atau tiga jam waktu luang dihabiskan untuk melakukan hobi.

Di satu sisi, Anda perlu menentukan apa yang Anda inginkan dan prioritaskan. Di sisi lain, ada kemungkinan untuk meninggalkan beberapa kegiatan/proyek demi prioritas tersebut. Dengan kata lain, Anda harus mengorbankan segala sesuatu yang “ekstra”. Saya pernah mendengar bahwa seharusnya ada maksimal tiga aktivitas utama dalam hidup. Kemudian Anda akan dapat melakukannya dengan kualitas terbaik. Dan proyek/arahan tambahan akan mulai membebani. Tapi ini semua mungkin subjektif dan individual.

Ada aturan emas tertentu: jangan pernah mengalami hari 0%! Saya mempelajarinya di artikel oleh pengembang indie. Jika Anda sedang mengerjakan suatu proyek, lakukan sesuatu setiap hari. Dan tidak masalah seberapa banyak Anda melakukannya. Tulis satu kata atau satu baris kode, tonton satu video tutorial, atau tempelkan satu paku ke papan - lakukan saja. Bagian tersulit adalah memulai. Begitu Anda mulai, Anda mungkin akan melakukan lebih dari yang Anda inginkan. Jadi, Anda akan terus bergerak menuju tujuan Anda dan, percayalah, dengan sangat cepat. Bagaimanapun, rem utama dalam segala hal adalah penundaan.

Dan penting untuk diingat bahwa Anda tidak boleh meremehkan dan mengabaikan “serbuk gergaji” gratis waktu 5, 10, 15 menit, tunggu beberapa “batang kayu” besar yang bertahan satu atau dua jam. Apakah Anda sedang mengantri? Pikirkan tentang sesuatu untuk proyek Anda. Naik eskalator? Tulis sesuatu di buku catatan. Apakah Anda bepergian dengan bus? Bagus, baca beberapa artikel. Manfaatkan setiap peluang. Berhenti menonton kucing dan anjing di YouTube! Jangan mencemari otak Anda!

Dan satu hal terakhir. Jika setelah membaca artikel ini Anda menyukai ide membuat game tanpa menggunakan mesin game, maka ingatlah nama Casey Muratori. Orang ini punya situs web. Di bagian “tonton -> EPISODE SEBELUMNYA” Anda akan menemukan tutorial video gratis yang luar biasa tentang cara membuat game profesional dari awal. Dalam lima pelajaran Pengantar C untuk Windows Anda mungkin akan belajar lebih banyak daripada lima tahun belajar di universitas (seseorang menulis tentang ini di komentar di bawah video).

Casey juga menjelaskan bahwa dengan mengembangkan mesin game Anda sendiri, Anda akan memiliki pemahaman yang lebih baik tentang mesin apa pun yang ada. Dalam dunia kerangka kerja di mana semua orang mencoba mengotomatisasi, Anda belajar membuat, bukan menggunakan. Anda memahami sifat dasar komputer. Dan Anda juga akan menjadi programmer yang jauh lebih cerdas dan matang – seorang profesional.

Semoga beruntung di jalan yang Anda pilih! Dan mari jadikan dunia lebih profesional.

penulis: Grankin Andrey, DevOps



Sumber: www.habr.com