Bagaimana cara mendesain mesin game dalam bahasa berorientasi objek? [Tutup]

26

Setiap kali saya mencoba dan menulis permainan dalam bahasa berorientasi objek apa pun, masalah pertama yang selalu saya hadapi (setelah memikirkan jenis permainan apa yang akan ditulis) adalah bagaimana merancang mesin. Bahkan jika saya menggunakan pustaka atau kerangka kerja yang ada seperti SDL, saya masih harus membuat keputusan tertentu untuk setiap game, seperti apakah akan menggunakan mesin negara untuk mengelola menu, kelas seperti apa yang digunakan untuk memuat sumber daya, dll.

Apa desain yang bagus dan bagaimana penerapannya? Apa saja kompromi yang harus dibuat dan pro / kontra mereka?

mesin ekstropik
sumber
12
Apa yang salah dengan melakukan dorongan hati, dan refactoring dari sana daripada menderita kelumpuhan analisis?
Bebek Komunis
7
@TheCommunistDuck Karena terjadi dorongan adalah pendekatan yang telah saya ambil di semua proyek saya sebelumnya - dan setiap orang menghantam dinding setelah beberapa bulan ketika saya menemukan bahwa setiap fitur baru memerlukan upaya monumental dan kompleksitas untuk ditambahkan. Saat ini saya menghabiskan lebih banyak waktu untuk menulis ulang mesin saya daripada menulis permainan itu sendiri, jadi saya berharap bahwa dengan sedikit pemikiran dan perencanaan saya akan menghemat waktu dalam jangka panjang.
mesin ekstropik
3
@ chuzzum, poin bagus. Satu hal yang saya sarankan adalah untuk memeriksa arsitektur mesin C4, yaitu; terathon.com/c4engine/images/architecture.png Mungkin levelnya jauh lebih tinggi dari yang Anda butuhkan, tetapi mungkin memberi Anda beberapa ide ;-)
The Communist Duck
1
i.imgur.com/81zIY.png
The Communist Duck
3
Juga pertanyaan ini agak kabur. Mungkin ambil satu dari contoh Anda dan buat satu atau dua pertanyaan yang lebih dalam.
Tetrad

Jawaban:

24

Saya ragu seseorang akan dapat mengatakan 'Anda harus melakukan ini dan itu dan ini dan slot ini dengan yang menggunakan pola X'.

Namun, beberapa sumber daya yang berguna:
Enginuity - serangkaian artikel pembuatan mesin di Gamedev.net.
Game Coding Complete - Saya memiliki buku ini, dan ia membahas setiap (well, hampir) aspek pemrograman game dengan baik. Itu juga memiliki mesin yang dibangun di seluruh buku.
Arsitektur Mesin Game - Ini adalah buku bagus untuk desain mesin.
C4 Engine Layout - Diambil dari komentar saya, tetapi ini menunjukkan cara tingkat tinggi untuk menyatukan setiap bagian dari mesin.

Ini mungkin sedikit terlalu banyak untuk apa yang Anda butuhkan, tetapi Anda tidak bisa tahu terlalu banyak tentang sesuatu, dan saya yakin Anda akan mendapatkan rencana yang baik dari mereka.

EDIT: Saya lupa artikel Gamedev telah diarsipkan sejak situs baru, diperbaiki :)

Bebek Komunis
sumber
Tautan Enginuity rusak, dan mencari artikel di Google tampaknya menunjukkan bahwa mereka tidak lagi ada di web. (?) Buku-buku itu kelihatannya seperti sumber yang bagus, dan saya selalu mengawasi lebih banyak buku pemrograman;)
mesin ekstropik
Juga, sehubungan dengan komentar pertama Anda, saya tidak mengharapkan siapa pun untuk datang dengan rencana induk yang cocok untuk setiap permainan. Saya hanya memperhatikan, selama pengembangan beberapa permainan, bahwa pola umum memang cenderung banyak muncul, jadi saya bertanya-tanya apa yang digunakan orang lain dalam permainan mereka.
mesin ekstropik
1
Memperbaiki tautan.
Bebek Komunis
+1 untuk kecerdikan. @ chuzzum Cukup periksa beberapa mesin game, biarkan mereka menginspirasi Anda dan dapatkan arsitektur yang optimal untuk Anda sendiri. Plus: Seringkali lebih baik untuk membuat komponen mesin gim Anda berdasarkan daripada hierarkis, lihat cowboyprogramming.com/2007/01/05/evolve-your-heirachy
Dave O.
1
Saya tidak akan mengatakan bahwa itu adalah mesin yang perlu digabungkan, lebih pada bagian kerangka kerja entitas.
Bebek Komunis
7

Sebagai contoh, inilah bagaimana proyek roguelike saya saat ini terstruktur (di Jawa). Ini menggunakan mesin grafis 2D sehingga banyak kode rendering sudah diurus untuk saya. Kritik disambut.

class Game
Kelas ini mengatur mesin negara yang mengelola kondisi permainan saat ini. (dalam menu vs. memulai gim baru vs. memainkan gim yang disimpan)

interface State
Setiap kelas State berisi dua loop: loop untuk memperbarui logika dan loop untuk rendering. Mereka juga berisi kode untuk memanggil Gamekelas dan meminta perubahan ke status yang berbeda.

class ResourceManager
Satu singleton yang diinisialisasi oleh Gamekelas yang memuat semua sumber daya yang dibutuhkan dan memungkinkan akses ke sana. Saya tidak suka desain ini karena membuatnya sulit untuk memuat / membongkar sumber daya pada tingkat yang berbeda, misalnya. Saya mungkin akan mendesain ini secara berbeda jika saya memulai dari awal.

class Map
Peta berisi larik ubin dan daftar semua makhluk dan item di peta. Ini kelas yang cukup mendasar.

class Creature
Makhluk mengandung informasi tentang diri mereka sendiri termasuk perhitungan gerakan (mengharuskan mereka untuk tahu di mana Peta mereka berada, dan untuk dapat menanyakannya untuk mencari tahu tentang hambatan). Memutuskan apakah akan melakukan ini, atau meminta semacam manajer mengaturnya untuk semua makhluk adalah sesuatu yang aku perjuangkan.

interface AITask
Makhluk dapat memiliki daftar AITasks, yang dieksekusi setiap kali loop logika makhluk dijalankan. AITask memiliki loop logika sendiri yang mengeluarkan perintah ke makhluk, dan kondisi terminasi yang menentukan apakah tugas itu berhasil diselesaikan atau tidak.

interface UIElement
Saya menerapkan UI saya sendiri untuk mesin ini. Setiap UIElement memiliki loop render dan loop logika. Mereka juga memiliki loop untuk memproses input keyboard / mouse. Semua elemen dapat memiliki sejumlah elemen anak, yang diberikan setelah orang tua mereka, dan mengambil alih input keyboard / mouse. Ini memungkinkan Anda memiliki menu dengan submenu, misalnya.

mesin ekstropik
sumber
Apa yang salah dengan ini? Tampaknya baik-baik saja bagi saya.
Bebek Komunis
@TheCommunistDuck Itu tidak benar-benar datang dalam contoh yang saya pilih, tapi saya punya banyak masalah dengan kode ini. Kelas ResourceManager adalah salah satunya, tetapi saya juga memiliki masalah dengan negara - Saya berakhir dengan proliferasi yang sangat besar dari mereka, dan menyalin banyak kode. Khususnya dalam RPG, di mana pemain memiliki banyak pilihan pada satu waktu, Anda dapat berakhir dengan grafik keadaan yang sangat rumit. Contoh: casting a spell. Beranjak dari NormalState -> SelectSpellState -> SelectTargetState -> InvalidTargetState (jika gagal) -> DoSpellAnimationState -> NormalState. Dan itu hanya satu tindakan.
mesin ekstropik
1
Tidak tidak. TIDAK . NGGAK. Kumohon tidak. Oh, tunggu, kamu bilang kamu tidak suka.
Bartek Banachewicz
6

Poin penting pertama yang harus dibuat adalah bahwa tidak ada jawaban 'baik' untuk pertanyaan ini.

Hal yang paling dekat dengan jawaban yang benar akan menjadi sesuatu seperti: Itu sangat tergantung pada jenis permainan, platform target, kendala (waktu) dll.

Yang mengatakan ada beberapa artikel yang sangat bagus di luar sana yang akan menunjukkan kepada Anda bagaimana orang lain telah mencoba untuk menjawab masalah ini (karena saya telah mencoba mencari info tentang ini di masa lalu).
Seperti bebek komunis menyebutkan Enginuity artikel tentang permainan dev membantu saya memahami beberapa bagian arsitektur permainan.

Desain saya saat ini adalah hibrida dari Quake3 / Doom3 dan sedikit perpustakaan kelas .NET :)

Saya memiliki dua perpustakaan (statis atau dinamis tergantung pada bagaimana Anda ingin membangun / mengirim) FrameworkdanLibrary .

Perpustakaan berisi semua kelas pembantu yang ada untuk membantu produksi perangkat lunak game tetapi tidak terbatas pada produk jenis ini. yaitu ia memiliki implementasi daftar tertaut yang dioptimalkan untuk kode game tetapi dapat digunakan oleh apa pun yang membutuhkan layanan dari daftar tertaut.

Kerangka kerja adalah nyali dari 'mesin' jika Anda ingin menyebutnya begitu. Banyak dari ini mengikuti filosofi desain Quake3 (hanya dengan cara yang lebih berorientasi objek). Ini berisi CLI , manajemen waktu, kode spesifik OS, dan akhirnya lapisan jaringan dll.

Keduanya kemudian dikaitkan dengan aplikasi aktual yang sedang diproduksi. ItuGame jika Anda suka, yang berisi kode permainan tertentu. Dengan cara yang hampir sama, Quake3 memuat DLL tergantung pada 'mod' yang dimainkan.

Untuk memberi Anda gambaran tentang struktur di sini adalah uraian singkat folder dan konten untuk setiap lib:


  • Kerangka
    • IO (kelas manajemen file spesialis, kelas Pencetakan Teks (misalnya ke CLI), dan pencatatan dll)
    • Jaringan
      • Klien (kelas yang mewakili apa yang Kerangka anggap sebagai 'orang yang bermain / terhubung ke game')
      • Server (kelas untuk mengelola koneksi ke dalam kerangka kerja dan mengelola pemain)
    • Peron (Keyboard / mouse / pengontrol yang menangani kelas, rutinitas spesifik OS seperti getTime ())
    • Sistem (kelas tingkat sangat rendah seperti kelas kesalahan untuk membantu pencetakan pesan kesalahan, kelas waktu, dan CLI itu sendiri.)
    • Perender (cukup jelas)
    • dll.

  • Perpustakaan
    • Koleksi (kelas yang mewakili koleksi data, daftar / hashtables yang ditautkan, dll.)
    • Matematika (kelas pembantu matematika dasar seperti Vektor dan matriks)
    • dll.

HTH! Harus memberi Anda beberapa petunjuk ...

Adam Naylor
sumber
Tautan alternatif ke Seri Enginuity
Musaffa
-3

Hal-hal yang perlu dipertimbangkan

  • Bahasa berorientasi objek memiliki masalah karena mereka biasanya tidak memiliki fungsi kelas pertama atau tidak semua data adalah objek (seperti integer atau float di Java). Pola desain mengatasi masalah ini dengan beberapa pola. Ini umumnya lebih cepat untuk kode dan lebih mudah untuk tetap menggunakan bahasa yang dapat melakukannya (objek kelas satu); misalnya Python (yang juga memungkinkan desain berorientasi objek), Anda akan memiliki kecepatan yang lebih lambat.
  • Event Calculus, untuk AI setidaknya
  • Logika hoare, gunakan prasyarat dan kondisi akhir untuk setidaknya menguji kode Anda
  • Agen, lihat entitas Gempa
  • Database Relasional, cara ampuh untuk menyimpan data

Desain yang bagus

  • membuat diagram ER
  • buat itu benar
  • buat database Anda, objek atau struktur data darinya

Data adalah kunci pemrograman. Jika Anda menginginkan data Anda bagus, algoritma biasanya muncul dari mereka (jika Anda tidak menghitung beberapa algoritma numerik, seperti penentu komputasi).

pengguna712092
sumber
-1 karena jawaban ini sangat kabur dan membingungkan. Database relasional sama sekali tidak ada hubungannya dengan mesin-OO. Saya dapat mengerti bahwa bahasa Inggris bukan bahasa pertama Anda, tetapi bisakah Anda menjelaskan apa yang Anda maksud dalam paragraf pertama Anda? Tampaknya bertentangan (bahasa OO memiliki masalah tetapi lebih mudah untuk memprogram dalam bahasa dengan pola desain .. meskipun pola desain hampir selalu struktur OO).
Bebek Komunis
@ sial Kontradiksi? OO memiliki masalah yang tidak ada dalam bahasa lain, DP menyelesaikannya lihat c2.com/cgi/wiki?DesignPatternsInDynamicProgramming .
user712092
@ Bercinta 1) Anda dapat menggunakan SQL di C ++ 2) Anda dapat menyimpulkan atribut objek dari ER (walaupun itu tidak dianjurkan praktik) 3) Anda dapat data structeres dari relasi (ini adalah daftar karena saya perlu menyusun ulang elemen pada willm ini adalah hash karena saya perlu pencarian cepat)
user712092
@Duck, saya minta maaf, saya membuat kesalahan dengan memesan kembali. Saya tidak ingin mengklaim "DP lebih mudah untuk XY" tetapi "bahasa yang dapat melakukan kelas pertama adalah ...". :)
user712092
Ya, mungkin ada keuntungan untuk bahasa fungsional. Namun, bahkan tanpa memihak, saya merasa pendekatan OO masuk akal secara logis dari perspektif gamedev. Juga, tidak ada alasan Anda membutuhkan basis data relasional di mana saja. Tentu, mereka bisa bermanfaat. Namun, itu tidak menjadi komponen yang dibutuhkan di mana pun.
Bebek Komunis