c++ Acara GUI/Desain Pesan

Jadi, saya membuat game sederhana menggunakan DirectX 9 dan C++. Saya melihat GUI SDK, tapi saya rasa saya bisa mengimplementasikan sesuatu yang lebih sederhana.

Yang saya inginkan hanyalah jendela, label, tombol, kotak teks, dan kotak centang.

Saya telah membuat GUIObject kelas dasar, yang semuanya diwarisi. Ini mencakup dasar-dasar seperti ukuran dan fokus dan yang lainnya. Kemudian kelas turunannya, GUILabel misalnya, semuanya mendefinisikan render(), update() dan yang lainnya.

Pertanyaan saya adalah bagaimana menangani peristiwa, seperti klik? Saya membuatnya bekerja dengan GUILabel::Click() yang mendefinisikan setiap kemungkinan berdasarkan nilai anggota teks instance saat ini. Rasanya salah dan saya menyadari bahwa setiap label yang perlu diklik harus didefinisikan di kelas GUILabel. Saya ingin memindahkannya ke kode setiap negara permainan.

Jadi, saya mencoba sebentar membuat GUILabel::Click() mengambil penunjuk fungsi sebagai argumen. Tapi kemudian saya menyadari bahwa saya perlu memiliki metode anggota kelas negara bagian sebagai statis (tidak mungkin, kecuali semua yang ada di dalamnya juga statis, bukan?) atau juga meneruskannya ke kelas GUIObject juga. Apakah itu cara yang harus dilakukan?

Bisakah saya mendefinisikan derivasi GUILabel (atau tombol, atau yang lainnya) dalam status permainan dan hanya mengganti tindakan apa pun yang saya perlukan? Dan kemudian melakukan itu untuk kontrol apa pun yang saya perlukan di negara bagian itu?

Apa cara yang tepat untuk menerapkan penanganan acara?


person Nick    schedule 17.06.2011    source sumber
comment
Saya mencoba melihat bagaimana saya bisa mendesain ini seperti Java's Swing, di mana dalam kasus saya, status permainan diturunkan dari beberapa elemen GUI (misalnya jendela) dan semua tindakan didefinisikan di sana dalam metodenya sendiri dan diteruskan (menggunakan boost perpustakaan, semoga) sebagai panggilan balik. Saya akan lihat bagaimana kelanjutannya. Saya tidak terlalu menyukai hal ini dan mencoba meretasnya untuk memahami inti permainan, tetapi karena sebagian besar permainan bergantung pada interaksi GUI ini, saya kira sedikit perencanaan akan membawa manfaat...   -  person Nick    schedule 21.06.2011
comment
Jangan menemukan kembali roda Nick. Hanya saja, jangan.   -  person Nick    schedule 14.10.2020


Jawaban (2)


Anda mungkin ingin mempertimbangkan penggunaan pustaka sinyal seperti boost::signals untuk memberi Anda fleksibilitas dalam menentukan antarmuka antara objek GUI Anda dan peristiwa mendasar yang akan dipicu oleh setiap panggilan balik. Ini juga berguna untuk hubungan terbalik di mana Anda memerlukan elemen GUI seperti indikator status, dll. untuk merespons peristiwa yang mendasarinya.

person Jason    schedule 17.06.2011

Untuk acara panggilan balik/klik saya akan menggunakan boost::function/boost::bind. Dalam kerangka GUI saya, saya dulu memiliki dua kelas abstrak berbeda, InputHandler dan Renderable untuk menangani sentuhan dan rendering. Hal ini mengarah pada desain di mana komponen yang tidak perlu dapat diklik (seperti UILabel) tidak perlu mengimplementasikan metode yang tidak berguna.

HTH, Alex

person Alex Kremer    schedule 17.06.2011