Bir Varlık Sistemi Çerçevesinde Tilemaps?


12

Varlık Sistemi Çerçeveleri'ni özellikle Artemis'i okuyorum. Benim için doğru olup olmadığına karar vermeye çalışıyorum. Kesinlikle kiremit tabanlı 2d piksel sanat oyunları üzerinde çalışıyorum ve bu kadar yoğun kaynak olacağını düşünmüyorum. Geçmişte her zaman çok fazla kalıtımla standart OOP kullandım.

Varlık Sistemi Çerçevesi şu anda benim anlayışım (henüz tam olarak kavramadım emin değilim):

  • Varlıklar kimlik numaralarından başka bir şey değildir
  • Bileşenler, varlık bileşen havuzuna eklenen aptal verilerden başka bir şey değildir
  • Sistemler, Sistem bileşeni imzasıyla eşleşen her varlığı işlemek için dünyaya bağlı güncelleme işlevleridir

Anlayışım doğruysa, bu çerçeveye tilemaps ve AI Davranış Ağaçları eklemeyi kavramsallaştırmakta biraz sorun yaşıyorum. Gelecekte yapay zeka hakkında soracağım.

Bu çerçevede bir tilemap oluşturulmalı mı? Yoksa bir tilemap editörü ile oluşturmayı kolaylaştırmak için ayrı tutulmalı mı?

Tilemap bu çerçeveye dahil edilecekse, her bir karo farklı bir varlık mıdır? Ve bir sistem tilemap? Yoksa tilemap'in kendisi miras üzerine kurulmuş tek bir varlık mıdır?

Tilemap spate ise, dış tilemap karşı varlıkları tespit etmenin en iyi yolu ne olurdu?

Listelediğim birden fazla seçeneğin doğru olabileceğini anlıyorum, ancak geçmişte herhangi biri bunu yaptıysa, karışıklığımı biraz aydınlatabilir. Belki de düşünmediğim başka bir alternatif var mı?

Teşekkür ederim.


Tamamen rastgele bir not olan X / Y koordinatları da kimlik olarak çalışır. Varlık sisteminize uygulamanızı önermediğimden ziyade, fayanslarınıza bir varlık sisteminde olduğu gibi efektler ekleyebilirsiniz.
William Mariager

Hey, sadece Byte56'nın önerisini aktarıyoruz: bileşenlerin aptal veri sahipleri olması gerekmez. Bazen bu verileri gerçekten çalıştırabilmeleri yararlı olabilir; vektörler, örneğin.
jcora

Bu öneriyi de çok seviyorum. Tilemap yardımcılarını verilerden ayırmak zorunda kalmadan veya tilemap'ı birden çok bileşene / varlığa ayırmak zorunda kalmadan varlık çerçevesine tilemaps ekleyebilirim.
Spencer Marr

Tilemap sadece bir başka bileşendir ve çarpışma sistemi ve oluşturucu sistemi,
tilemap

Yanıtlar:


8

Bir süredir geliştirilmeden sonra varlık bileşeni çerçevesini (Artemis'e benzer şekilde) uyguladım, ancak boş bir sayfadan başlayarak işlerimi farklı yapardım diye düşünmüyorum.

Dünyamı varlık çerçevesinden tamamen ayırdım. Dünyayı bir tür varlık veya varlık koleksiyonuna dönüştürmek benim için anlamlı değildi. Benim dünyam küplerle 3D, ama aynı şey fayanslar için de geçerli. Varlıklar dünyadaki her şeyi oluşturur, ancak arazi ayrıdır. Ancak, küpler kaldırıldığında, "maddi" varlıkları ortaya çıkarırlar.

Çarpışma tespiti birbirine bağlanmak için çok zor değil. Dünyanızda muhtemelen isSolidAt(x,y)çarpışma sisteminizin kullanacağı tip yöntemleri olacaktır. Dürüstlük, bunu zaten bir kez farklı bir cevapta söyledim, sizin için en anlamlı olanı yapın. Döşeme haritasını ayrı yaparak veya bir varlık haline getirerek hiçbir kuralı ihlal etmiyorsunuz. Başını saran her şey en iyisi. Benim için bu dünyayı ayrı tutmak ve diğer herşeyi bir varlık haline getirmekti.


1
Haritamın Say olan bir varlık. Başka bir kuruluş haritanın isSolidAtyöntemine erişmeye nasıl başlayabilirdi ?
Gerardo Marset

Haritayı bir varlık olarak saklamak, muhtemelen bu durum için harika bir fikir değildir. Sanırım bu durumda onunla doğrudan iletişim kurmanız gerekiyor. Harita varlığından sorumlu sistem, harita varlığına erişebilir ve istendiğinde bu varlıktan bilgi alabilir.
MichaelHouse

4

Varlığa ayrı bir bileşen olarak tilemap ekledim (içindeki tüm karolar ile) ve karo haritası için ayrı bir oluşturucu da var, bu yüzden 3d veya 2d olarak işleyebilirim. Tüm karoları varlık olarak oluşturmak mümkün ama pahalı.

bunun gibi bir şey:


Entity e("map");
e.addComponent(new Tilemap("1.xml"));
e.addComponent(new TilemapRenderer2d(graphics));

tile map is something like that
class Tilemap
{
  array of tiles;
  getTileAtPosition(); 
  isWalkable ; etc;
}

class ITilemapRenderer
{}

class TilemapRenderer2d
{
draw() 
{ 
  foreach (tile in owner()->component()->tiles()) 
  {
    if (tile == ground) ground_sprite->draw() ....
  }
}

çizimi mantıktan ayırmanın faydası MVC modelinin temel fikridir


1
Tüm tilemap tek bir bileşen içinde mi yer alıyor? Bir tür oyun ortamı varlığına / ana varlığına bağlı mı? Oluşturucuyu tilemap bileşeninden ayırarak kazanılan oldukça büyük bir fayda görüyorum.
Spencer Marr

Cevabınızı güncellediğiniz için teşekkür ederiz! Kod parçacıklarını seviyorum.
Spencer Marr
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.