Oyun dünyasında büyük miktarda varlık simüle etmenin zarif yolu


33

Bazı fonksiyonlara hizmet eden, her biri sürekli olarak ihtiyaç duyulmayan veya her çerçevede göz önünde bulundurulması gereken birçok varlığın olduğu bir oyununuz olduğunu varsayalım. Bu meselenin üzerinde durduğum somut problem, organlarını içeren bir bedenin ayrıntılı bir simülasyonudur.

Oyunda, her yaratığın daha küçük parçalara (gövde, bacaklar vb.) Ayrılmış kendi vücudu vardır ve bazen bu parçalar vücutta belirli bir fonksiyona hizmet eden organları içerir. Bir organın şu anda bir amaca hizmet edip etmediği veya aktif olup olmadığı hiçbir zaman net değildir. Sonuçta, bir hayvan boş bir mideye sahip olabilir, bu nedenle herhangi bir şeyi sindirmesi gerekmez. Her karedeki her nesneyi kontrol etmek veya simüle etmek oldukça saçma ve dünyadaki birçok yaratığa sahip olduğunuzda çok masraflı olacaktır. Bu yüzden, güncellenmesi gereken nesnelerle akıllıca farklılaşmanın bir yolu olduğunu düşünüyordum.

Karşılaştığım en azından tamam bir çözüm gibi görünüyor. Basit bir sıra / yığın oluşturur (zorunludur, her eleman okunur okunmaz kaldırılır; sıra önemsizdir), simüle edilmesi gereken nesnelerin bulunduğu “dikkat yığını” olarak adlandırılır. Dikkat edilmesi gereken nesneler basitçe kendilerini yığına koyar veya başka nesneler tarafından oraya konur. Bu nesneler muhtemelen bir simulate () - fonksiyonuyla basit bir arayüz oluşturur.

Önceki sindirim örneğime uygulandığında bu şu anlama gelir:

Oyuncu, envanterden yiyecek bir şeyler seçer (ekmek olduğunu varsayar) ve karakterinin ağzına sokar ve ağız dikkat yığınına yerleştirilir. Bir sonraki çerçevede, ağız istiften alınır ve simule () - fonksiyonu çağrılır. Ağız olduğu için burada çiğnenmeyi taklit etmek mantıklı olacaktır. Bu, yemeğin yutulmaya hazır olduğuna karar verene kadar ağzın kendisini istifin üzerine koymaya devam ettiği birkaç çerçeve için devam edebilir. Bu durumda, ağız çiğnenmiş ekmeği mideye koyar (doğrudan oraya gitmediğini biliyorum, ancak yemek borusu basitleştirmek için dışarıda bırakılır). Bir sonraki çerçevede, sindirim sürecinin simülasyonu başlatıldı. Ve böylece gerekli organların geri kalanı için.

Bununla ilgili öngörülebilir bir sorun boşta kalan nesnelerdir. Uyuyan bir hayvan buna iyi bir örnektir. Uyuyan hayvanı istifte tutarak ve uyanması gerekip gerekmediğini her seferinde kontrol ederek daha önce tarif edildiği gibi yapılabilir, ancak yapılan tek şey bu çünkü israf gibi görünüyor. Boşta nesneleri daha verimli hale getirmek için, belirli bir zamanda gerçekleştirilecek işleri depolayan bir tür zamanlama eklemeyi planlıyordum. Eğer bir hayvan uyumaya başlarsa, hayvan uyumadan sonra belli bir süre için programlanmış olan bu programa bir iş koyar. Bu iş daha sonra uyuyan hayvanı tekrar dikkat yığınına koymakla ilgilenirdi. Şimdi, dikkat yığınında olmayan uyuyan bir hayvanın AI tarafından simüle edilmediğinden bir şey tarafından saldırıya uğramayacağını özleyebileceğini söyleyebilirsiniz.

Şimdi, bunun, deneyim eksikliğinden dolayı bu sorunun zarif bir çözüme yakın olup olmadığını bile bilmiyorum. Kullanılabilir bir şeye yakın mıyım? Bu genellikle nasıl yapılır veya herhangi bir önerisi veya daha iyi çözümü olan var mı?

Yanıtlar:


10

Bu tam olarak Stendhal'daki bu problemi çözme şeklimiz . Bizim durumumuzda periyodik olarak gerçekleşen pek çok şey var, ama her seferinde değil: Büyüleri iyileştirmek, bitkileri biraz daha büyütmek, cesedi dejenere etmek, yerdeki öğelerin süresi dolmak üzere.

Her fırsatta artan bir dönüş numaramız var. Ve bu sırayla bildirilmesi gereken bir dizi nesneye işaret eden gelecekteki sıra numaralarının haritasını tutuyoruz.


bu arada nesneyle başka bir şey etkileşime girerse ne olur? Örneğin uyuyan hayvan, bir isabet taşı tarafından uyandırılabilir. Bu durumda hayvanın programını kaldırmalı mıyım?
Emiliano

Bu duruma bağlıdır: Eğer yapılan eylem zararsızsa (uyanıkken uyanmak gibi), sadece bunun olmasına izin verdik. Ancak eylem bir kaynak kullanıyorsa, bekleyen sırada arama yaparız ve kaldırırız.
Hendrik Brummermann

14

Girdilerinkine benzer bir soruna benziyor: klavyede 100+ tuş var ancak her karedeki her bir anahtarı kontrol etmek istemiyorsunuz, peki ne yapıyorsunuz?

İki cevap: yoklama veya sistem mesajları.

Polling = oyunda gerçekten ne zaman önemli olacağını herhangi bir noktada klavye tuşlarının (veya durumunuzdaki nesnelerin) durumunu sorgulayın. Zamanın geri kalanı, onları görmezden gelin.

Mesajlar = her klavye tuşuna (nesne) basıldığında veya bırakıldığında (dikkat etmesi gerektiğinde) bir mesaj kuyruğuna bir şey koymalarını sağlayın. Oyun döngüsünün her yinelemesinde kuyruğa bakar ve devam etmeden önce tüm mesajları çözer.


10

Bu yüzden uygulamadan geri adım atacağım ve soruyu tasarım açısından gözden geçireceğim. Bu simülasyonda yer almak istediğiniz tüm detayları görüntülemek için sağlam bir planınız var mı?

Örneğin:

  • Oyuncu, karnı boş bir hayvanla dolu hayvanı arasındaki farkı söyleyebilir mi?
  • Oyununuzda etkileşim seçimleri yaparken bu bilgi onlar için önemli mi?
  • Hayvanı izleyen bir oyuncu sürekli olarak sizin simüle ettiğiniz olayların sonucunu tahmin edebilir mi yoksa rastgele bir sayı yeterli mi?

Temel olarak genel kural, simülasyonunuzu çıktılarından daha karmaşık hale getirmemektir. Günün sonunda koyunlar için sahip olduğunuz tek canlandırma otlatırsa uyuyun, kaçın. Öyleyse, hangi devletin seçileceğine dair karara ne kadar faktör girdiği önemli değildir. Tüm oyuncular gece uyuyacak, tehlikeden kaçacak ve gündüz yiyecekleri koyun görecek.

Davranış simülasyonu üzerinde çalışmak için eğlenceli bir ton olmakla birlikte, her zaman son kullanıcıların akılda kalmasını sağlar.


Evet, oyuncu farkı anlatabilir ve bunun oyun üzerinde bir kaç etkisi olabilir, fakat şu an eğlenmek için daha fazla bir "hile". Cüce Hisarı'ndaki yara sistemi gibi, çok da ayrıntılı ama ihmal edilebilir. Ama daha önce de bahsettiğin gibi üzerinde çalışmak çok eğlenceli ve şu anda ana odak noktam bu.
Marc Müller

9

Birkaç yıl önce çalıştığım bir oyunda da benzer bir sorun yaşadım - nesnelerin simülasyonu karmaşıktı ve dünyadaki her nesne üzerinde gerçekten ayrıntılı bir şekilde gerçekleştirilemiyordu.

Çözüm, LOD konseptini simülasyonda kullanmaktı. Oyuncunun görünümündeki nesneler tam simülasyonu çalıştırır. Oyuncudan uzaktaki nesneler periyodik olarak oldukça basitleştirilmiş bir simülasyon kullandı. Nesneler oyuncunun görüşüne girdiğinde, rotadan, periyodik simülasyon güncellemesinden detaylı, düzenli güncellemelere geçecektir.


2

Bir zamanlamaya göre çözüm iyidir. Her işletmenin gelecekteki faaliyetlerine ilişkin bir işaretçiler listesine sahip olması gerektiğine dikkat edin; bu, gerektiğinde gelecekteki eylemleri geçersiz kılma imkanı sunar. Yani. uyku hayvanı saldırı anında anında uyanır, bu yüzden gelecekte uyanma hareketini geçersiz kılmalısın.


1

Bunun için bir tasarım deseni var. Bence buna veritabanı nesneleri denir mi?

Temel olarak, oyun dünyasındaki özel olmayan tüm koyunları temsil edebilen bir "şablon" koyunu tutarsınız, hepsini aynı şekilde çizer, benzersiz verileri şablon nesnesi içinde tutar, örneğin koyun yerleri ve / veya zaman çizelgesi olarak -Ne zamandan beri kesmeli. Daha sonra ne zaman bir koyunu benzersiz yapman gerekirse, o koyunu izlemek için belli bir örnek oluşturabilirsin.

Aynı animasyonlar için de geçerli. Her durum için ortak olan boş bir animasyon veya olaysa, daha belirli animasyonların ayrı ayrı programlanabileceği şablon örneğinde bulunabilir.

Uzun zaman önce, ana sahnesi tüm sahnede animate () adı verilen bir programlama yarışması için bir oyun yazdım. Boştaki animasyonları gerektiği gibi başkalarıyla değiştirmek için işlev işaretçilerinden yararlandı ve kalıtsal animasyonu desteklemek için bu tekniği kullandı (ör. Dönen bir disk üzerinde duran bir karakteri döndürme).

Bu, doğada animasyon için bir temsilci kullanmaya benzer.


3
Sineklik kalıbı demek istiyorsun?
topright

0

Bir devlet makinesi işe yarar mı? Hayvan örneğin uyku durumunda, yeme durumunda, koşu durumunda vb. Her eyalet için aktif organların bir listesini ilişkilendirirsiniz. Böylece, her bir hayvanı ziyaret ettiğiniz her bir çerçeve, durumu açın, o durum için organların aranmasını sağlayın ve her bir organ için güncelleme yapın.


Bunun işleri karmaşıklaştıracağını düşünüyorum çünkü hayvanda birden fazla şeyin gerçekleşmesi mümkün olmalı. Örneğin, midenin bir şeyi sindirmesi, kalbin atmayı ya da hayvanın yürümeyi bırakması anlamına gelmez. Elbette, her biri belirli işlevleri göz önüne alan bir dizi devlet tanımlayabilirsiniz, ancak devletlerin sayısı delicesine büyük olacaktır.
Marc Müller

Her eyalette birden fazla şey olabilir, çünkü tüm aktif organları bir eyalette saklar ve her birini her bir çerçevede uygularsınız. Simülasyonunuzda olanların çoğu, durum geçişlerine uygun gibi görünüyor. Örneğin Çiğneme -> Sindirim. Ama sanırım bir hayvanın sadece bir devlete sahip olamayacağı konusunda haklısın. Sindirim sisteminde gerçekleşen durum geçişleri ile ilgisi olmayan uzuvlarda söylenen devlet geçişleri var. Ama belki de sahip olduklarınızdan daha karmaşıktır. Düşünmemiz gereken bir şey olabileceğini düşündüm.
Erik Engheim
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.