oyun hikayesi olay programlama


28

C / c ++ ve DirectX'te bir oyun motoru geliştirdim.

Haritalar, animasyonlu oyuncu / npc sprite, npc, menüler ve seviye değiştirme ile ilgili bir çini motorum var ama oyun yok, sadece boş hissediyor.

Etrafa baktım ve buzzword cevaplarını duymaya devam ettim ama oyunumda bir hikayenin nasıl uygulanacağını bilmek istiyorum.

Bazı insanlar oyunda mümkün olan her eylem / durumu yöneten bayrakları tutan bir kayıt dosyası olduğunu söylediler ancak bu saçma geliyor.

Biraz iddialı ama eski Pokemon / Final Fantasy oyunları gibi bir oyun kazanmayı hedefliyorum.

Herhangi biri bu oyunların nasıl çalıştığını veya kullanılan teoriyi bilen var mı?

Bir süredir araştırıyorum ve insanların sahip olduğu her türlü girişi takdir ediyorum.

Yanıtlar:


19

Oyununuzun hikayesi muhtemelen sonlu bir devlet otomatı (ya da bir çeşit genişletilmiş FSA) biçiminde olmalıdır. Bazı olaylar gerçekleştiğinde, yeni bir duruma geçmelisiniz. Bu yolla, yalnızca mevcut durumu ve FSA'da bir sonraki adımda nereye gideceğinizi bilmek için gereken bilgileri (konum, sağlık vb. Gibi oyuncu detayları ile birlikte) saklamanız gerekir.

Örneğin, Pokemon oyunlarını kesinlikle aşırı derecede basitleştirirsek, spor salonu rozetleri ÖSO'nun ana kolunu oluşturur. Rozetin olmadığı ve spor salonunun liderlerini yendikten sonra eyaletlerden, eyaletlerden birine, eyaletten 2'ye vb. Geçtiğinizde başlarsınız. Oyun varlıklarınızın mevcut duruma göre güncellenmesini sağlamak için mevcut duruma bakmak için onları. Örneğin, 3. spor salonunun dışındaki bir NPC, hangi durumda olduğunuzu kontrol eder, 3 rozete sahip durumda bulunduğunuzu görür ve buna göre yanıt verir (belki de “Aferin!” İle).

Dünyadaki her şeyin durumunu kaydetmenize gerek yok; hikayenin sadece durumu. Varlıkların kendileri mevcut duruma bağlı olarak nasıl tepki vereceğini biliyorlar.


ilginç bir yaklaşım ve onu denemek zorunda kalacağım ama hikayenin ilerlemesine bağlı olmayan yan görevleri nasıl takip edersiniz?

Bu gerçekten hikayenin ne kadar karmaşık olduğuna bağlı. Birden fazla FSA'ya (her bir istasyon için bir tane) sahip olmak en kolay olabilir veya bazı karmaşık dallara ihtiyaç duyabilirsiniz. Oturup hikayenizi yol haritası olarak çizmeniz gerekir. Her şeyin nasıl iç içe geçtiğini anladığınızda, mevcut durumu nasıl saklayabileceğinizi düşünün (veya aynı anda birden fazla durumda olup olmadığını belirtin). NPC'lerin pozisyonları (kaydedilmeleri gerekiyorsa) ve bazı karakterlerin sağlığı gibi bazı şeylerin ayrı ayrı saklanması gerekecektir, çünkü bunlar hikayeye bağlı değildir.

Bahsettiğiniz bu FSA, bunun bir açıklamasını nerede bulabilirim, tercihen basitleştirilmiş ve iç içe geçmiş başka teoriler olmadan.
Skeith

Her yerdeki devlet makineleri hakkında her şeyi öğrenebilirsiniz, ancak zamanın% 99.9'u oyunlardan bahsetmiyor. Hesaplamaya giriş niteliğinde bir kitap, onlar hakkında size bilgi verecektir, ancak gerçekten bu kadar fazla bilgiye ihtiyacınız yok. Devletlerde olma ve belirli olaylar olduğunda aralarında hareket etme kavramını anlamanız yeterlidir. @ pwny'nin cevabı gerçekten de aynı şeyi farklı bir şekilde söylüyor. FSA'ları okumak, devlet makinelerinin kavramlarını öğrenmenin harika bir yolu olacaktır. Devlet makinelerine giriş için sadece Google!
Joseph Mansfield

7

Oyununuzda bulunan bir dizi olası durumu kullanabilirsiniz. NPC'leriniz ve dünyanız bu durumların farkında olacak ve buna göre tepki gösterecektir. Ayrıca bazı eylemler / olaylar tarafından etkinleştirilecek olan bir dizi tetikleyici tanımlamak isteyebilirsiniz.

Örneğin, belli bir rakibi yenmek A tetikleyicisini harekete geçirir, bu da dünyanıza S durumu ekler ve S durumunda karakteriniz rakip inin dışına çıktığında elektriğe kapılır. Ya da dışarıda yağmur yağıyor. Ya da nadir bir şeker bulursun. Sen anladın.

Oyuna bu iki basit eklemeyle, onu çok daha "canlı" yapabilirsin.

Dünyanız, karakterleriniz ve hikayeniz için zengin bir arka plan oluşturduğunuzdan ve oyunun bu arka planla tutarlı olduğundan emin olun. Önce hikayeni planla.

Ayrıca Gamedev'i deneyin


bu mümkün, ancak profesyonellerin daha iyi bir şekilde sahip olduklarından, yüz binlerce boole ve sandık gerektirdiğinden eminim (bunu denedim). Bunu sadece büyük ölçekli bir oyuna gerçekçi bir yaklaşım olarak görmüyorum. bağlantı için teşekkürler

Zorunlu olmamakla birlikte, 5 bağımsız üst üste binebilir durum düşünün. 5 boolean için 32 olası dal alırsın. Bence bu makul. Ayrıca, tetikleme sistemleri çok profesyonel oyunlarda kullanılır, çünkü daha sonra bir dizi tetikleyici kullanarak davranışını kodlayabilirsiniz.
Pwny

2

Sftrabbit'in dediği gibi, bu bir devlet makinesi için mükemmel bir uygulamadır.

Temel olarak, bir çeşit ağaç yapınız var. Her yaprak / düğüm geçerli durum hakkında bilgi ve bir sonraki duruma geçmek için kurallar içerir. Her düğüm, arsa / oynatma akışınız için ne kadar karmaşık olmanız gerektiğine bağlı olarak birden fazla çıkış içerebilir.

Bunun için çok iyi bir analog, Kendi Macera Kitabınızı Seçin . Her sayfa hikayenin bir bölümünü ve oynatıcının verebileceği kararları anlatan bir metin içerir. Her karar başka bir sayfaya yönlendirir. Bazı sayfalar daha önce ziyaret edilen sayfalara, vb.

Phobos'un Zork ve Deri Tanrıçaları gibi eski metne dayalı macera oyunları ve rezil Sierra * Quest oyunları ( Roger Wilco'yu uzay temizleyicisinin başrolünde oynadığı SpaceQuest, favorilerimden biri ) bu sistemin çok basit bir versiyonunu kullandı. Haritadaki her oda, başka eyaletlere veya odalara bağlı çıkışlara sahip bir eyaletti. Bir öğenin alınması, bir global durum nesnesine bir bayrak koyar. Her oda, her odada hangi karakterlerin veya eşyaların mevcut olduğunu belirlemek için bu bayrakları kontrol eder.

Dolayısıyla, eyaletleriniz her biri için özelliklere sahip bir sınıf veya yapı olarak uygulanabilir:

Varlık listesi - arka plan grafiklerini gösteren işaretçilerin ve oda / durum / seviyeyi görüntülemek için ihtiyacınız olan her şeyin listesi.

Giriş koşulları - bir seviyeye girmek için ulaşılmış olması gereken başarılar

Çıkışlar - olası her "sonraki" çıkışa bağlanır. Kuzey, Güney, Doğu ve Batı bunun bir örneğini oluşturuyor ancak aynı zamanda Kapı 1, Teleport, vb. Giriş koşullarının karşılanıp karşılanmadığını görmek ve çıkışın ekranda gösterilme şeklini değiştirmek veya oynatıcının bu yönde hareket etmesine izin vermemek.

Fantezi olmak istiyorsanız, odanın oyuncuya sunulma şeklini veya o odada bulunan eylemleri değiştiren farklı giriş koşullarına sahip bir durumun farklı bir versiyonunu ekleyebilirsiniz.

Başlangıç ​​ekranınız, ekranda ölüm / oyun vb., Menü ekranları arasında gezinme biçiminize benzer şekilde, sistem içindeki durumların tümü olabilir. Aslında, böyle bir menü sistemine sahipseniz, bunun için kullanabilirsiniz. Bir menüde gezinmek için yukarı / aşağı oklar ve "gir" yerine, oyun alanı içinde bir teleport yastığına basmak, ekranın sağ tarafından yürümek vb. Gibi belirli olayları ararsınız.

Yönetici açısından, durum makinesini oluşturmanıza izin verecek bir yönetici aracı oluşturmaktan yararlanıp faydalanmayacağınızı düşünün. Bir haritaya oda ekleyin, aralarında bağlantı oluşturun, arka plan resimleri vb. Varlıklar atayın. admin araçları oluşturmakta zorlanmak çok kolaydır ve oyunu asla bitiremezsiniz. Unutma, ara katman yazılımı değil, oyun yazıyorsun.

Bu yardımcı olur umarım.


Bu örnekten bir kasaba kurtarabilirsin. döşeme düzeninin yanı sıra grafik ve boyut, npc ve buna benzer genel şeyler içeren bir dosyam var. bir dosya ekleyerek oyuna başkalarının katkıda bulunmasına izin veren yeni bir şehir kamerası eklenir ya da öyle bir plan vardı ancak dosya biraz daha karmaşık ve karmaşık hale geliyor. eğer seni anlarsam, bu kasabada bahsi geçen kasabada meydana gelebilecek olayları, bu dosyada ilerlemeleri takip etmek için bayraklarla koyarım.
Skeith

@Skeith evet, bu makul bir yaklaşım gibi görünüyor.
3Dave

0

VERGE adlı bu oyun motorunu kullanırdım . Bununla oynayın ve olayları nasıl işlediğini görün, gerçekten hoşuma gitti. Eğer onlar, bunu uygulamaya nasıl görebilirsiniz, böylece çok açık kaynak var burada . İşte kısa bir açıklama.

Her haritanın çeşitli katmanları vardır. Birkaç tane olabileceği grafiksel katmanlar. Tıkanma katmanı. Ve sonra bölge katmanı var. Bölge katmanı burada önemli olan şey. *

Her kutuda hangi bölgenin parçası olduğunu gösteren bir numara vardır. Her bölge iki temel yolla etkinleştirilebilir. Bölge, oyuncu girdikten sonra aktive olur veya komşu aktivasyon denilen şeye sahiptir. Bitişik aktivasyon, oynatıcının zonun döşemelerinden birine bitişik durması ve aktivasyon anahtarı olarak belirtilen bazı tuşlara basması durumunda zonun etkinleştirilmesi anlamına gelir.

Bir bölge aktif olduğunda ne olur, bir betikten bir fonksiyon çağırır. Bu yüzden bir çeşit betik dili yerleştirmelisin. VERGE'nin VergeC adında bir dili vardır ve aynı zamanda lua'ya da izin verir. Ben kendimi python kullanmayı tercih ediyorum.

Bu engelin üstesinden geldikten sonra, şimdi olay kodlamanızda muazzam bir güce sahipsiniz. Oyuncu istatistikleri, hikaye bayrakları vb. Gibi verileri saklayabileceğiniz ve bunlara etki edebileceğiniz eksiksiz bir programlama diliniz var ...

* Bir Entity katmanı da var. Varlıklar mobil bitişik aktif bölgeler gibi davranır.


Bu tür rpg oyun yapımcısı serisinde kullanılan sistem gibi geliyor. peki ya o döşemenin hikayenin ne kadar uzağında olduğuna göre 5 farklı olay varsa
Skeith

@Skeith Yapamaz. Her karo, kendisiyle ilişkilendirilmiş yalnızca bir bölgeye sahiptir. Ve her bölge, çağırdığı sadece bir betik fonksiyonuna sahiptir. Yine de bu bir sorun değil. Unutma, burada tam teşekküllü bir programlama dili var. Hikayenin ne kadarıyla saklandığınız hakkındaki bilgiler bir değişkende (ya da birkaçında) saklanır. Bu yüzden ne yapılacağına karar vermek, senaryodaki değişkeni test etmek ve değerine göre uygun işlemi yapmak için basit bir meseledir.
Benjamin Lindley

@Skeith: Bir döşemenin ait olduğu bölgeyi değiştirme seçeneği ekleyebilirsiniz.
Benjamin Lindley
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.