Saya harap ocehan ini akan memperjelas pertanyaan saya - saya benar-benar mengerti jika mereka tidak mau, jadi beri tahu saya jika itu masalahnya, dan saya akan mencoba membuat diri saya lebih jelas.
Meet BoxPong , game yang sangat sederhana yang saya buat untuk berkenalan dengan pengembangan game berorientasi objek. Seret kotak untuk mengontrol bola dan mengumpulkan benda-benda kuning.
Membuat BoxPong membantu saya merumuskan, antara lain, pertanyaan mendasar: bagaimana saya bisa memiliki objek yang berinteraksi satu sama lain tanpa harus "saling memiliki"? Dengan kata lain, adakah cara agar objek tidak hierarkis, melainkan hidup berdampingan? (Saya akan pergi ke detail lebih lanjut di bawah ini.)
Saya menduga masalah objek yang hidup berdampingan adalah masalah umum, jadi saya berharap ada cara yang mapan untuk menyelesaikannya. Saya tidak ingin menemukan kembali roda persegi, jadi saya kira jawaban ideal yang saya cari adalah "inilah pola desain yang biasa digunakan untuk menyelesaikan masalah Anda."
Terutama di gim-gim sederhana seperti BoxPong, jelas ada, atau seharusnya ada, beberapa benda yang hidup berdampingan di tingkat yang sama. Ada sebuah kotak, ada sebuah bola, ada sebuah koleksi. Yang bisa saya ungkapkan dalam bahasa berorientasi objek, meskipun - atau begitulah tampaknya - adalah hubungan HAS-A yang ketat . Itu dilakukan melalui variabel anggota. Saya tidak bisa begitu saja memulai ball
dan membiarkannya melakukan hal itu, saya membutuhkannya secara permanen menjadi milik objek lain. Saya telah mengaturnya sehingga objek permainan utama memiliki kotak, dan kotak itu pada gilirannya memiliki bola, dan memiliki penghitung skor. Setiap objek juga memilikiupdate()
metode, yang menghitung posisi, arah dll, dan saya pergi ke cara yang sama di sana: Saya memanggil metode pembaruan objek permainan utama, yang memanggil metode pembaruan semua anak-anaknya, dan mereka pada gilirannya memanggil metode pembaruan semua anak - anak mereka . Ini adalah satu-satunya cara saya bisa melihat untuk membuat game berorientasi objek, tetapi saya merasa itu bukan cara yang ideal. Lagipula, saya tidak akan menganggap bola sebagai milik kotak, melainkan berada di level yang sama dan berinteraksi dengannya. Saya kira itu bisa dicapai dengan mengubah semua objek game menjadi variabel anggota dari objek game utama, tapi saya tidak melihat itu menyelesaikan apa pun. Maksud saya ... mengesampingkan kekacauan yang jelas, bagaimana mungkin ada cara bagi bola dan kotak untuk saling mengenal , yaitu berinteraksi?
Ada juga masalah objek yang perlu saling menyampaikan informasi. Saya memiliki sedikit pengalaman menulis kode untuk SNES, di mana Anda memiliki akses ke hampir seluruh RAM sepanjang waktu. Katakanlah Anda membuat musuh khusus untuk Super Mario World , dan Anda ingin itu menghapus semua koin Mario, lalu simpan saja nol untuk mengatasi $ 0DBF, tidak masalah. Tidak ada batasan yang mengatakan musuh tidak dapat mengakses status pemain. Saya kira saya telah dimanjakan oleh kebebasan ini, karena dengan C ++ dan sejenisnya saya sering bertanya-tanya bagaimana membuat nilai dapat diakses oleh beberapa objek lain (atau bahkan global).
Menggunakan contoh BoxPong, bagaimana jika saya ingin bola memantul dari tepi layar? width
dan height
sifat-sifat Game
kelas,ball
untuk memiliki akses ke mereka. Saya bisa meneruskan nilai-nilai seperti ini (baik melalui konstruktor atau metode di mana mereka diperlukan), tetapi itu hanya menjerit praktik buruk kepada saya.
Saya kira masalah utama saya adalah bahwa saya perlu objek untuk saling mengenal, tetapi satu-satunya cara saya bisa melihatnya adalah hierarki yang ketat, yang jelek dan tidak praktis.
Saya pernah mendengar tentang "kelas teman" di C ++ dan agak tahu bagaimana mereka bekerja, tetapi jika mereka adalah solusi akhir semua, maka kenapa saya tidak melihat friend
kata kunci dituangkan di setiap proyek C ++, dan kenapa konsep tidak ada di setiap bahasa OOP? (Hal yang sama berlaku untuk pointer fungsi, yang baru saja saya pelajari.)
Terima kasih sebelumnya atas jawaban dalam bentuk apa pun - dan sekali lagi, jika ada bagian yang tidak masuk akal bagi Anda, beri tahu saya.