Ekonomiye dayalı bir oyunu kod olarak nasıl modellemeliyim?


10

Eski bir medeniyete dayanan bir ekonomi oyunu yaratmak istiyorum. Nasıl tasarlayacağından emin değilim. "Space Invaders" ın bir kopyası gibi daha küçük bir oyun üzerinde çalışsaydım, bunu şu şekilde yapılandırmakta sorun yaşamazdım:

  • Ana Kontrol Sınıfı
  • Grafik Sınıfı
  • Oyuncu Sınıfı
  • Düşman sınıfı

Ekonomi oyunum gibi daha büyük projeler için bunu nasıl yapacağımı anlamıyorum. Bir sürü kasaba içeren bir ülke sınıfı oluşturur muyum? Kasabalar çoğu bina sınıfı içeriyor mu, çoğu insan sınıfı içeriyor mu? Oyuncunun dolaşmak için erişebileceği bir yol bulma sınıfı yapabilir miyim?


3
Varlık Bileşeni Sisteminin bir türünü kullanmak isteyebilirsiniz (işte kanonik referans ) - varlıkların kendilerini hiç çizmemesini sağlamak (özellikle çok sayıda varsa).
ThorinII

9
Çoğu "büyük" oyunun ne kadar korkunç, dağınık ve saldırıya uğradığına çok şaşıracaksınız. Son teslim tarihleri ​​ve dönüm noktaları etrafında inşa edilmişlerdir. Sadece bir oyun yazın ve yazmanız gereken şey ne olursa olsun, hangi AAA oyunlarının çoğundan daha iyi olmasa da iyi olacak.
Sean Middleditch

Tam üflenmiş ECS gitmeseniz bile, kodu çoğaltmamak hala güzel, denetleyicinin varlıkları yinelemesine ve oluşturucuyu çağırmasına izin verin veya hatta oluşturucunun taramasına izin verin. 100 yerde küçük bir kod güncellemesi yapmak acı vericidir.
MickLH

1
Bence Space Invaders'dan karmaşık bir oyuna atlamak biraz zor. Büyük bir oyun projesine girmeden önce bu iki oyun arasında daha fazla öğrenme adımı vardır. 2D bir sidecroller platformu oluşturmayı ve oyunlarınızın karmaşıklığını kademeli olarak artırmayı düşünün. Birinci vitesten beşinci vitese geçmek sizi 120km / saate kadar sürebilir, ancak seviye atlayarak aynı verimlilikle (zaman / çaba) elde edemezsiniz.
Emir Lima

2
Burada iki sorunuz var ve hangisinin sizin için daha önemli olduğunu söyleyemem. Birincisi, nesnelere birçok referans göndermekten nasıl kaçınacağınız ve ikincisi, oyununuzdaki mantıksal varlıkların koddaki sınıflara eşlenmesine nasıl yaklaşmanız gerektiğiyle ilgilidir. Bu soruların farklı cevapları var ve bence onlar için ayrı sorular yayınlamalısınız. "Referansları geçmekten kaçınmak" bölümünü düzenleyeceğim. Yeniden yayınlamaktan çekinmeyin (ve yanıtlar çok benzer olduğu için bu sitede "tek tektonlardan ve küresellerden kaçınmak" konusunu aramayı da düşünebilirsiniz).

Yanıtlar:


5

Bir sürü kasaba içeren bir ülke sınıfı oluşturur muyum?

Elbette.

Kasabalar çoğu bina sınıfı içeriyor mu, çoğu insan sınıfı içeriyor mu?

Elbette.

Oyuncunun dolaşmak için erişebileceği bir yol bulma sınıfı yapabilir miyim?

Elbette.

Yukarıda önerdiğiniz her şey makul görünüyor. Uzun vadede sizin için en iyi yol olmayabilir, ama bu iyi. Sana ilk gelen organizasyon modeli olduğundan açıkçası bunu bilmek mantıklı. Bunu almanız ve bir uygulamaya başlamanız önemlidir. Hem başlamanıza, hem de bir görevin başlangıcında geliştiricileri rahatsız eden bu ilk "tasarım felci" nin üstesinden gelecektir ve (bir şekilde kusurlu olduğu kanıtlanırsa) size artıları ve eksileri hakkında bir iki şey öğretir bu özel tasarım yaklaşımının

Doğal olarak kafanızdaki kavramları aldınız ve bazı basit kurallara göre kod halinde gruplandırdınız:

  • Bu kavram davranışta veya sahip olduğum diğer nesnelerden elde edilen verilerde önemli ölçüde farklılık gösteriyor mu? (Ülkeler ve insanlar, eğer varsa, çok az anlamlı veri veya davranış paylaşırlar, bu nedenle oyun içinde farklı türlerle temsil edilmelidirler).
  • Koddaki bu kavramı önemli bir şekilde manipüle etmem gerekecek mi (oyununuz bireysel insanlarla ilgileniyorsa, bu Personsınıfa ihtiyacınız olabilir , ancak oyun sadece SimCity'nin önceki sürümlerinde olduğu gibi toplamda onları önemsiyorsa, bir kasabanın nüfusunun 1: 1 eşlemesini oluşturmak için bu türe veya bu tür örneklere ihtiyaç int populationCountduymayabilir. yeterli olabilir).
  • Bu kavram devlet gerektiriyor mu? Eğer öyleyse, bir şekilde serbest fonksiyonlardan ziyade bu durumu (bir sınıfı) saklamama izin veren bir şekilde kapsüllenmelidir. (Bir yol bulma uygulamasının benzer bir gerçek dünya nesnesi yoktur, ancak haritadaki hangi düğümlerin önceden düşündüğü ve bir sınıfta onu bir grupta saklamaktan daha iyi yapılması gibi verileri takip etmeyi gerektirir. gizli küreseller ve bağımsız işlevler yapma).

Basit olsa da, bu soruları cevaplamak, zihinsel bir kavramın kaynak koduna dönüştürülüp dönüştürülmeyeceğine ve nasıl dönüştürüleceğine karar verirken size büyük fayda sağlayabilir. Nesne yönelimli tasarımın SOLID ilkelerini de okumak isteyebilirsiniz .

Yorumlarda yapılan bir varlık / bileşen sisteminin önerisinin de geçerli bir yaklaşım olduğunu unutmayın, ancak projenizi daha küçük olacak şekilde yeniden kapsamlandırmadıkça (sadece bir projede iki yeni, büyük zorluk üstlenebileceği için) çok ürkütücü olmak ve aksi takdirde yalnızca bir taneye odaklanmaktan elde edeceğiniz eğitim faydasını seyreltebilir). Bileşene yönelik bir modelde, yukarıdaki sorulardaki "tür" daha örtük hale gelir: koddaki somut tür değil, bir varlığı oluşturan bileşenlerin toplanmasıyla tanımlanan örtük tür. Aynı yol gösterici ilkeler uygulanabilir.


1

Açıkladığınız şey (her ana mantıksal oyun nesnesi türü için bir sınıf) basit bir oyun için mükemmel bir mantıklı. Bu tür bir oyun ilk kez yazıyorsanız, bunu bu şekilde yapmanızı öneririm.

Sadece birkaç ipucu:

  • Bir Oyuncu bir Düşmandan gerçekten farklı mı? Birçok işlevsellik aynı olabilir, bu nedenle bunlar normalde aynı sınıfta olmalı veya aynı temel sınıftan genişletilmelidir. HumanPlayer ve AIPlayer olmak üzere iki alt sınıfa sahip bir AbstractPlayer temel sınıfını düşünün - tüm ortak işlevler AbstractPlayer'da kullanılabilir .
  • Nesneleri miras yerine kompozisyonla yapılandırmayı tercih edin . Kalıtım hiyerarşilerinizi çok derinleştirmeyin. Bir ForgeWithSteelAnvil sınıfını çağırmaya başlarsanız endişelenmelisiniz: Bir Forge , Binanın bir alt sınıfı olabilir , ancak kullanılan örs türü bina içinde bulunan bir nesne olmalıdır.
  • Aynı şekilde , yüzlerce farklı nesne sınıfı eklemek yerine nesneleri yapılandırmanızı sağlayan özellikleri tercih edin.

Daha karmaşık oyunlarda, orada kullanabileceğiniz daha gelişmiş teknikler vardır, ama öneririz değil temel NYP yaklaşımı ile çok rahat edene kadar (yani başarıyla tamamlandığını oyunların bir çift yaptık) bu kullanarak. Daha gelişmiş yaklaşımlar şunları içerebilir:

  • Prototip tabanlı nesne modelleri - tüm oyun nesneleri için tek bir sınıf kullanın ve tüm nesnelerinizi özellikler / nitelikler ve kompozisyon aracılığıyla modelleyin. Standart OOP'tan çok daha esnek / dinamik, ancak yönetilmesi daha zor (özellikle, aptalca bir şey yaparsanız derleyici size çok yardımcı olmaz). Bunu küçük Roguelike oyun Tyrant'ımda iyi etki için kullandım ( https://github.com/mikera/tyrant )
  • Varlık bileşen sistemleri - birçok farklı oyun nesnesinde karıştırmak ve eşleştirmek istediğiniz çok sayıda karmaşık davranışınız varsa iyi. Çok güçlü, ancak doğru olması zor.

0

Varlıklarınızı ve veri kümelerinizi düzenlemeye yaklaşmak için kullanabileceğiniz birkaç yöntem vardır. Bir elektronik tablo belgesi yazmayı ve verimli olduğumdan emin olmak için ileri geri hareket eden verileri test etmeyi tercih ediyorum. Eğer oyunu kendiniz yapıyorsanız, sizin için anlamlı olması gerektiğini hatırlayın. Bazen en verimli yol, projeyi daha basit hale getirmek için kodda biraz daha az verimli olmaktır.

İçeriğinizi yapılandırmayla ilgili daha fazla yardım almak isterseniz, benzer bir yapı veya stil kullanan eski bir oyun kaynak kodu bulun ve çözümlerini bulun. Sonra rafine edin ve beğeninize sabitleyin.


-1, kodun düzenlenmesi ve oyunun verdiği tasarım kararlarının geleneklerini anlamanın yollarını tartışmadan başka bir oyunun ne yaptığını körü körüne kopyalama önerisi gibi görünmüyor.
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.