Gambaran:
Banyak game dengan statistik seperti RPG memungkinkan karakter "buff", mulai dari "Deal 25% extra damage" yang sederhana hingga hal-hal yang lebih rumit seperti "Deal 15 damage kembali ke penyerang saat dipukul."
Spesifikasi setiap tipe buff tidak benar-benar relevan. Saya mencari cara (mungkin berorientasi objek) untuk menangani penggemar sewenang-wenang.
Detail:
Dalam kasus khusus saya, saya memiliki beberapa karakter dalam lingkungan pertempuran berbasis giliran, jadi saya membayangkan penggemar yang terikat dengan acara seperti "OnTurnStart", "OnReceiveDamage", dll. Mungkin setiap penggemar adalah subkelas dari kelas abstrak buff utama, di mana hanya acara terkait yang kelebihan beban. Kemudian setiap karakter dapat memiliki vektor buff yang saat ini diterapkan.
Apakah solusi ini masuk akal? Saya pasti bisa melihat lusinan jenis acara yang diperlukan, rasanya seperti membuat subkelas baru untuk setiap penggemar yang berlebihan, dan sepertinya tidak memungkinkan untuk "interaksi" penggemar. Yaitu, jika saya ingin menerapkan cap pada damage boost sehingga bahkan jika Anda memiliki 10 buff berbeda yang semuanya memberikan 25% damage tambahan, Anda hanya melakukan 100% ekstra daripada 250% tambahan.
Dan ada situasi yang lebih rumit yang idealnya bisa saya kendalikan. Saya yakin semua orang bisa memberikan contoh bagaimana buff yang lebih canggih berpotensi berinteraksi satu sama lain dengan cara yang mungkin tidak saya inginkan sebagai pengembang game.
Sebagai seorang programmer C ++ yang relatif tidak berpengalaman (saya biasanya menggunakan C dalam embedded system), saya merasa solusi saya sederhana dan mungkin tidak memanfaatkan bahasa berorientasi objek secara penuh.
Pikiran? Adakah orang di sini yang merancang sistem buff yang cukup kuat sebelumnya?
Sunting: Mengenai Jawaban:
Saya memilih jawaban terutama berdasarkan detail yang bagus dan jawaban yang solid untuk pertanyaan yang saya ajukan, tetapi membaca tanggapannya memberi saya lebih banyak wawasan.
Mungkin tidak mengejutkan, sistem yang berbeda atau sistem tweak tampaknya berlaku lebih baik untuk situasi tertentu. Sistem apa yang bekerja paling baik untuk gim saya akan bergantung pada jenis, ragam, dan jumlah penggemar yang ingin saya terapkan.
Untuk gim seperti Diablo 3 (disebutkan di bawah), di mana hampir semua peralatan dapat mengubah kekuatan penggemar , penggemar hanya sistem statistik karakter yang sepertinya merupakan ide bagus bila memungkinkan.
Untuk situasi berbasis giliran yang saya ikuti, pendekatan berbasis peristiwa mungkin lebih cocok.
Bagaimanapun, saya masih berharap seseorang datang bersama dengan peluru ajaib "OO" mewah yang akan memungkinkan saya untuk menerapkan jarak pergerakan +2 per buff giliran , kesepakatan 50% dari kerusakan yang diambil kembali ke buff penyerang , dan secara otomatis teleport ke ubin terdekat ketika diserang dari 3 atau lebih ubin buff dalam satu sistem tanpa mengubah buff kekuatan +5 menjadi subkelasnya sendiri.
Saya pikir hal yang paling dekat adalah jawaban yang saya tandai, tetapi lantainya masih terbuka. Terima kasih untuk semua orang atas masukannya.
sumber
Jawaban:
Ini adalah masalah yang rumit, karena Anda berbicara tentang beberapa hal berbeda yang (saat ini) disatukan sebagai 'penggemar':
Saya selalu menerapkan yang pertama dengan daftar efek aktif untuk karakter tertentu. Penghapusan dari daftar, baik berdasarkan durasi atau secara eksplisit sepele jadi saya tidak akan membahasnya di sini. Setiap Efek berisi daftar pengubah atribut, dan dapat menerapkannya ke nilai yang mendasarinya melalui perkalian sederhana.
Lalu saya bungkus dengan fungsi untuk mengakses atribut yang dimodifikasi. misalnya.:
Itu memungkinkan Anda menerapkan efek multiplikasi dengan cukup mudah. Jika Anda memerlukan efek tambahan juga, putuskan urutan Anda akan menerapkannya (mungkin terakhir tambahan) dan jalankan melalui daftar dua kali. (Saya mungkin memiliki daftar pengubah terpisah di Efek, satu untuk multiplikatif, satu untuk tambahan).
Nilai kriteria adalah untuk membiarkan Anda menerapkan "+ 20% vs Mati" - setel nilai UNDEAD pada Efek dan hanya meneruskan nilai UNDEAD
get_current_attribute_value()
ketika Anda menghitung roll kerusakan terhadap musuh undead.Kebetulan, saya tidak akan tergoda untuk mencoba dan menulis sistem yang berlaku dan tidak menerapkan nilai langsung ke nilai atribut yang mendasarinya - hasil akhirnya adalah bahwa atribut Anda sangat mungkin menjauh dari nilai yang dimaksudkan karena kesalahan. (mis. jika Anda mengalikan sesuatu dengan 2, tapi kemudian tutup, ketika Anda membaginya dengan 2 lagi, itu akan lebih rendah daripada yang dimulai dengan.)
Adapun efek berbasis event, seperti "Deal 15 damage kembali ke penyerang ketika mengenai", Anda dapat menambahkan metode pada kelas Effect untuk itu. Tetapi jika Anda ingin perilaku yang berbeda dan sewenang-wenang (mis. Beberapa efek untuk peristiwa di atas mungkin mencerminkan kerusakan kembali, beberapa mungkin menyembuhkan Anda, itu mungkin akan memindahkan Anda secara acak, apa pun) Anda akan memerlukan fungsi khusus atau kelas untuk menanganinya. Anda dapat menetapkan fungsi ke penangan acara pada efek, maka Anda bisa memanggil penangan acara pada efek aktif.
Jelas kelas Efek Anda akan memiliki pengendali acara untuk setiap jenis acara, dan Anda dapat menetapkan fungsi-fungsi pengendali sebanyak yang Anda butuhkan dalam setiap kasus. Anda tidak perlu membuat subkelas Efek, karena masing-masing didefinisikan oleh komposisi pengubah atribut dan penangan peristiwa yang dikandungnya. (Ini mungkin juga akan berisi nama, durasi, dll.)
sumber
Dalam sebuah game yang saya kerjakan dengan seorang teman di kelas kami membuat sistem buff / debuff ketika pengguna terjebak di rumput tinggi dan ubin percepatan dan yang tidak, dan beberapa hal kecil seperti pendarahan dan racun.
Idenya sederhana, dan sementara kami menerapkannya di Python, itu agak efektif.
Pada dasarnya, begini caranya:
Sekarang bagaimana cara menerapkan buff dari dunia adalah cerita yang berbeda. Inilah makanan saya untuk dipikirkan.
sumber
Saya tidak yakin apakah Anda masih membaca ini tetapi saya telah berjuang dengan masalah semacam ini untuk waktu yang lama.
Saya telah merancang berbagai jenis sistem pengaruh. Saya akan membahasnya sebentar sekarang. Ini semua berdasarkan pengalaman saya. Saya tidak mengklaim tahu semua jawaban.
Pengubah Statis
Jenis sistem ini sebagian besar mengandalkan bilangan bulat sederhana untuk menentukan modifikasi apa pun. Misalnya, +100 ke Max HP, +10 untuk menyerang dan sebagainya. Sistem ini juga bisa menangani persen. Anda hanya perlu memastikan bahwa penumpukan tidak lepas kendali.
Saya tidak pernah benar-benar menembolok nilai yang dihasilkan untuk jenis sistem ini. Misalnya, jika saya ingin menampilkan kesehatan maksimal dari sesuatu, saya akan menghasilkan nilai di tempat. Ini mencegah hal-hal dari rawan kesalahan dan hanya lebih mudah dimengerti untuk semua orang yang terlibat.
(Saya bekerja di Jawa sehingga yang mengikuti adalah berbasis Java tetapi harus bekerja dengan beberapa modifikasi untuk bahasa lain) Sistem ini dapat dengan mudah dilakukan dengan menggunakan enum untuk jenis modifikasi, dan kemudian bilangan bulat. Hasil akhirnya dapat ditempatkan ke dalam semacam koleksi yang memiliki pasangan kunci, nilai yang diurutkan. Ini akan menjadi pencarian cepat dan perhitungan, sehingga kinerjanya sangat baik.
Secara keseluruhan, ini bekerja sangat baik hanya dengan pengubah statis datar. Padahal, kode harus ada di tempat yang tepat untuk pengubah yang akan digunakan: getAttack, getMaxHP, getMeleeDamage, dan seterusnya dan seterusnya.
Di mana metode ini gagal (bagi saya) adalah interaksi yang sangat kompleks antara penggemar. Tidak ada cara nyata yang mudah untuk berinteraksi kecuali dengan sedikit mengatasinya. Itu memang memiliki beberapa kemungkinan interaksi sederhana. Untuk melakukan itu, Anda harus membuat modifikasi dengan cara Anda menyimpan pengubah statis. Alih-alih menggunakan enum sebagai kunci, Anda menggunakan sebuah String. String ini akan menjadi nama Enum + variabel ekstra. 9 kali dari 10, variabel tambahan tidak digunakan, jadi Anda masih mempertahankan nama enum sebagai kunci.
Mari kita lakukan contoh cepat: Jika Anda ingin dapat mengubah kerusakan terhadap makhluk mayat hidup, Anda dapat memiliki pasangan yang dipesan seperti ini: (DAMAGE_Undead, 10) DAMAGE adalah Enum dan Undead adalah variabel tambahan. Jadi selama pertempuran, Anda dapat melakukan sesuatu seperti:
Bagaimanapun, ini bekerja dengan cukup baik dan cepat. Tetapi gagal pada interaksi yang kompleks dan memiliki kode "khusus" di mana-mana. Misalnya, pertimbangkan situasi "25% kesempatan untuk berteleportasi pada kematian". Ini adalah yang “cukup” kompleks. Sistem di atas dapat mengatasinya, tetapi tidak mudah, karena Anda memerlukan yang berikut:
Jadi ini membawa saya ke yang berikutnya:
Sistem Penggemar Yang Sangat Kompleks
Saya pernah mencoba menulis MMORPG 2D sendiri. Ini adalah kesalahan yang mengerikan tetapi saya belajar banyak!
Saya menulis ulang sistem yang terpengaruh 3 kali. Yang pertama menggunakan variasi yang kurang kuat di atas. Yang kedua adalah apa yang akan saya bicarakan.
Sistem ini memiliki serangkaian kelas untuk setiap modifikasi, jadi hal-hal seperti: ChangeHP, ChangeMaxHP, ChangeHPByPercent, ChangeMaxByPercent. Saya memiliki jutaan orang ini - bahkan hal-hal seperti TeleportOnDeath.
Kelas saya memiliki hal-hal yang akan dilakukan sebagai berikut:
Terapkan dan hapus menjelaskan sendiri (meskipun untuk hal-hal seperti persen, pengaruhnya akan melacak berapa banyak meningkatkan HP untuk memastikan ketika dampaknya berkurang, itu hanya akan menghapus jumlah yang ditambahkan. Ini adalah kereta, lol, dan Butuh waktu lama untuk memastikan itu benar. Saya masih belum mendapatkan perasaan yang baik tentang hal itu.).
Metode checkForInteraction adalah sepotong kode yang sangat rumit. Di masing-masing kelas yang mempengaruhi (yaitu: ChangeHP), itu akan memiliki kode untuk menentukan apakah ini harus dimodifikasi oleh input yang mempengaruhi. Jadi misalnya, jika Anda memiliki sesuatu seperti ....
Metode checkForInteraction akan menangani semua dampak ini. Untuk melakukan ini, masing-masing pengaruh pada SEMUA pemain di dekat harus diperiksa !! Ini karena jenis pengaruh yang saya hadapi dengan banyak pemain dalam rentang area. Ini berarti kode TIDAK PERNAH MEMILIKI pernyataan khusus seperti di atas - "jika kita baru saja mati, kita harus memeriksa teleport pada kematian". Sistem ini secara otomatis akan menanganinya dengan benar pada waktu yang tepat.
Mencoba untuk menulis sistem ini butuh waktu 2 bulan dan dibuat oleh kepala meledak beberapa kali. NAMUN, itu BENAR-BENAR kuat dan bisa melakukan sejumlah hal gila - terutama ketika Anda memperhitungkan dua fakta berikut untuk kemampuan dalam permainan saya: 1. Mereka memiliki rentang target (yaitu: tunggal, mandiri, hanya grup, PB AE sendiri , Target PB AE, target AE, dan sebagainya). 2. Kemampuan bisa memiliki lebih dari 1 mempengaruhi mereka.
Seperti yang saya sebutkan di atas, ini adalah sistem pengaruh ke 2 dari 3 untuk game ini. Mengapa saya menjauh dari ini?
Sistem ini memiliki kinerja terburuk yang pernah saya lihat! Itu sangat lambat karena harus melakukan begitu banyak memeriksa setiap hal yang terjadi. Saya mencoba memperbaikinya, tetapi menganggapnya gagal.
Jadi kita sampai pada versi ketiga saya (dan tipe lain dari sistem buff):
Mempengaruhi Kelas Kompleks dengan Penangan
Jadi ini cukup banyak kombinasi dari dua yang pertama: Kita dapat memiliki variabel statis dalam kelas yang mempengaruhi yang berisi banyak fungsi dan data tambahan. Kemudian panggil saja penangan (bagi saya, cukup banyak beberapa metode utilitas statis daripada subclass untuk tindakan tertentu. Tapi saya yakin Anda bisa menggunakan subclass untuk tindakan jika Anda menginginkannya juga) ketika kita ingin melakukan sesuatu.
Kelas Affect akan memiliki semua barang bagus yang berair, seperti tipe target, durasi, jumlah penggunaan, kesempatan untuk mengeksekusi dan seterusnya dan seterusnya.
Kami masih harus menambahkan kode khusus untuk menangani situasi, misalnya, teleport pada kematian. Kami masih harus memeriksa ini dalam kode tempur secara manual, dan kemudian jika ada, kami akan mendapatkan daftar efek. Daftar pengaruh ini berisi semua efek yang saat ini diterapkan pada pemain yang berurusan dengan teleportasi pada saat kematian. Kemudian kita akan melihat masing-masing dan memeriksa untuk melihat apakah itu dieksekusi dan berhasil (Kami akan berhenti di yang sukses pertama). Itu berhasil, kami hanya akan memanggil pawang untuk mengurus ini.
Interaksi dapat dilakukan, jika Anda mau. Itu hanya harus menulis kode untuk mencari penggemar tertentu pada pemain / dll. Karena memiliki kinerja yang baik (lihat di bawah), seharusnya cukup efisien untuk melakukan itu. Itu hanya akan membutuhkan penangan yang lebih kompleks dan sebagainya.
Jadi ia memiliki banyak kinerja sistem pertama dan masih banyak kerumitan seperti yang kedua (tetapi tidak banyak). Di Jawa setidaknya, Anda dapat melakukan beberapa hal rumit untuk mendapatkan kinerja yang hampir pertama dalam kebanyakan kasus (yaitu: memiliki peta enum ( http://docs.oracle.com/javase/6/docs/api/java /util/EnumMap.html ) dengan Enums sebagai kunci dan ArrayList mempengaruhi sebagai nilainya. Ini memungkinkan Anda untuk melihat apakah Anda dengan cepat memengaruhi [karena daftar akan menjadi 0 atau peta tidak memiliki enum] dan tidak memiliki untuk terus-menerus mengulangi daftar pengaruh pemain tanpa alasan. Saya tidak keberatan untuk mengulang pengaruh jika kita membutuhkannya saat ini. Saya akan mengoptimalkan nanti jika itu menjadi masalah).
Saat ini saya sedang membuka kembali (menulis ulang game di Java alih-alih basis kode FastROM seperti semula) MUD saya yang berakhir pada 2005 dan saya baru-baru ini bertemu bagaimana saya ingin menerapkan sistem buff saya? Saya akan menggunakan sistem ini karena bekerja dengan baik di permainan saya yang gagal sebelumnya.
Yah, semoga seseorang, di suatu tempat, akan menemukan beberapa wawasan ini berguna.
sumber
Kelas yang berbeda (atau fungsi beralamat) untuk setiap buff tidak berlebihan jika perilaku buff tersebut berbeda satu sama lain. Satu hal akan memiliki penggemar + 10% atau + 20% (yang, tentu saja, akan lebih baik direpresentasikan sebagai dua objek dari kelas yang sama), yang lain akan menerapkan efek yang sangat berbeda yang akan memerlukan kode khusus pula. Namun, saya percaya lebih baik memiliki cara standar untuk menyesuaikan logika permainan daripada membiarkan setiap penggemar melakukan apa pun yang diinginkan (dan mungkin mengganggu satu sama lain dengan cara yang tidak terduga, mengganggu keseimbangan permainan).
Saya sarankan membagi setiap "siklus serangan" menjadi langkah-langkah, di mana setiap langkah memiliki nilai dasar, daftar modifikasi yang dapat diterapkan untuk nilai itu (mungkin dibatasi), dan batas akhir. Setiap modifikasi memiliki transformasi identitas sebagai default, dan dapat dipengaruhi oleh nol atau lebih buff / debuff. Spesifikasi setiap modifikasi akan tergantung pada langkah yang diterapkan. Bagaimana siklus dilaksanakan terserah Anda (termasuk opsi arsitektur yang digerakkan oleh peristiwa, seperti yang telah Anda diskusikan).
Salah satu contoh siklus serangan dapat:
Hal penting yang perlu diperhatikan adalah bahwa semakin awal siklus buff diterapkan, semakin banyak efeknya pada hasilnya . Jadi, jika Anda ingin pertarungan yang lebih "taktis" (di mana keterampilan pemain lebih penting daripada level karakter) buat banyak penggemar / debuff pada statistik dasar. Jika Anda ingin pertarungan yang lebih "seimbang" (di mana level lebih penting - penting dalam MMOG untuk membatasi tingkat kemajuan), gunakan buff / debuffs saja di akhir siklus.
Perbedaan antara "Modifikasi" dan "Penggemar" yang saya sebutkan sebelumnya memiliki tujuan: keputusan tentang aturan dan keseimbangan dapat diterapkan pada yang pertama, sehingga setiap perubahan pada mereka tidak perlu tercermin dalam perubahan pada setiap kelas yang terakhir. OTOH, jumlah dan jenis buff hanya dibatasi oleh imajinasi Anda, karena masing-masing dari mereka dapat mengekspresikan perilaku yang diinginkan tanpa harus memperhitungkan kemungkinan interaksi antara mereka dan yang lain (atau bahkan keberadaan orang lain sama sekali).
Jadi, menjawab pertanyaan: jangan membuat kelas untuk setiap Buff, tetapi satu untuk setiap (jenis) Modifikasi, dan ikat Modifikasi ke siklus serangan, bukan ke karakter. Buff dapat berupa daftar tuple (Modifikasi, kunci, nilai), dan Anda dapat menerapkan buff ke karakter dengan hanya menambahkan / menghapusnya ke kumpulan buff karakter. Ini juga mengurangi jendela kesalahan, karena statistik karakter tidak perlu diubah sama sekali ketika buff diterapkan (jadi ada risiko lebih kecil untuk mengembalikan stat ke nilai yang salah setelah buff berakhir).
sumber
Saya tidak tahu apakah Anda masih membacanya, tetapi di sini adalah bagaimana saya melakukannya sekarang (kode didasarkan pada UE4 dan C ++). Setelah merenungkan masalah selama lebih dari dua minggu (!!), saya akhirnya menemukan ini:
http://gamedevelopment.tutsplus.com/tutorials/using-the-composite-design-pattern-for-an-rpg-attributes-system--gamedev-243
Dan saya pikir, itu juga, merangkum atribut tunggal dalam kelas / struct bukan ide yang buruk. Perlu diingat, bahwa saya mengambil keuntungan besar dari UE4 build dalam sistem kode refleksi, jadi tanpa pengerjaan ulang, ini mungkin tidak cocok di mana-mana.
Lagi pula, saya mulai dari membungkus atribut ke dalam struct tunggal:
Itu masih belum selesai tetapi ide dasarnya, adalah bahwa struct ini melacak keadaan internal itu. Atribut hanya dapat dimodifikasi oleh Efek. Mencoba memodifikasinya secara langsung tidak aman dan tidak terpapar pada desainer. Saya berasumsi bahwa semuanya, yang dapat berinteraksi dengan atribut adalah Efek. Termasuk bonus tetap dari item. Ketika item baru dilengkapi, efek baru (bersama dengan pegangan) dibuat, dan ditambahkan ke peta khusus, yang menangani bonus durasi tak terbatas (yang harus dihapus secara manual oleh pemain). Ketika Efek baru sedang diterapkan, Menangani baru untuk itu dibuat (pegangan hanya int, dibungkus dengan struct), dan kemudian pegangan itu dilewati di sekitar sebagai sarana untuk berinteraksi dengan efek ini, serta melacak jika efeknya adalah masih aktif. Ketika efek dihapus, pegangannya disiarkan ke semua objek yang tertarik,
Bagian penting sebenarnya dari ini adalah TMap (TMap ished map). FGAModifier adalah struct yang sangat sederhana:
Ini berisi jenis modifikasi:
Dan Nilai yang merupakan nilai akhir yang dihitung akan kita terapkan pada atribut.
Kami menambahkan efek baru menggunakan fungsi sederhana, dan kemudian memanggil:
Fungsi ini seharusnya menghitung ulang seluruh tumpukan bonus, setiap efek waktu ditambahkan atau dihapus. Fungsi masih belum selesai (seperti yang Anda lihat), tetapi Anda bisa mendapatkan ide umum.
Keluhan terbesar saya saat ini adalah menangani atribut Damaging / Healing (tanpa melibatkan penghitungan ulang seluruh tumpukan), saya pikir ini sudah agak terpecahkan, tetapi masih membutuhkan lebih banyak pengujian hingga 100%.
Dalam atribut apa pun Atttributes didefinisikan seperti ini (+ makro Nyata, dihilangkan di sini):
dll.
Juga saya tidak 100% yakin tentang penanganan CurrentValue atribut, tetapi itu harus berfungsi. Mereka seperti sekarang.
Bagaimanapun saya berharap ini akan menghemat beberapa orang cache kepala, tidak yakin apakah ini solusi terbaik atau bahkan baik, tapi saya lebih menyukainya, daripada melacak efek secara independen dari atribut. Membuat setiap pelacakan atribut dalam keadaannya sendiri jauh lebih mudah dalam hal ini, dan seharusnya lebih sedikit kesalahan. Pada dasarnya hanya ada satu titik kegagalan, yaitu kelas yang cukup pendek dan sederhana.
sumber
Saya bekerja pada MMO kecil dan semua item, kekuatan, penggemar dll punya 'efek'. Efek adalah kelas yang memiliki variabel untuk 'AddDefense', 'InstantDamage', 'HealHP', dll. Kekuatan, item, dll akan menangani durasi untuk efek itu.
Ketika Anda memberikan kekuatan atau memakai item itu akan menerapkan efek ke karakter untuk durasi yang ditentukan. Kemudian serangan utama, dll perhitungan akan memperhitungkan efek yang diterapkan.
Misalnya, Anda memiliki penggemar yang menambah pertahanan. Setidaknya akan ada EffectID dan Durasi untuk buff itu. Saat casting, itu akan menerapkan EffectID ke karakter untuk durasi yang ditentukan.
Contoh lain untuk suatu item, akan memiliki bidang yang sama. Tetapi durasinya tidak terbatas atau sampai efeknya dihapus dengan mengambil item dari karakter.
Metode ini memungkinkan Anda untuk mengulang daftar efek yang sedang diterapkan.
Semoga saya menjelaskan metode ini dengan cukup jelas.
sumber
Saya menggunakan ScriptableOjects sebagai buff / mantra / talenta
menggunakan UnityEngine; menggunakan System.Collections.Generic;
public enum BuffType {Buff, Debuff} [System.Serializable] kelas publik BuffStat {public Stat Stat = Stat.Strength; publik ModValueInPercent = 0.1f; }
BuffModul:
sumber
Ini adalah pertanyaan aktual bagi saya. Saya punya satu ide tentang itu.
Buff
daftar dan pembaru logika untuk para penggemar.Buff
kelas.Dengan cara ini, mudah untuk menambahkan statistik pemain baru, tanpa mengubah logika
Buff
subclass.sumber
Saya tahu ini cukup lama tetapi tertaut di pos yang lebih baru dan saya memiliki beberapa pemikiran tentang hal ini yang ingin saya bagikan. Sayangnya saya tidak memiliki catatan saya saat ini, jadi saya akan mencoba memberikan gambaran umum tentang apa yang saya bicarakan dan saya akan mengedit rincian dan beberapa contoh kode ketika saya memilikinya di depan saya.
Pertama, saya berpikir bahwa dari perspektif desain kebanyakan orang menjadi terlalu terperangkap dalam jenis buff apa yang dapat dibuat dan bagaimana mereka diterapkan dan melupakan prinsip-prinsip dasar pemrograman berorientasi objek.
Apa yang saya maksud? Tidak masalah apakah sesuatu itu buff atau debuff, mereka berdua pengubah yang hanya mempengaruhi sesuatu baik secara positif atau negatif. Kode tidak peduli yang mana. Untuk masalah ini, pada akhirnya tidak masalah apakah ada sesuatu yang menambahkan statistik atau mengalikannya, itu hanya operator yang berbeda dan sekali lagi kodenya tidak peduli yang mana.
Jadi kemana saya akan pergi dengan ini? Mendesain kelas buff / debuff yang bagus (baca: sederhana, elegan) tidak terlalu sulit, yang sulit adalah merancang sistem yang menghitung dan mempertahankan status permainan.
Jika saya merancang sistem buff / debuff, berikut beberapa hal yang akan saya pertimbangkan:
Beberapa spesifik untuk apa yang harus mengandung tipe buff / debuff:
Itu baru permulaan, tetapi dari sana Anda hanya mendefinisikan apa yang Anda inginkan dan bertindak berdasarkan kondisi permainan normal Anda. Misalnya, Anda ingin membuat item terkutuk yang mengurangi kecepatan gerakan ...
Selama saya telah menempatkan jenis yang tepat di tempat itu mudah untuk membuat catatan penggemar yang mengatakan:
Dan seterusnya, dan ketika saya membuat buff saya hanya menetapkan itu BuffType of Curse dan yang lainnya terserah mesin ...
sumber