Veriye dayalı animasyon durumları


14

DÜZENLEME: Sorumun tam olarak ne olduğunu açıklığa kavuşturmak için: bu, bir oyun motorundaki animasyonları / animasyon durumunu içerik oluşturma / yönetme konusuna bakmanın iyi bir yolu mu? Bu şekilde yapmanın kusurları nelerdir ve bunu yapmanın alternatif bir yolu ne olabilir? - Benim cevabım yorumlarda kısmen cevaplanmış olmasına rağmen, gitmenin yolu gibi görünüyor.

Bir 2D oyun motoru hobi projesinde animasyonları zor kodlamadan ele almaya çalışıyorum . Sert kodlama animasyon durumları benim için yaygın ama çok garip bir fenomen gibi görünüyor.

Küçük bir arka plan: Bileşenlerin veri torbaları ve alt sistemler üzerinde hareket ettiği bir varlık sistemi ile çalışıyorum. Animasyon durumlarını güncellemek için bir yoklama sistemi kullanmayı seçtim.

İle animasyon devletler Yani: "walking_left", "running_left", "walking_right", "çekim", ...

Animasyonları ele almak benim fikrim onu veri odaklı bir model olarak tasarlamaktı . Veriler bir xml dosyasında, bir rdbms'de saklanabilir ... Ve bir oyunun / seviye / ... başlangıcında yüklenebilir ... Bu şekilde, kodunuzu her yerde değiştirmek zorunda kalmadan animasyonları ve geçişleri kolayca düzenleyebilirsiniz. oyun.

Örnek olarak aklımdaki veri tanımlarının xml taslağını yaptım.

Çok önemli bir veri parçası , bir animasyonun açıklaması olacaktır . Bir animasyonun benzersiz bir kimliği (açıklayıcı bir ad) olur. Bir görüntüye referans kimliği tutacaktır (farklı animasyonlar farklı hareketli grafik sayfaları kullanabileceğinden, kullandığı hareketli grafik sayfası). Animasyonu çalıştırmak için saniyedeki kare sayısı. Buradaki "tekrar" animasyonu bir kez mi yoksa sonsuz olarak mı çalıştırılacağını tanımlar. Sonra dikdörtgenlerin bir listesini çerçeveler olarak tanımladım.

<animation id='WIZARD_WALK_LEFT'>
    <image id='WIZARD_WALKING' />
    <fps>50</fps>
    <replay>true</replay>
    <frames>
        <rectangle>
            <x>0</x>
            <y>0</y>
            <width>45</width>
            <height>45</height>
        </rectangle>
        <rectangle>
            <x>45</x>
            <y>0</y>
            <width>45</width>
            <height>45</height>
        </rectangle>
    </frames>
</animation>

Animasyon verileri bir animasyon kaynak havuzuna yüklenir ve tutulur ve onu kullanan oyun varlıkları tarafından referans verilir. Bir görüntü, bir ses, bir doku gibi bir kaynak olarak kabul edilirdi ...

Tanımlanacak ikinci veri parçası, animasyon durumlarını ve geçişlerini işlemek için bir durum makinesi olacaktır . Bu, bir oyun varlığının içinde bulunabileceği her durumu, geçiş yapabileceğini ve bu durumun neyi tetiklediğini tanımlar.

Bu durum makinesi kuruluştan kuruluşa farklılık gösterir. Çünkü bir kuş sadece “yürüyor” halini alırken bir kuşun “yürürken” ve “uçarken” devletleri olabilir. Bununla birlikte, farklı varlıklar tarafından paylaşılabilir, çünkü birden fazla insan muhtemelen aynı durumlara sahip olacaktır (özellikle canavarlar gibi bazı yaygın NPC'leri tanımladığınızda). Ayrıca, bir ork bir insanla aynı durumlara sahip olabilir. Sadece bu durum tanımının yalnızca belirli bir grup oyun varlığı tarafından paylaşılabileceğini göstermek için .

<state id='IDLE'>
  <event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
  <event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
  <event trigger='LEFT_UP' goto='IDLE' />
  <event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
  <event trigger='RIGHT_UP' goto='IDLE' />
  <event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>

Bu durumlar bir yoklama sistemi ile ele alınabilir . Her oyun, bir oyun varlığının mevcut durumunu alır ve tüm tetikleyicileri kontrol eder. Bir koşul karşılanırsa, kuruluşun durumu "git" durumuna geçer.

Mücadele ettiğim son bölüm, animasyon verilerinin ve animasyon durumlarının bir varlığa nasıl bağlanacağıydı . En mantıklı yaklaşım bana bir işletmenin kullandığı durum makinesi verilerine bir işaretçi eklemek ve o makinedeki her durum için hangi animasyonu kullandığını tanımlamak gibi görünüyordu.

Animasyon durumunu ve animasyon veri kimliğini ele alarak, bir oyunda bazı ortak varlıkların animasyon davranışını ve grafik gösterimini nasıl tanımlayacağımı gösteren bir xml örneği. Hem "sihirbaz" hem de "orc" öğelerinin aynı animasyon durumlarına ancak farklı bir animasyona sahip olduğunu unutmayın. Ayrıca, farklı bir animasyon farklı bir hareketli grafik sayfası veya hatta farklı bir animasyon dizisi anlamına gelebilir (bir animasyon daha uzun veya daha kısa olabilir).

<entity name="wizard">
    <state id="IDLE" animation="WIZARD_IDLE" />
    <state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>

<entity name="orc">
    <state id="IDLE" animation="ORC_IDLE" />
    <state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>

Varlık oluşturulurken, durum makinesi verileri ve animasyon verileri referansı olan bir durum listesi eklenir.

Gelecekte bileşenleri benzer bir xml formatında tanımlayarak tüm varlıkları oluşturmak için varlık sistemini kullanacağım.

-

Biraz araştırmadan sonra bulduğum şey bu. Ancak kafamı etrafında dolaşırken biraz sorun yaşadım, bu yüzden geri bildirim almayı umuyordum. Burada mantıklı olmayan bir şey var mı, yoksa bunları ele almanın daha iyi bir yolu var mı? Çerçeveler üzerinden yineleme fikrini kavradım, ancak bir adım daha ileri götürmekte sorun yaşıyorum ve bu benim bunu denemem.


1
Tetikleyicileri düşünmememe rağmen, animasyon verilerini depolamak için benzer bir fikir buldum. İşte bu konuda yazdığım kısa bir makale ve yazdığım bir XML projesine bağlantı veren ve XML'i tüketen ve şeylerin animasyon tarafını işleyen bir bağlantı . Kümeler ve Diziler kavramı gibi farklı olan birkaç şeyim var, ama bunun dışında bence yolunuzdasın.
John McDonald

2
Tasarımınız kötü değil (geçmişte inşa ettiğim benzer bir sistemin çizgileri boyunca değil), ama burada sorunuz tam olarak nedir? Bence bu daha açık olabilir.
MrCranky

@ John - Teşekkürler dostum, bu akşam ilerde bir göz atacağım. @ MrCranky - Pekala, çoğunlukla söylediklerin. Herhangi bir iyi ve muhtemelen daha yerleşik yöntemlere ipuçları / bağlantılar varsa. Buradaki deneyim açısından gerçekten karanlıktayım.
user8363

1
Bunu sağlanan bilgilerin derinliği için bir oylama yapmak istiyorum, ancak MrCranky'ye yankı vermek için, sorunun ne olduğunu gerçekten takip etmiyorum. Kendi kişisel tavsiye (birkaç hafta önce bu tür bir sistem inşa edilmiş olan spawns) nokta olduğunu söyleyebilirim.
Mike Cluck

@MikeC Bu sadece ihtiyacım olan cevap. Sorumla ilgili daha net olamadığım için özür dilerim. Belki de yerinde olmasaydım, daha çok bir soru gibi görünürdü :). Gerçek şu ki, animasyon durumlarıyla ilgilenen birçok kaynak bulamadım ve onu kodlayanlar bu yüzden içerik oluşturmak / değiştirmek bir kabus olurdu. Benim sorum şu: bu yaklaşım doğru mu değil mi? Ve eğer siz söylüyorsanız, o zaman bu iyi :).
user8363

Yanıtlar:


4

Animasyon klipleri en iyi ilk XML snippet'inizde yaptığınız gibi eski verilerle açıklanır. Bunu elle yapabilir veya bir sanat paketinden dışa aktarabilirsiniz. Her iki durumda da, muhtemelen XML gibi insan tarafından okunabilen bir ara formattan alan ve yüklemek güzel ve hızlı bir şey haline getiren bir boru hattı oluşturmak isteyeceksiniz.

Bir sonraki adım, şeyi gerçekleştirebilmektir. Bir tür sahne grafiği kullanıyorsanız, bunun için muhtemelen bir Anim Düğüm yapmak anlamına gelir. Anim düğüme, o anda hangi animasyonu oynattığını ve şu anda zaman çizelgesinde nerede olduğunu söyleyebilmelisiniz. Sınırlama kutusu bilgilerini bu düzeyde erişilebilir tuttuğunuzdan emin olun, böylece ayırma sisteminize kolayca besleyebilirsiniz.

Şimdi, bir animasyonu bir oyun varlığıyla ilişkilendirmek isteyeceksiniz. Bileşen tabanlı bir model kullanma eğilimindeyim, bu yüzden benim için bu ve AnimState bileşeni anlamına geliyor. Bu, oyun ve render arasındaki ara katınızdır. Bir varlığın hangi animasyonu oynadığını, oynatma modlarını (döngü, bir kez, pinpon, vb.), Zamanlamayı vb. . Etkin varlıklar için AnimStates, bir animasyon oynatıyorsa her sim işareti için bir kez güncellenir.

Bir animstate bileşeni muhtemelen basit oyun öğeleri için (temel arka plan sahne ve benzeri) yeterlidir, ancak daha karmaşık varlıklar için onu yönetmek için bir durum makinesi kullanmak isteyeceksiniz. Bu en iyi Lua veya Python gibi bir betik dilinde ifade edilir. Bir durumun birkaç işlevsel bloğu (onEnter, onExit, onUpdate, onEvent) ve belirli zamanlarda olması gereken belirli eylemleri ve tetikleyicileri belirten bir zaman çizelgesi olabilir. Muhtemelen bu durum makinelerini uygun şekilde güncellemekten ve zaman çizelgesi geri çağrılarını meydana geldiğinde tetiklemekten sorumlu olan bir tür yönetici sınıfınız olacaktır. Yazdığınız her OnUpdate varlık sayısı ile doğrusal bir maliyet olacağından, bunları mümkün olduğunca olay tabanlı tutmaya çalışmalısınız. Ayrıca etiketleri ('saldıran', 'boşta', 'ignoreinput' vb.) hem tüm eyaletlerle hem de belirli zaman dilimleriyle ilişkilendirilir. Ayrıca, yalnızca belirli bir durum için değil, tüm durum grafiğine uygulanan bazı üst düzey olay işleyicileri de isteyeceksiniz.

'Sentient' karakterleri muhtemelen bir çeşit yapay zekaya sahip olacak. Etrafta dolaşmayı başaran belirli bir 'lokomotor' bileşen yapma eğilimindeyim. Bir sinyaller ve olaylar sistemi kullanarak ve durum etiketleri için sorgulama yaparak durum grafiğiyle arayüz oluşturur ve "noktaya yürümek" veya "belirli bir hızda belirli bir yönde koşmak" söylenebilir. Daha yüksek düzey AI bileşenleri (bir davranış ağacı veya herhangi bir şey gibi), ayrıntılar hakkında endişelenmeden bu arayüzü kullanabilir.


1

Şimdiye kadar gördüğüm en iyi veri odaklı animasyon sistemi Blend Tree . Gerçekten, çok iyi ve burada istediğin her şeyi yapabilir. AIGameDev.com'a göre, artık sektördeki fiili standarttır ve haklı olduklarına inanıyorum.

Ne yazık ki hızlı bir googling için pek iyi bir kaynak bulundu, ancak deneyebileceğiniz bu ya o bir bakış elde etmek. Ayrıca AIGameDev.com'da ücretli bir makale var, premium hesap almaya değip değmeyeceğini bilmiyorum.


Bu çok iyi bir kaynak, teşekkürler. Böyle bir bilgi arıyorum.
user8363

1
Animasyonları ayrı ayrı sprite sayfalarıyla karıştırmak mümkün değildir, yalnızca sürekli iskelet animasyonu ile
AlexFoxGill
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.