Mungkin di setiap game pengembang harus berurusan dengan input, entah itu kejadian keyboard dan mouse sederhana, acara sentuh atau sesuatu sebagai input accelerometer. Input ini secara langsung dari efek tidak langsung objek dalam permainan. Terkadang input yang sama dapat mempengaruhi objek yang berbeda. Sekarang saya sudah memikirkan bagaimana membuat model ini. Cara saya melihatnya ada dua pendekatan yang berbeda.
Biarkan objek game itu sendiri yang menanganinya, berlangganan ke acara dan menyebutnya metode sendiri. Ini memiliki keuntungan membiarkan objek-objek permainan itu sendiri memutuskan input mana yang menyebabkan tindakan mana. Kelemahan tampaknya adalah bahwa kode input akan hancur dengan kode objek game "inti". Juga objek permainan tidak menyadari keadaan sisa permainan, dan kadang-kadang mungkin tidak bertindak berdasarkan masukan peristiwa. Ini sepertinya tidak benar.
Mintalah input-controller umum untuk mengurus semua input dan membuat keputusan tentang siapa yang akan menangani acara apa. Hal ini tampaknya memisahkan masalah dengan lebih baik, tetapi secara ketat memasangkan kelas input-controller ke objek-game. Entah bagaimana perlu tahu siapa yang ingin menerima acara mana dan di negara mana. Ini sepertinya juga tidak benar.
Strategi apa yang Anda gunakan untuk menangani ini?
sumber
Saya akan menyarankan untuk membuat permainan Anda ( Model ) mendefinisikan daftar kemungkinan peristiwa input (diimplementasikan sebagai enum atau objek dengan antarmuka dasar yang sama). Hal-hal seperti
MovingRightStarted
,MovingRightStopped
,FiredWeapon1
,Escape
, dll ...Gim ini mendefinisikan struktur data (misalnya a
queue
) yang dapat diisi oleh kode input Anda ( Pengontrol ) dengan acara masukan.Kemudian game Anda dapat polling struktur data untuk mendapatkan acara input.
Dengan cara ini, Anda bisa mencolokkan berbagai jenis pengontrol untuk memberi makan model:
Anda hanya perlu mendorong mereka untuk memasukkan acara ke model.
sumber
queue
sebagai datatype untuk menyimpan ini. Bisakah Anda menjelaskan mengapa?