Bagaimana saya bisa menerapkan sistem perintah untuk game petualangan gaya point-and-click?

11

Saya sedang membuat game petualangan point and click, dan saya saat ini mencoba mencari cara terbaik untuk mengimplementasikan sistem komando.

Asumsikan antarmuka Pulau Monyet atau gaya Maniac Mansion, dengan palet kata kerja, dan objek dalam adegan dan inventaris. Mengklik ini, Anda membangun kalimat untuk dieksekusi.

misalnya, Anda dapat mengklik look atdan kemudian pohon untuk "melihat pohon" atau mengklik apel, lalu give, dan kemudian seorang gadis, untuk mendapatkan "beri apel untuk gadis".

Ada tiga kemungkinan bentuk kalimat:

  • verb, misalnya "simpan"
  • verb noun, misalnya "mengambil apel", "lihat gurita"
  • verb noun noun, misalnya "beri acar pada anjing yang rabies", "gunakan linggis dengan toples"

Dalam situasi yang berbeda, saya ingin tindakan yang akan dilakukan ditentukan oleh objek yang berbeda.

Misalnya, untuk givekata kerja, mungkin ada tindakan default yang didefinisikan yang membuat karakter mengatakan sesuatu seperti "Saya lebih suka berpegang pada itu", atau anjing gila mungkin mendefinisikan tindakan di mana ia memakan apa pun yang Anda coba berikan. .

Jika antarmuka berfungsi seperti Maniac Mansion, maka Anda membuat kalimat, dan kemudian memerintahkannya untuk mengeksekusi (dalam Maniac Mansion, dengan mengklik kalimat tersebut, atau mengklik lagi pada hal terakhir yang Anda klik).

Jika itu berfungsi seperti Pulau Monyet, kalimat dieksekusi segera setelah selesai, yang menimbulkan masalah untuk kata kerja seperti useyang kadang-kadang mungkin mengambil satu kata benda, dan lain kali dua.

Jadi bagaimana Anda menerapkan sistem yang menangani ini?

SpoonMeiser
sumber
1
Tampaknya ada tiga jenis kata kerja, satu jenis untuk kata benda nol, yang lain untuk dua kata, dll. Mereka bukan kelas objek yang sama. Anda tidak bisa "melihat gurita dengan stoples acar" begitu lookjuga kata kerja dengan kata benda tunggal, dll.
tenpn

Jawaban:

10

Anda mungkin merasa lebih mudah digunakan jika Anda membalik urutan pemilihan. Jadi pengguna mengklik kata benda dan kemudian game menampilkan set kata kerja yang dapat dilakukan pada kata benda itu. Jika kata kerjanya membutuhkan objek (mis. "Give to ___", maka game menunggu pengguna untuk memilih objek sebelum melakukan tindakan.

Sesuatu seperti:

  1. Pengguna mengklik sebuah cheeseburger.
  2. Game menampilkan menu: "ambil, makan, lihat, berikan ke ___".
  3. Pengguna memilih "berikan kepada ___".
  4. Game mengatakan "berikan kepada siapa?" dan menunggu pengguna mengklik kata benda lain (atau tombol batal).
  5. Pengguna mengklik monyet.
  6. Game memberikan cheeseburger ke monyet.

Dari segi implementasi, setiap objek dalam game perlu memiliki data untuk:

  1. Kumpulan kata kerja mana yang dapat Anda terapkan.
  2. Untuk kata kerja itu memungkinkan mengambil objek, yang set objek dapat diterapkan.
  3. Untuk setiap pasangan kata kerja atau objek kata kerja, perilaku dilakukan ketika pengguna melakukan itu.

Karena tata bahasanya tidak benar-benar sarang atau apa pun, Anda seharusnya tidak perlu sesuatu yang rumit seperti pola juru bahasa.

banyak sekali
sumber
+1, baik pada sisi pemodelan hal-hal dan di sisi antarmuka hal. Ya, sebagian besar saya setuju karena ini adalah bagaimana saya melakukannya, tetapi saya suka jawaban ini.
drhayes
Jika kita setuju, maka jelas kita berdua harus benar. ;)
murah hati
Jadi, secara efektif, Anda pikir perilaku yang dilakukan harus selalu ditentukan oleh kata benda pertama?
SpoonMeiser
1
Ya, saya pikir beberapa kata benda akan berbagi perilaku (sehingga "mengambil" akan menggunakan kode yang sama untuk mengambil objek yang berbeda), tetapi masuk akal jika itu bergantung pada kata benda untuk menentukan set kata kerja yang dapat diterapkan untuk itu. Mengingat bahwa himpunan kata benda sangat besar (setiap hal dalam permainan) dan himpunan kata kerja kecil (mungkin beberapa operasi), saya pikir masuk akal bagi pengguna untuk memilih kata benda terlebih dahulu karena yang menampi kombinasi lebih banyak segera. Dan, secara pragmatis, ini memungkinkan pengguna mengklik sesuatu untuk memulai interaksi, dan bukan kata-kata.
murah hati
Ini adalah semacam bagaimana kecepatan penuh melakukannya.
Jari Komppa
2

Saya menyajikan solusi sederhana. Bisa diperpanjang tentunya.

Saya pikir daftar sederhana (kata kerja, objek1, objek2) akan menyelesaikannya:

  • jika pemain mengklik objek (kata kerja) "menggunakan" dan mengklik objek "balon" dan pemain mengklik objek "pompa" dan ada triplet ("gunakan", "ballon", "pompa") maka Anda "menggunakan ballon dengan pompa"
  • Terkadang object2 akan menjadi NULL seperti pada "use helium" (use, helium, NULL)
  • Wajibkan pemain untuk mengklik objek kata kerja terlebih dahulu
  • Jika pemain mengklik sesuatu yang tidak cocok dengan apa pun, katakan "Saya tidak bisa melakukan ini, ini omong kosong"
  • Tentu saja Anda harus memeriksa setelah setiap klik jika urutannya benar.

Cara menangani default:

  • Jika klik pertama bukan pada objek kata kerja, cari kemungkinan tindakan default.
  • Salah satu cara untuk menyimpan default adalah dengan membuat quadruplet (kata kerja, object1, object2, is-default)
  • Cara lain untuk menyimpannya adalah dengan memiliki daftar kembar tiga default
  • ...

Beberapa contoh:

  • (gunakan, ballon, pompa)
  • (berikan, John, kentang)
  • (berjalan, piranha, NULL)
  • (gunakan, persediaan ballon, persediaan)
  • (terbuka, dari pintu ke atap, NULL), default .... contoh dari aksi default

Itu dapat diperpanjang:

  • tambahkan beberapa peristiwa yang akan dipicu (beri pemain sesuatu, pemain akan berkata "Saya tidak bisa melakukan itu karena saya bajak laut yang perkasa", mulai cut-scene, ubah sesuatu di dunia ...)
  • tambahkan beberapa prasyarat. Terkadang ballon mungkin ada di dalam sangkar, jadi Anda perlu mengekspresikan "jika ballon tidak ada di dalam sangkar". Saya pikir saya mungkin mendekati ini dengan acara kalkulus atau prolog atau melakukannya dengan fungsi pointer ...
  • terkadang kalimat dalam commandline tidak akan "melihat lubang" tetapi akan ditulis ulang menjadi "melihat ke lubang", ini hanya membutuhkan variabel :)
pengguna712092
sumber
1

Ada dua masalah di sini: Menafsirkan input pemain ke dalam pohon sintaks, kemudian mengeksekusi pohon itu.

Untuk tahap pertama, saya ingin setiap tombol kata kerja membuat contoh kata kerja konkret yang berasal dari beberapa antarmuka kata kerja. Contoh itu akan melewati nomina atau kata kerja lebih lanjut untuk validasi. Jika valid, itu akan melampirkan kata benda ke pohon sintaksis internalnya, kalau tidak ia akan menolak dengan kesalahan yang sesuai.

Setelah setiap tombol ditekan, Anda bisa menanyakan pohon kata kerja apakah itu dalam keadaan valid untuk melanjutkan (untuk input gaya Pulau Kera).

Setelah naik ke tahap kedua, kata kerja konkret akan bertanggung jawab untuk mengurai pohonnya sendiri dan memperbarui status permainan.

Solusi yang lebih kompleks akan melibatkan penguraian pohon secara eksternal ke kata kerja. Setiap elemen pohon akan bertanggung jawab atas tindakan kecil yang bersama-sama menghasilkan hasil yang diinginkan. Pendekatan ini akan memungkinkan Anda untuk membuat lebih banyak kalimat yang muncul dari blok bangunan kecil.

Lihatlah pola Juru Bahasa untuk informasi lebih lanjut tentang tahap penguraian.

tenpn
sumber
1
Saya tidak berpikir menafsirkan input pemain adalah masalah. Tentu saja, tidak ada yang secanggih masukan parsing untuk petualangan teks yang dibutuhkan di sini. Sungguh, pertanyaannya bermuara pada bagaimana Anda merancang hirarki objek dan interaksi Anda untuk memungkinkan fleksibilitas maksimum atas objek apa yang menentukan tindakan aktual yang harus dilakukan.
SpoonMeiser