Mesin Game Menulis dari awal dengan OpenGL [ditutup]


15

Saya ingin mulai menulis mesin gim saya dari nol untuk tujuan belajar, apa prasyarat dan bagaimana melakukannya, bahasa pemrograman apa dan hal-hal yang Anda rekomendasikan kepada saya? Juga jika Anda memiliki artikel dan buku bagus tentang itu, itu akan bagus. Terima kasih sebelumnya!

Bahasa dan alat Pemrograman saya adalah:

  • C / C ++ apa bagus hanya menggunakan C?
  • Python
  • OpenGL
  • Git
  • GDB

Apa yang ingin saya pelajari darinya:

  • Mesin Game Inti
  • Rendering / Grafik
  • Play Game / Aturan
  • Input (keyboard / mouse / pengontrol, dll)

Dalam Rendering / Grafik:

  • 3D
  • Shading
  • Petir
  • Tekstur

Dua poin: pertanyaan ini, sebagaimana adanya, terlalu luas. Fitur apa yang Anda inginkan, platform apa yang ingin Anda dukung, paradigma apa yang ingin Anda jelajahi, berapa banyak tanggung jawab yang ingin Anda masukkan ke dalam bahasa scripting (jika ada), dan sejumlah besar hal lain yang saya inginkan Saya tidak akan repot melanjutkan daftar keluar.
Tetrad

8
Dua: Ada kebijaksanaan umum yang umum bahwa orang lain akan menyemburkan bahwa Anda tidak harus fokus membuat mesin tanpa permainan. Mesin tanpa permainan berarti Anda tidak dapat membuktikan bahwa mesin Anda bermanfaat . Mesin yang bagus mengharuskan orang untuk memakan makanan anjing mereka sendiri. Blog yang biasanya terhubung ke lebih banyak argumen ini ada di sini: scientificninja.com/blog/write-games-not-engines
Tetrad

2
^ Tidak hanya itu, tetapi menulis mesin tanpa game untuk memotivasi persyaratan fitur menghasilkan creep fitur dan desain API yang buruk. Sampai Anda tahu apa yang Anda butuhkan, yang ditunjukkan oleh persyaratan game, Anda mungkin tidak memasukkan hal-hal yang bermanfaat ke dalam mesin Anda. Dengan cara yang sama, jika Anda tidak harus menggunakan mesin untuk diprogram, Anda mungkin menemukan beberapa keputusan Anda benar-benar kikuk.
ChrisE

1
Saya tidak melihat poin dalam daftar Anda. Faktanya Anda tahu C / C ++ dan Python membantu kami, tetapi mengapa daftar itu Anda dapat menggunakan kontrol versi dan debugger?
Bebek Komunis

2
@TheCommunistDuck: Hei, itu lebih baik daripada beberapa pengembang. :)
ChrisE

Jawaban:


11

Anda dapat menulis mesin gim dalam hampir semua bahasa menggunakan hampir semua metode render. Anda bisa menulis mesin permainan di bash menggunakan output konsol misalnya.

Jadi, saya pikir akan lebih baik untuk menentukan apa yang sebenarnya ingin Anda pelajari dalam menulis mesin Anda sendiri. Ada banyak "bidang" dalam pengembangan game.

  • Mesin Game Inti

  • Rendering / Grafik

  • AI

  • Jaringan

  • Play Game / Aturan

  • Suara

  • Input (keyboard / mouse / pengontrol, dll)

dll. Dari sana Anda bahkan dapat memiliki sub topik. Dalam Rendering / Grafik

  • 2d atau 3d?

  • Pemodelan

  • Shading

  • Petir

  • Tekstur

  • GUI / Huds / Antarmuka.

  • dll

Hanya satu dari sub-sub-topik yang dapat menghabiskan banyak waktu (atau bertahun-tahun!) Studi!

Jadi, tentukan terlebih dahulu apa yang ingin Anda pelajari. Mulai dari yang sederhana.

Gunakan bahasa apa pun yang Anda sukai - meskipun beberapa lebih cocok untuk tugas-tugas tertentu. Sebagai contoh, mesin inti dan rendering mungkin paling baik dilakukan dengan bahasa tingkat "lebih rendah" seperti C / C ++ (jika Anda membutuhkan kinerja); tetapi sesuatu seperti AI atau Aturan Game mungkin lebih baik dilakukan dalam bahasa tingkat yang lebih tinggi. Tidak ada yang mengatakan Anda tidak dapat mencampur dan mencocokkan. Anda bisa menulis mesin Anda di C ++, rendering Anda di C (karena bekerja dengan baik dengan OpenGL) dan kemudian menggunakan LUA untuk membuat skrip pada Aturan Game Anda, dll.

Sejauh contoh, ada mesin game bernama Slick2D. Ini ditulis dalam Java dan open source. Ini adalah contoh mesin 2d sederhana yang ditulis dan dirancang dengan sangat baik. Anda dapat mempelajari konsep dasar dari itu, seperti loop game, mengelola status game, dll.

Jika Anda nyaman dengan C / C ++; Saya akan menyarankan melihat SDL / OpenGL. Ini menangani beberapa rumah tangga seperti input, suara, membuat jendela, dll dan dapat fokus pada hal-hal lain.


4
Ahh hari-hari ketika saya belajar C ++ dan game konsol sangat menyenangkan ... [membuat proyek konsol baru ...]
Nick Bedford

Saya memperbarui pertanyaan saya, berharap memberi saya banyak sumber daya yang luar biasa :)
Wazery

4

SDL + OpenGL adalah pilihan yang sangat baik untuk memulai mesin gim kustom.

Saya pribadi menggunakan versi C-ish dari C ++ karena saya tahu itu yang terbaik bagi saya. Maksud saya, saya tidak menggunakan pengecualian. Ada dua alasan untuk itu: pengecualian pertama dan terpenting membutuhkan pengecualian kode aman sepanjang jalan yang dengan OpenGL dan SDL tidak sepenuhnya mudah untuk dicapai. Namun yang lebih penting, dengan cara ini, sangat mudah untuk mengekspos objek C ++ pada C ABI yang luar biasa membantu jika Anda mencoba membawa bahasa skrip ke dalam campuran.

Saya berada di kapal yang sama dari Anda dan saya menuliskan beberapa petualangan saya dengan SDL dan OpenGL di sebuah blog ( immersedcode.org ) kalau-kalau ada orang lain yang tertarik.

Untuk arsitektur umum, saya punya dua saran: jika Anda ingin mesin 3D lihat buku "Game Engine Architecture" oleh Jason Lander. Jika yang Anda inginkan adalah 2D, jaga desainnya sesederhana mungkin dan biarkan diri Anda terinspirasi oleh XNA atau proyek lainnya.

Terakhir: jangan panggil OpenGL di semua tempat. Bantulah diri Anda sendiri dan mengisolasinya ke beberapa tempat sehingga Anda memiliki kemampuan untuk beralih antara desktop OpenGL / OpenGL ES atau bahkan DirectX di lain waktu jika Anda mau.


0

Jangan gunakan C kecuali detail implementasi menahan Anda di bawah todongan senjata. Kalau tidak, gunakan C ++, karena bahasa ini jauh lebih mampu, dan Anda selalu dapat memilih untuk tidak menggunakan kemampuan itu nanti. Saya pribadi tidak punya apa-apa untuk / melawan Python, saya tidak pernah menggunakannya.

Saya tidak akan merekomendasikan OpenGL terhadap DirectX karena DX memiliki pendekatan berorientasi objek modern, yang jauh lebih bersih dan lebih mudah dipahami / rawan kesalahan. Antarmuka yang ditawarkan oleh OpenGL sangat buruk dibandingkan.

Hal terakhir yang saya dapatkan adalah bahwa saya telah mendengar dari banyak orang yang saya percaya bahwa GDB benar-benar menyebalkan dan debugger Visual Studio sejauh ini adalah yang terbaik. Ini bukan pengalaman pribadi saya jadi bawa saja dengan sedikit garam.


4
"OpenGL vs. DX". Fakta bahwa DirectX lebih OO tidak terlalu penting. Sejauh yang lebih dimengerti ... OpenGL (sebelum 3) memperlihatkan antarmuka yang cukup mudah, dan yang mudah dipindai karena semuanya dalam metodologi imperatif gaya-C. "Atur matriks proyeksi untuk ini. Mulai segitiga. Ini adalah titik. Ini adalah titik. Ini adalah titik. Ujung segitiga." Seri OpenX API 1.x bagus untuk membuat Anda basah dalam pemrograman grafis, dan dikombinasikan dengan SDL (atau bahkan GLUT ... urg) memungkinkan Anda mendapatkan aplikasi seperti 30-50 baris kode.
ChrisE

2
@ Chris: Hal yang pasti. Ada sesuatu yang disebut extern "C", dan penggunaan yang tepat membuat penulisan antarmuka C agak sepele - terutama untuk Python, di mana konverter ada di dalam Boost yang memudahkan pengikatan. Bagaimana dengan fitur bahasa C ++? Mereka hebat . Lebih banyak menggunakan fitur bahasa C ++ meningkatkan keandalan proyek dan kemudahan pengkodean secara masif untuk trade-off kinerja yang sangat kecil. Fitur bahasa C sangat menyedihkan dibandingkan. Sebagai contoh, penggunaan yang benar dari kompiler C ++ modern dapat menjamin tidak ada kebocoran memori. Lakukan itu di C.
DeadMG

1
@DeadMG: Jika OOP benar-benar masalah besar, juga, jawabannya di sini adalah Java atau C #, dan bukan C ++. Hal yang saya tidak setuju adalah bahwa penggunaan fitur C ++ tidak secara ajaib membuat kode Anda lebih baik, lebih cepat, atau bahkan lebih dapat diandalkan; Anda harus tahu cara menggunakan fitur-fitur itu, dan apakah mempelajari bahasa selain merancang mesin benar-benar bermanfaat untuk waktu seseorang? Tidak. Tidak untuk seseorang yang melakukan ini untuk pertama kalinya. Anda dapat mempelajari semua C dalam satu atau dua hari, dengan nyaman, dan tidak pernah bertanya-tanya apa yang dilakukan bahasa. OpenGL, panggilan dasar yang berguna yang ditetapkan pada tingkat berapa pun, menawarkan transparansi yang sama.
ChrisE

2
OOP tidak sebesar itu, bukan di mesin game berperforma tinggi. Tentu itu berguna, tetapi seringkali abstraksi yang salah. Memiliki aliran data yang baik, lokalitas dan tata letak memori biasanya lebih baik. Sementara banyak tim menggunakan C ++, mereka tidak menggunakan sebagian besar fitur C ++. Tanpa pengecualian, sesedikit mungkin virtual, tanpa RTTI, tanpa STL / Tingkatkan. Mengapa? Eksekusi yang mudah diprediksi dan cepat serta kode kecil pada berbagai platform. Saya kode dalam C dan hanya ada dua bidang di mana saya lebih suka menggunakan C ++: kunci ruang lingkup dan array generik. Tidak sebanding dengan kerumitan IMHO.
batal

4
Pada GL vs D3D: Tidak ada tumpukan matriks di inti GL3 / 4, dan tidak ada tumpukan attrib. Baik GL dan D3D memetakan ke arsitektur perangkat keras yang sama, tetapi banyak waktu GL terasa lebih tipis. Tentu saja mesin keadaan GL agak merepotkan, tetapi begitu juga perangkat keras yang sebenarnya;) Mempelajari salah satu dari mereka baik-baik saja, dan selama Anda memahami apa yang sebenarnya terjadi, Anda dapat dengan mudah beralih ke yang lain (atau API konsol).
batal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.