Apa pendekatan berorientasi objek yang benar untuk desain kelas dalam pengembangan game?

31

Saya sedang mengembangkan game 2D berbasis sprite untuk Windows 7 Phone, menggunakan XNA. Pelatihan dan tutorial yang tersedia sangat membantu, tetapi masalah yang saya hadapi adalah bahwa masing-masing dari mereka mendekati desain kelas mereka secara berbeda, dan kode ini tidak diperhitungkan dengan baik. Akibatnya, sulit bagi saya untuk mendapatkan pemahaman yang baik tentang tanggung jawab mana yang harus saya berikan kepada kelas tertentu.

Sebagai contoh, saya dapat memiliki kelas sprite dasar BaseSpriteyang tahu cara menggambar itu sendiri, memeriksa tabrakan, dll. Saya kemudian dapat memiliki AnimatedSpritekelas yang akan tahu cara menavigasi sprite sheet, ExplodingSpritekelas, dan sebagainya. Teknik ini ditunjukkan dalam contoh Space Invaders dalam materi Windows 7 Phone Jumpstart Session 2 .

Atau, saya bisa menempatkan sebagian besar render dan menjalankan tanggung jawab gim di GameScreenkelas; kelas itu dan kelas turunannya berperilaku lebih seperti formulir atau halaman web dalam hal tanggung jawab mereka. Kelas sprite adalah wadah yang lebih sederhana dengan logika yang jauh lebih sedikit.

Ini adalah teknik yang digunakan dalam game Alien Sprite pada Windows 7 Phone Training Kit dan contoh-contoh manajer permainan lainnya.

Apa pendekatan berorientasi objek yang benar untuk desain kelas dalam pengembangan game?

Josh E
sumber

Jawaban:

26

Saya memang menggunakan pendekatan yang lebih berorientasi komponen, di mana Anda akan memiliki kelas Sprite yang memiliki komponen seperti Visual, Collision, Animation, Input, dll. Dengan pendekatan ini saya tidak memiliki hierarki kelas yang mendalam (yang baik) .

Untuk beberapa info tentang Desain Berorientasi Komponen lihat di sini .

thbusch
sumber
2
Memberi +1 pada artikel yang Anda tautkan sangat fantastis. Saya sangat fokus pada desain OO murni, saya benar-benar mengabaikan model tipe komponen / dekorator.
Josh E
1
Pola komponen tidak benar-benar "kurang murni" OO :)
Srekel
2
Memang. OO sering disamakan dengan warisan. Tetapi pewarisan hanyalah satu alat yang ditawarkan OO, komposisi adalah alat lain.
haffax
Hanya begitu. Seharusnya saya lebih tepat dalam kata-kata saya; yang saya maksudkan adalah saya lebih fokus pada sisi warisan OO daripada memikirkan pola desain OO / aspek OO lain yang dapat membantu saya mencapai apa yang saya inginkan.
Josh E
Sementara pendekatan berbasis comoposisi cukup jelas dan sering digunakan, saya belum melihat solusi untuk menjaga komponen rendering tetap portabel. Petunjuk apa pun akan bagus.
Andreas
11

Dalam permainan, pola Komponen adalah solusi umum.

banyak sekali
sumber
itu artikel fantastis lainnya - layak dibaca.
Josh E
1
Hebat, hebat, bagus!
Kevin
6

The Principles SOLID berlaku sebagai banyak untuk desain kode permainan untuk profesi lain - setidaknya sampai Anda datang ke mengoptimalkan, jadi saya akan menggunakan contoh pertama Anda sebagai titik awal.

Saya akan melangkah lebih jauh, karena BaseSprite terdengar seperti itu memiliki kecenderungan untuk menjadi megaclass. Prinsip Tanggung Jawab Tunggal menyatakan bahwa tabrakan, render, dan navigasi semua harus ditangani oleh komponen, bukan entri individual dalam hierarki kelas. Kelas induk dari semua komponen ini seharusnya hanya menangani mendorong posisi dunia di antara mereka.

tenpn
sumber
5

Untuk beberapa proyek terakhir saya lebih condong ke arah pendekatan gaya MVC.

Awalnya kami tidak yakin apakah ini akan berhasil, tetapi itu bekerja dengan sempurna.

Model

Objek data. Hanya data murni. Tidak ada perilaku, tidak ada render.

Manajer data. Hanya menangani "daftar" objek data. (Dapat juga ditingkatkan untuk mendukung pooling.)

Melihat

Kami menyebutnya penyaji. Untuk setiap tipe objek data ada penyaji. Ketika dipanggil dengan manajer, itu akan membuat semua objek dalam daftar itu.

Pengendali

Sama seperti penyaji, tetapi mengontrol perilaku.

Contoh

ShipManager memiliki daftar Kapal. ShipController akan memindahkan Kapal sesuai dengan statusnya. ShipRenderer akan merender Kapal sesuai dengan negara mereka.

Mengapa

Dengan cara ini pandangan dan logika dipisahkan secara ketat. Itu membuat porting ke platform baru cukup mudah. Mengoptimalkan tata letak data di dalam XxxManager juga sangat mudah.

Andreas
sumber
2
Saya memilih Anda karena saya muak melihat "Gunakan MVC" lebih atau kurang sebagai jawaban yang dapat diterima. Jika Anda mengembangkan pada platform modern apa pun, Anda sudah menggunakan MVC di berbagai tingkatan. Ini bukan jawaban yang spesifik, dan itu bukan jawaban yang baik, karena itu tidak benar-benar memberi tahu orang bagaimana menyusun kelas, yang merupakan tugas / domain-spesifik. Anda baru saja berakhir dengan banyak orang menulis "kelas Modal ...; tampilan kelas ...; kelas Kontroler ..." MVC adalah pola dengan banyak kekuatan penjelas tingkat tinggi yang baik ketika berbicara tentang kode yang ada. Ini bukan pola dengan banyak kekuatan perencanaan yang baik.
4
@ Jo, saya mengerti maksud Anda, tetapi menemukan kata-kata pilihan Anda tidak sopan. Saya hanya menjelaskan bagaimana kita melakukannya. Karena pilihan arsitektur tingkat yang lebih tinggi membuat pilihan desain tingkat yang lebih rendah menjadi usang, saya menganggapnya sebagai jawaban yang valid.
Andreas