Bagaimana saya bisa merancang skema interaksi objek game yang efektif dengan arsitektur berbasis komponen?


14

Ini adalah pertanyaan desain ... Saya yakin ini bisa digeneralisasi lebih banyak, tapi saya kesulitan melakukannya. Saya bertanya-tanya tentang desain untuk interaksi objek game - inilah contoh saya (2D puzzle-platformer).

Katakanlah pemain sedang mencoba untuk maju melalui level. Ada banyak lampu yang bisa diarahkan ke berbagai arah. Berikut adalah contoh bagaimana benda-benda ringan ini dapat berinteraksi ...

  • Satu lampu memproyeksikan platform yang memungkinkan pemain melewati celah
  • Satu cahaya mengurangi koefisien gesekan dari apa pun yang disentuhnya, yang lain meningkatkannya
  • Satu lampu menghilangkan efek dari semua lampu, yang akan membuat platform menghilang saat lampu menyala dan null pengubah gesekan
  • Dll ...

Apa cara terbaik untuk mendekati masalah ini saat menggunakan arsitektur komponen? Komponen untuk setiap objek utama tampak jelas, serta cara yang bersih untuk menentukan efeknya terhadap lingkungan. Kelas untuk "menyelesaikan" interaksi (sepertinya itu bisa menjadi berantakan dengan cepat)? Beberapa penggunaan pola dekorator untuk membuat objek gabungan bagi mereka yang berinteraksi pada waktu tertentu? Struktur data yang cocok untuk ini?

Juga, menghubungkan audio ke interaksi ini? Sepertinya menghubungkan audio ke sistem akan sama seperti menghubungkan properti lain, seperti visibilitas atau gerakan pemain / tabrakan.

Tentunya karena semakin banyak komponen yang ditambahkan, akan lebih baik jika ada sistem yang kuat yang dapat menangani yang baru dengan sedikit modifikasi, tetapi saya tidak terbiasa dengan bagaimana cara mendesain ini.

Informasi Lain: Mesin yang saya gunakan adalah mesin XNA yang disebut IceCream .



2
Namun, ada pertanyaan yang sebenarnya, yang bertentangan dengan "pertanyaan" di tautan yang diberikan Joe.
dash-tom-bang

2
tidak melihat dupe, pertanyaannya adalah tentang bagaimana merancang persyaratan permainan tertentu dalam kode, menggunakan sistem komponen (@Christopher: menyebutkan mana yang akan membantu, apakah Anda menggunakan Unity? Torque? Proprietary?)
LearnCocos2D

2
Saya suka ide gameplay Anda by the way =)
Nailer

Jawaban:


5

Dalam sistem berorientasi objek, satu-satunya jawaban nyata untuk pertanyaan tentang apa cara terbaik untuk melakukan X adalah bahwa Anda harus melakukannya dengan cara yang paling lurus ke depan yang dapat Anda pikirkan untuk mendapatkan sesuatu dan menjalankan, dan kemudian mengubahnya ketika suatu ekspresi yang lebih mudah menjadi jelas. Memperhatikan diri sendiri dengan memilih pola yang tepat sebelum Anda menulis kode apa pun adalah cara yang baik untuk membebani diri Anda dengan jawaban yang salah sejak awal; biarkan semua pemikiran pola dan komponen mencair dan ikuti saja langkah-langkah ini, mulai dari tempat Anda hari ini (dengan asumsi Anda telah menerapkan komponen ringan):

  1. Tambahkan kode ke komponen ringan ke platform proyek. (Dapatkan ini berfungsi.)
  2. Salin komponen itu ke komponen baru, hapus hal-hal platform dan tambahkan kode untuk mengurangi gesekan objek yang sesuai. (Dapatkan ini berfungsi, verifikasi bahwa # 1 masih berfungsi.)
  3. Salin komponen itu ke komponen baru, hapus kode "baru" dan tambahkan barang untuk menonaktifkan efek komponen lain. (Dapatkan ini berfungsi, lalu verifikasi bahwa # 1 dan # 2 masih berfungsi.)

Pada titik ini, Anda akan (mungkin) memiliki banyak kode duplikat. Ekstrak kode umum ke dalam fungsi atau kelas lain (mungkin kelas dasar) atau apa pun yang tampaknya sesuai. Hanya karena Anda mulai dengan "komponen ringan" meskipun tidak berarti bahwa LightComponent adalah basis yang tepat; bisa jadi kode apa pun yang membentuk komponen ringan tidak benar-benar merupakan "komponen" per se dan mungkin yang terbaik akan diwakili oleh seperangkat fungsi atau bahkan kelas terpisah yang digabungkan ke dalam komponen baru Anda (sebagai variabel anggota ).


Saya menandai ini sebagai jawaban karena itu benar-benar menjawab "Bagaimana saya mendesain ...". Terima kasih untuk ini, itu pasti menempatkan saya di jalan yang benar.
Christopher Horenstein

2

Secara umum, ketika objek tipe A berinteraksi dengan objek tipe B, Anda ingin memiliki beberapa efek C. Ini disebut "pengiriman ganda" dan sangat sulit dilakukan secara elegan dalam bahasa mirip-C.

Cara efektif tetapi sulit untuk dipelihara hanyalah sekelompok saklar dan jika pernyataan, tergantung pada jenis objek Anda. Anda akan merasa kotor menulisnya tetapi itu akan menyelesaikan pekerjaan.

The pola Pengunjung adalah solusi yang lebih kuat yang menyembunyikan jenis jahat switching, tetapi dapat clumbersome untuk mengatur.

Biasanya segala jenis saklar di kode Anda adalah bau, tetapi di sini Anda mencoba menggeneralisasi polimorfisme, yang biasanya beralih fungsi berdasarkan satu jenis, untuk beralih fungsi berdasarkan dua jenis. Polimorfisme adalah dasar dari OOP sehingga tidak berbau.


2

Biarku lihat. Ini hanya sesuatu yang aku masak di kepalaku saat aku sedang menulis, sangat menyesal jika aku melewatkan sesuatu.

Dapatkan semua node cahaya dalam jarak yang wajar di sekitar dude Anda.

Untuk setiap cahaya Anda membuat poligon yang mewakili bidang efeknya ke objek framebuffer. Jadi kerucut cahaya akan membuat kerucut satu jenis piksel di FBO Anda. Render setiap jenis simpul dengan melewati dalam prioritas yang sesuai. Anda dapat menyandikan informasi ke dalam setiap piksel seperti saluran hijau dapat berupa fricition, red be gravity, biru dan alpha menjadi sesuatu yang lain.

Teknik pencampuran warna yang pandai kemudian dapat menciptakan efek yang menarik. Setiap level bisa memiliki aturan pencampuran sendiri. Anda juga dapat menambahkan shading fragmen untuk efek dinamis psikedelik seperti gravitasi berdenyut dll.

Terakhir, cukup periksa piksel mana yang disentuh mandude Anda, dan lakukan perhitungan ulang bitmap setiap kali Anda mendekati tepi area yang dihitung sebelumnya.

Sketsa kasar yang dibuat dalam 2 menit semacam menggambarkan ide saya:

Ilustrasi

Sunting: Dalam praktiknya ini berarti satu-satunya yang Anda butuhkan adalah satu komponen cahaya yang memancarkan warna tertentu. Aturan terkait dengan warna apa yang bisa dilakukan di tempat lain sama sekali. Anda dapat menyandikan banyak data ke dalam 32 bit yang Anda miliki pr pixel. Atau Anda dapat memiliki beberapa FBO yang berisi atribut yang berbeda yang tidak saling mempengaruhi. Anda dapat memiliki satu FBO gravitasi / gesekan dan satu FBO tabrakan 1bit. Jika Anda memilih ini, tentu saja Anda harus menandai FBO mana yang harus dirender oleh cahaya Anda.


Terima kasih atas masukannya. Saya sangat menghargai visual, dan ini benar-benar membuat saya berpikir tentang bagaimana mekanik dapat bekerja di belakang layar.
Christopher Horenstein

Heh, tidak ada masalah. Saya tahu itu tidak menjawab pertanyaan Anda, tetapi beberapa masalah memerlukan solusi khusus. Semoga berhasil!
Nailer

0

Pola pengamat adalah salah satu solusi terbaik. Pesan hanya akan dikirim ke objek (komponen) yang benar-benar tertarik padanya. Jadi penerima harus berlangganan pesan / jenis acara ini.

Ada banyak implementasi sinyal / slot. Misalnya, di C ++ ada perpustakaan sigslot

Untuk informasi lebih lanjut, baca tentang sinyal dan slot Qt .

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.