İşaretle ve tıkla tarzı bir macera oyunu için bir komut sistemini nasıl uygulayabilirim?


11

Bir nokta ve tıkırtı macera oyunu yapıyorum ve şu anda bir komut sistemi uygulamak için en iyi yolu bulmaya çalışıyorum.

Sahnede ve envanterde fiiller ve nesneler paleti bulunan bir Monkey Island veya Maniac Mansion tarzı arayüze sahip olun. Bunlara tıklayarak yürütmek için bir cümle oluşturursunuz.

örneğin, look at"ağaca bak" veya bir elmayı tıklatmak için ve sonra bir ağaç give, sonra da "kıza elma ver" almak için bir kız tıklayabilirsiniz .

Bir cümlenin üç olası şekli vardır:

  • verb, örneğin "kaydet"
  • verb noun, örneğin "elmayı topla", "ahtapoya bak"
  • verb noun noun, örneğin "kuduz köpeğe turşu verin", "turşu kavanozu ile levye kullanın"

Farklı durumlarda, eylemin farklı nesneler tarafından tanımlanmasını istiyorum.

Örneğin, givefiil için, karakterin "Buna devam etmeyi tercih ederim" gibi bir şey söylemesini sağlayan varsayılan bir eylem olabilir veya kuduz köpek, vermeye çalıştığınız her şeyi yediği bir eylem tanımlayabilir .

Arayüz Maniac Mansion gibi çalışacaksa, cümleyi inşa edip yürütmesini söylersiniz (Maniac Mansion'da, cümleyi tıklatarak veya en son tıkladığınız şeyi tıklatarak).

Maymun Adası gibi çalışmak için, cümle tamamlanır tamamlanmaz yürütülür, usebu da bazen bir isim ve diğer zamanlarda iki tane alacak fiiller için bir problem oluşturur .

Peki bunu halleden bir sistemi nasıl uygularsınız?


1
Üç tür fiil var, biri sıfır isim için, diğeri iki kişilik, vb. Gibi. Bunlar aynı nesne sınıfı değil. "Ahtapot turşu kavanozu ile look
bakamazsınız

Yanıtlar:


10

Seçim sırasını ters çevirirseniz kullanımı daha kolay olabilir. Böylece kullanıcı bir adı tıklar ve ardından oyun o ad üzerinde gerçekleştirilebilecek fiiller kümesini görüntüler. Fiil bir nesne gerektiriyorsa (örn. "___ 'a verin"), oyun işlemi gerçekleştirmeden önce kullanıcının nesneyi seçmesini bekler.

Gibi bir şey:

  1. Kullanıcı bir çizburger tıklar.
  2. Oyun bir menü gösterir: "al, ye, bak, ___'a ver".
  3. Kullanıcı "vermek için ___" ı seçer.
  4. Oyun "kime ver?" Diyor. ve kullanıcının başka bir adı (veya iptal düğmesini) tıklamasını bekler.
  5. Kullanıcı bir maymunu tıklar.
  6. Oyun maymuna çizburger verir.

Uygulama açısından, oyundaki her nesnenin aşağıdakiler için verilere sahip olması gerekir:

  1. Hangi fiilleri uygulayabileceğiniz.
  2. Fiiller için, hangi nesne kümesinin uygulanabileceğini bir nesnenin almasına izin verir.
  3. Her fiil veya fiil nesnesi çifti için, kullanıcı bunu yaptığında gerçekleştirilecek davranış.

Dilbilgisi gerçekten iç içe geçmediği için, bir tercüman düzeni kadar karmaşık bir şeye ihtiyacınız olmamalıdır.


+1, hem şeylerin modelleme tarafında hem de şeylerin arayüz tarafında. Evet, çoğunlukla bu nasıl olduğu için kabul ediyorum ben istiyorum bunu ama bu cevabı gibi.
drhayes

Kabul edersek, açıkça ikimiz de haklı olmalıyız. ;)
Münih

Etkili bir şekilde, gerçekleştirilecek davranışın her zaman ilk isim tarafından tanımlanması gerektiğini mi düşünüyorsunuz?
SpoonMeiser

1
Evet, birden fazla ismin davranışı paylaşacağını düşünüyorum (böylece "pick up" farklı nesneleri toplamak için aynı kodu kullanır), ancak uygulanabilir fiiller kümesini belirlemek için isme kadar olması mantıklıdır ona. İsim kümesinin çok büyük olduğu (oyundaki her şey) ve küçük fiiller (muhtemelen bir avuç operasyon) olduğu göz önüne alındığında, kullanıcının kombinasyonları daha fazla kazandığı için önce bir isim seçmesinin mantıklı olduğunu düşünüyorum. hızlı bir şekilde. Ve pragmatik olarak, kullanıcının bir kelimeyi değil, bir etkileşimi başlatmak için bir şeyi tıklamasına izin verir .
Münih

Bu, tam gazın nasıl yapıldığını gösteriyor.
Jari Komppa

2

Ben basit bir çözüm sunuyorum. Elbette genişletilebilir.

Basit bir liste (fiil, nesne1, nesne2) çözeceğini düşünüyorum:

  • eğer oyuncu nesneyi (fiil) tıkladıysa ve "balon" nesnesini tıkladığında ve oyuncu "pompa" nesnesini tıkladığında ve üçlü varsa ("kullan", "balon", "pompa") sonra "pompalı balon kullanıyorsunuz"
  • Bazen object2 "helyum kullan" daki gibi NULL olur (kullanım, helyum, NULL)
  • Oynatıcının önce nesne fiilini tıklamasını iste
  • oyuncu hiçbir şeye uymayan bir şeye tıklarsa "Bunu yapamam, saçmalık"
  • Tabii ki her tıklamadan sonra dizinin doğru olup olmadığını kontrol etmelisiniz.

Varsayılanlarla nasıl başa çıkılır:

  • İlk tıklama fiil nesnesinde değilse, olası varsayılan eylemi arayın.
  • Varsayılanları depolamanın bir yolu dörtlü (fiil, nesne1, nesne2, varsayılan) yapmaktır
  • Bunları saklamanın diğer bir yolu, varsayılan üçüzlerin listesine sahip olmaktır
  • ...

Bazı örnekler:

  • (kullanım, balon, pompa)
  • (ver, John, patates)
  • (yürüyüş, piranalar, NULL)
  • (kullanım, envanterde balon, pompa)
  • (open, kapıdan çatıya, NULL), varsayılan .... varsayılan eylem örneği

Genişletilebilir:

  • tetiklenecek bazı olaylar ekleyin (oyuncuya bir şeyler verin, oyuncu "Bunu güçlü bir korsan olduğum için yapamam" diyecektir, sahneye başlayın, dünyada bir şeyler değiştirin ...)
  • bazı önkoşullar ekleyin. Bazen balon kafeste olabilir, bu yüzden "balon kafeste değilse" ifade etmeniz gerekir. Sanırım olay hesabı veya prolog ile yaklaşabilir ya da işlev işaretçisi ile yapabilirim ...
  • Bazen komut satırındaki cümle "deliğe bak" olmaz ama "deliğe bak" olarak yeniden yazılır, bu sadece bir değişken gerektirir :)

1

Burada iki sorun var: Oyuncunun girdisini bir sözdizimi ağacına yorumlamak, sonra o ağacı uygulamak.

İlk aşamada, her fiil düğmesinin bazı fiil arayüzünden türetilen somut bir fiil örneği oluşturmasını isterdim. Bu örnek doğrulama için başka isimler veya fiillerden geçirilir. Geçerliyse, adı dahili sözdizimi ağacına ekler, aksi takdirde uygun bir hatayla reddeder.

Her düğmeye basıldıktan sonra, fiil ağacına devam etmek için geçerli bir durumda olup olmadığını sorabilirsiniz (Monkey Island tarzı giriş için).

İkinci aşamaya geçildiğinde, somut fiil kendi ağacını ayrıştırmaktan ve oyun durumunu güncellemekten sorumlu olacaktır.

Daha karmaşık bir çözüm, ağacı fiilden harici olarak ayrıştırmayı içerir. Her ağaç öğesi birlikte istenen sonucu veren küçük eylemlerden sorumlu olacaktır. Bu yaklaşım, küçük yapı taşlarından daha acil cümleler kurmanızı sağlar.

Check out Tercüman ayrıştırma sahnede daha fazla bilgi için deseni.


1
Oyuncuların girdilerini yorumlamanın bir sorun olduğunu düşünmüyorum. Elbette, burada ihtiyaç duyulan bir metin macerasına girdi ayrıştırmak kadar sofistike bir şey yoktur. Gerçekten, soru, gerçekleştirilecek gerçek eylemi tanımlayan nesneye maksimum esneklik sağlamak için nesne hiyerarşinizi ve etkileşimlerinizi nasıl tasarlayacağınızla ilgilidir.
SpoonMeiser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.