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.