Yaitu, apa yang terhubung dengan apa dan bagaimana bergerak di antara garis-garis pembicaraan ketika sub-percakapan berakhir?
Jika Anda memiliki contoh pohon dialog dasar di C #, silakan kirim.
Yaitu, apa yang terhubung dengan apa dan bagaimana bergerak di antara garis-garis pembicaraan ketika sub-percakapan berakhir?
Jika Anda memiliki contoh pohon dialog dasar di C #, silakan kirim.
Jawaban:
Nama "pohon dialog" agak menyesatkan - biasanya grafik berarah sederhana , bukan hanya pohon . Struktur data dasar dari grafik tersebut biasanya terdiri dari semacam "data" untuk node, yang mewakili titik-titik yang kita bahas dalam percakapan, dan tautan dari mereka ke node lain, yang mewakili apa yang dikatakan dan dilakukan oleh para peserta dan secara opsional memiliki persyaratan untuk membatasi visibilitas atau skrip mereka untuk melakukan berbagai tindakan tambahan. Biasanya salah satu node adalah simpul awal default (label khas untuk itu adalah "ROOT", "MULAI" dan "SALAM"), dan node yang tidak memiliki tautan valid yang mengarah dari mereka mengakhiri pembicaraan.
Dalam kebanyakan kasus, grafik direpresentasikan dalam memori sebagai daftar Node
struktur data, masing-masing memiliki setidaknya ID dan daftar Link
struktur data 0..n . Daftar ini dapat bersifat lokal untuk NPC atau yang global; kasus kedua lebih disukai jika Anda memiliki banyak NPC generik yang dapat diajak bicara untuk mendapatkan informasi, tetapi tidak menawarkan percakapan khusus sendiri. Sistem itu sendiri menemukan simpul percakapan awal untuk NPC, mengingat ID-nya sebagai ID percakapan saat ini, menyajikan tautan yang saat ini valid untuk pemain pilih (atau "[akhiri percakapan]" jika tidak ada tautan yang valid) dan tunggu memasukkan. Ketika pemain memilih tautan, garis dialog terkait ditampilkan dan semua skrip terkait dijalankan.
Alih-alih memiliki aturan dan ketentuan yang rumit pada tautan, Anda dapat menggunakan variabel boolean "valid" sederhana, yang kemudian dapat diubah dari skrip tautan percakapan lain (termasuk yang default dari simpul awal) atau dari luar mekanisme. Secara umum, pendekatan ini lebih sederhana tetapi hanya cocok untuk game dengan percakapan yang sangat sedikit, karena ini menggerakkan logika "Kapan respons ini mungkin?" jauh dari data respons itu sendiri.
Perhatikan bahwa struktur yang saya jelaskan di sini sedikit berbeda dari Byte56 di mana node tidak perlu memiliki garis dialog; tautannya dapat memiliki semuanya. Dalam varian paling dasar, ini diterjemahkan ke struktur berikut.
Pohon dialog dibuat dengan struktur grafik terarah .
Grafik dilintasi berdasarkan keputusan dialog yang dibuat pemain. Opsi dialog yang disediakan untuk pengguna berasal dari tepi yang menentukan jalur ke node dialog lain.
Grafik yang diarahkan adalah struktur data dasar. Mereka dapat dengan mudah diimplementasikan dan Anda mungkin ingin menerapkannya sendiri. Karena Anda ingin menyesuaikan grafik dengan kebutuhan dialog Anda.
Beberapa node mungkin perlu memiliki kondisi khusus yang terpenuhi untuk muncul. Sebagai contoh, pemain akan membutuhkan keterampilan berbicara di atas X. Atau pemain harus menyelesaikan misi Z sebelum mereka dapat melanjutkan satu cabang dialog. Atau mereka perlu menanyakan sesuatu 4 kali sebelum NPC mendiskusikannya dengan mereka. Fitur-fitur ini akan disesuaikan untuk gim Anda. Tetapi perlu disebutkan ketika Anda mengimplementasikan node dan edge traversal. Tentu saja selalu yang terbaik untuk memulai dengan bentuk yang paling sederhana dan membangun dari sana.
Saya telah membangun sistem dialogtree sederhana: http://iki.fi/sol/d3/ "engine" itu sendiri saat ini jelas c, tetapi data yang dihasilkan oleh editor cukup sederhana untuk digunakan dalam bahasa apa pun. Alat ini menghasilkan XML, JSON dan format biner khusus.
Konsep utamanya cukup sederhana:
Setiap node (yang saya sebut "kartu", seperti analog di atas) dari dialog terdiri dari teks pertanyaan dan nol atau lebih jawaban. Setiap jawaban mengarah ke kartu lain.
Ada juga sistem tag di mana jawaban tertentu ditampilkan kepada pengguna hanya jika tag diatur (atau tag tidak disetel). Memasukkan set kartu (atau unsets) tag yang ditentukan.
Ini adalah hampir semua yang perlu dilakukan seseorang dalam segala jenis dialog dalam sebuah game. "Teks pertanyaan" dapat berupa teks biasa, atau dapat berupa skrip untuk mendorong animasi atau yang lainnya.
Anda dapat menggunakan TreeSharp dan pohon perilaku untuk memodelkan sistem dialog. TreeSharp adalah perpustakaan yang menyediakan implementasi pohon perilaku sederhana. IA bot untuk wow selesai dengan ini, jadi sudah matang ... :)
Implementasi saya memiliki simpul yang memungkinkan memilih antara jawaban, dan setiap jawaban dapat digabungkan ke dialog lain atau tindakan, atau urutan tindakan, atau simpul yang memungkinkan pergi ke dialog lain ... atau apa yang Anda inginkan ...
Saya telah menggunakan editor Jenius untuk membuatnya secara visual ... tetapi pada akhirnya menghasilkan kode c # berdasarkan treesharp ...
Anda ingin grafik terarah (mungkin bersiklus).
Anda akan memodelkan simpul sebagai objek, dan semua panah keluar dalam simpul grafik dimodelkan sebagai objek yang terpisah juga. Node memiliki daftar panah keluar, dan setiap objek "panah" memiliki teks untuk ditampilkan dan referensi ke tujuan. Tidak yakin, tapi saya pikir dalam objek C # selalu direferensikan, jadi Anda hanya membuat objek pertama, dan kemudian ketika Anda membuat objek panah, tancapkan objek yang sama ke bidang tujuan dua panah. (Dalam C ++ Anda akan menggunakan referensi atau tipe pointer, Node & atau Node *)
Untuk memuat hal-hal seperti ini dari disk, biasanya memberikan setiap node nomor ID unik, lalu memuat semua node ke dalam array di mana indeks adalah nomor unik itu. Kemudian panah diserialisasi dengan menuliskan nomornya, bukan objek yang sebenarnya keluar.
Saat Anda memuat panah, Anda menggunakan array dan ID untuk mendapatkan referensi ke simpul yang ditunjuknya. Jika Anda menulis objek dua kali, Anda akan mendapatkan dua objek terpisah yang hanya terlihat identik, yang mungkin bukan yang Anda inginkan.
Memproses pohon dialog menjadi sangat sederhana. Anda cukup meletakkan simpul root dalam sebuah currentNode
variabel, menampilkan semuanya entah bagaimana, lalu ketika suatu pilihan dibuat, setel rootNode
ke tujuan panah. Dalam pseudocode:
Node& currentNode = dialogTree.node[0];
while( currentNode != END_CONVERSATION_PSEUDO_NODE )
{
stage.displayNode( currentNode );
currentNode = stage.waitForUserToChoose();
}
Saya baru-baru ini harus mengembangkan sesuatu seperti ini menggunakan Node, dan memilih struktur file teks yang sangat dasar untuk mewakili grafik diarahkan dari node percakapan.
Anda dapat melihat kode dan format teks yang dihasilkan di:
https://github.com/scottbw/dialoguejs
Ini tidak mendukung kondisi atau pemicu peristiwa (belum), tetapi mungkin cukup sederhana untuk memulai dengan banyak pengembang game.
(Kode itu sendiri di GPL, btw)
dialog-tree
tag.