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 .
sumber
Jawaban:
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):
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 ).
sumber
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.
sumber
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:
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.
sumber
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 .
sumber