Saya merencanakan permainan petualangan, dan tidak tahu apa cara yang tepat untuk menerapkan perilaku tingkat tergantung pada tingkat perkembangan cerita.
Permainan pemain tunggal saya menampilkan dunia yang sangat besar di mana pemain harus berinteraksi dengan orang-orang di kota di berbagai titik dalam permainan. Namun, tergantung pada perkembangan cerita, hal-hal yang berbeda akan disajikan kepada pemain, misalnya Pemimpin Guild akan mengubah lokasi dari alun-alun kota ke berbagai lokasi di sekitar kota; Pintu hanya akan membuka pada waktu-waktu tertentu dalam sehari setelah menyelesaikan rutinitas tertentu; Acara cut-screen / trigger yang berbeda terjadi hanya setelah tonggak pencapaian tertentu telah tercapai.
Saya secara naif berpikir untuk menggunakan pernyataan switch {} pada awalnya untuk memutuskan apa yang harus dikatakan oleh NPC atau di mana ia dapat ditemukan, dan membuat tujuan pencarian hanya dapat berinteraksi setelah memeriksa kondisi variabel game_state global. Tetapi saya menyadari bahwa saya akan dengan cepat mengalami banyak keadaan permainan dan saklar-kasus yang berbeda untuk mengubah perilaku suatu objek. Pernyataan peralihan itu juga akan sangat sulit untuk di-debug, dan saya kira mungkin juga akan sulit untuk digunakan dalam editor tingkat.
Jadi saya berpikir, alih-alih memiliki satu objek dengan banyak status, mungkin saya harus memiliki beberapa instance dari objek yang sama, dengan satu status. Dengan begitu, jika saya menggunakan sesuatu seperti editor level, saya dapat menempatkan instance NPC di semua lokasi berbeda yang pernah ia temui, dan juga sebuah instance untuk setiap status percakapan yang ia miliki. Tapi itu berarti akan ada banyak objek permainan yang tidak aktif dan tidak terlihat mengambang di sekitar level, yang mungkin kesulitan untuk memori, atau hanya sulit dilihat di editor level, saya tidak tahu.
Atau sederhananya, buat level yang identik, tetapi terpisah untuk setiap kondisi permainan. Ini terasa cara terbersih dan bebas bug untuk melakukan sesuatu, tetapi rasanya seperti kerja manual besar memastikan setiap versi level benar-benar identik satu sama lain.
Semua metode saya terasa sangat tidak efisien, sehingga untuk merangkum pertanyaan saya, apakah ada cara yang lebih baik atau standar untuk menerapkan perilaku tingkat tergantung pada tingkat perkembangan cerita?
PS: Saya belum memiliki editor level - berpikir untuk menggunakan sesuatu seperti JME SDK atau membuat milik saya.
sumber
Pilihan yang akan saya pertimbangkan adalah membuat objek individual merespons gamestate yang berbeda, atau melayani level yang berbeda di gamestate yang berbeda. Pilihan di antara keduanya akan tergantung pada apa yang sebenarnya saya coba lakukan dalam game (apa status berbeda? Bagaimana transisi game antara status? Dll.)
Bagaimanapun, saya tidak akan melakukannya dengan mengkodekan status ke dalam kode permainan. Daripada pernyataan peralihan besar-besaran di objek NPC, saya lebih memilih perilaku NPC yang dimuat ke dalam array asosiatif dari file data dan kemudian menggunakan array asosiatif tersebut untuk menjalankan perilaku berbeda untuk status asosiasinya, seperti ini:
sumber
Bagaimana dengan menggunakan pola pengamat untuk mencari perubahan-tonggak sejarah? Jika perubahan terjadi, beberapa kelas akan mengenali ini dan menangani misalnya perubahan yang harus dilakukan ke NPC.
Alih-alih pola desain keadaan yang disebutkan saya akan menggunakan strategi-pola.
Jika sebuah npc memiliki n cara untuk berinteraksi dengan posisi karakter dan m di mana ia berada, ada maksimum (m * n) +1 kelas yang harus Anda desain. Menggunakan pola-strategi Anda akan berakhir dengan n + m + 1 kelas tetapi strategi ini juga dapat digunakan oleh npcs lainnya.
Jadi mungkin ada kelas yang menangani tonggak sejarah, dan kelas yang mengamati kelas ini dan menangani baik NPC atau musuh atau apa pun yang harus diubah. Jika pengamat diperbarui, mereka akan memutuskan apakah mereka harus mengubah sesuatu sesuai contoh yang mereka atur. Kelas NPC misalnya akan, dalam konstruktor, memberi tahu NPC-Manager kapan ia harus diperbarui dan apa yang harus diperbarui ...
sumber
Semua pendekatan yang diberikan valid. Itu tergantung pada situasi Anda pada saat tertentu. Banyak petualangan atau MMO menggunakan kombinasi ini.
Misalnya, jika suatu peristiwa penting mengubah sebagian besar level (mis. Seorang penagih utang membersihkan apartemen Anda dan semua orang di dalamnya ditangkap), biasanya lebih mudah untuk mengganti seluruh ruangan dengan kamar kedua yang terlihat serupa.
OTOH, jika karakter berjalan di sekitar peta dan melakukan hal yang berbeda di tempat yang berbeda, Anda sering memiliki aktor tunggal yang berputar melalui objek perilaku yang berbeda (Misalnya berjalan lurus ke depan / tidak ada percakapan vs. berdiri di sini / percakapan tentang kematian Mitch), yang mungkin termasuk "disembunyikan" jika tujuan mereka telah terpenuhi.
Yang mengatakan, biasanya memiliki duplikat objek yang Anda buat secara manual seharusnya tidak menimbulkan masalah. Berapa banyak objek yang dapat Anda buat? Jika Anda dapat membuat lebih banyak objek daripada yang dapat dilakukan permainan Anda, lihat properti "tersembunyi" mereka dan lewati, mesin Anda terlalu lambat. Jadi saya tidak akan terlalu khawatir tentang itu. Banyak game online yang melakukan ini. Karakter atau item tertentu selalu ada, tetapi tidak ditampilkan ke karakter yang tidak memiliki misi yang sesuai.
Anda bahkan dapat menggabungkan pendekatan: Memiliki dua pintu di gedung apartemen Anda. Satu mengarah ke apartemen "sebelum penagih utang", satu ke apartemen setelah. Ketika Anda memasuki koridor, hanya yang berlaku untuk kemajuan Anda dalam cerita yang benar-benar ditampilkan. Dengan begitu, Anda bisa memiliki mekanisme umum untuk "item terlihat pada titik saat ini dalam cerita" dan pintu dengan satu tujuan. Bergantian, Anda bisa membuat pintu yang lebih rumit yang dapat memiliki perilaku yang dapat ditukar, dan salah satunya adalah "pergi ke apartemen penuh", yang lain "pergi ke apartemen kosong". Ini mungkin tampak tidak masuk akal jika benar-benar hanya tujuan pintu berubah, tetapi jika penampilannya juga berubah (misalnya kunci besar di depan pintu yang pertama kali harus Anda retak),
sumber