यह उत्तर देने के लिए एक कठिन प्रश्न है क्योंकि सभी का अपना विचार है कि कैसे एक इकाई घटक प्रणाली को संरचित किया जाना चाहिए। जो सबसे अच्छा मैं कर सकता हूं, वह आपके साथ साझा की गई कुछ चीजें हैं जो मेरे लिए सबसे उपयोगी हैं।
सत्ता
मैं ईसीएस के लिए वसा-वर्ग दृष्टिकोण लेता हूं, शायद इसलिए कि मैं अत्यधिक अक्षम (मानव उत्पादकता के मामले में) प्रोग्रामिंग के चरम तरीके खोजता हूं। उस अंत तक, मेरे लिए एक इकाई एक विशिष्ट वर्ग है जिसे अधिक विशिष्ट वर्गों द्वारा विरासत में मिला है। इकाई में कई आभासी गुण हैं और एक साधारण ध्वज है जो मुझे बताता है कि इस इकाई का अस्तित्व होना चाहिए या नहीं। एक रेंडर सिस्टम के बारे में आपके सवाल के सापेक्ष, यह वही है जो Entity
दिखता है:
public abstract class Entity {
public bool IsAlive = true;
public virtual SpatialComponent Spatial { get; set; }
public virtual ImageComponent Image { get; set; }
public virtual AnimationComponent Animation { get; set; }
public virtual InputComponent Input { get; set; }
}
अवयव
घटक "मूर्ख" हैं कि वे कुछ भी नहीं करते हैं या जानते हैं । उनके पास अन्य घटकों का कोई संदर्भ नहीं है, और उनके पास आम तौर पर कोई कार्य नहीं होता है (मैं सी # में काम करता हूं, इसलिए मैं गेटर्स / सेटर को संभालने के लिए गुणों का उपयोग करता हूं - यदि उनके पास फ़ंक्शन हैं, तो वे उस डेटा को प्राप्त करने के आसपास आधारित हैं जो वे रखते हैं)।
सिस्टम
सिस्टम कम "बेवकूफ" हैं, लेकिन अभी भी गूंगा ऑटोमैटोन हैं। उनके पास समग्र प्रणाली का कोई संदर्भ नहीं है, अन्य प्रणालियों का कोई संदर्भ नहीं है और कुछ बफ़र्स को छोड़कर कोई डेटा नहीं रखता है कि उन्हें अपनी व्यक्तिगत प्रसंस्करण करने की आवश्यकता हो सकती है। सिस्टम के आधार पर, यह एक विशेष Update
, या Draw
विधि, या कुछ मामलों में दोनों हो सकता है।
इंटरफेस
मेरे सिस्टम में इंटरफेस एक महत्वपूर्ण संरचना है। वे क्या परिभाषित करने के लिए उपयोग किया जाता हैSystem
प्रक्रिया हो सकती है, और क्या एक Entity
सक्षम है। प्रतिपादन के लिए प्रासंगिक इंटरफेस हैं: IRenderable
और IAnimatable
।
इंटरफेस बस उस सिस्टम को बताते हैं जो घटक उपलब्ध हैं। उदाहरण के लिए, रेंडरिंग सिस्टम को इकाई के बाउंडिंग बॉक्स और ड्रॉ करने के लिए छवि को जानना होगा। मेरे मामले में, यह वही होगाSpatialComponent
और होगा ImageComponent
। तो यह इस तरह दिखता है:
public interface IRenderable {
SpatialComponent Component { get; }
ImageComponent Image { get; }
}
RenderingSystem
तो रेंडरिंग सिस्टम एक इकाई कैसे तैयार करता है? यह वास्तव में काफी सरल है, इसलिए मैं आपको सिर्फ एक विचार देने के लिए छीन लिया गया वर्ग दिखाऊंगा:
public class RenderSystem {
private SpriteBatch batch;
public RenderSystem(SpriteBatch batch) {
this.batch = batch;
}
public void Draw(List<IRenderable> list) {
foreach(IRenderable obj in list) {
this.batch.draw(
obj.Image.Texture,
obj.Spatial.Position,
obj.Image.Source,
Color.White);
}
}
}
कक्षा को देखते हुए, रेंडर सिस्टम को यह भी पता नहीं है कि क्या है Entity
है। इसके बारे में सभी जानते हैं IRenderable
और इसे आकर्षित करने के लिए बस एक सूची दी गई है।
यह सब कैसे काम करता है
यह समझने में भी मदद मिल सकती है कि मैं नई गेम ऑब्जेक्ट कैसे बना सकता हूं और सिस्टम को कैसे खिलाऊंगा।
संस्थाओं का निर्माण
सभी गेम ऑब्जेक्ट्स को इकाई से विरासत में मिला है, और कोई भी लागू इंटरफेस जो यह बताता है कि गेम ऑब्जेक्ट क्या कर सकता है। बस स्क्रीन पर एनिमेटेड के बारे में सब कुछ इस तरह दिखता है:
public class MyAnimatedWidget : Entity, IRenderable, IAnimatable {}
सिस्टम को खिलाना
मैं उन सभी संस्थाओं की सूची रखता हूं, जिन्हें खेल की दुनिया में एकल सूची में कहा जाता है List<Entity> gameObjects
। प्रत्येक फ्रेम, मैं फिर उस सूची के माध्यम से झारना और इंटरफ़ेस प्रकार के आधार पर अधिक सूचियों के लिए ऑब्जेक्ट संदर्भ की प्रतिलिपि बनाता हूं, जैसे कि List<IRenderable> renderableObjects
, और List<IAnimatable> animatableObjects
। इस तरह, यदि विभिन्न प्रणालियों को एक ही इकाई को संसाधित करने की आवश्यकता होती है, तो वे कर सकते हैं। फिर मैं उन सूचियों को सिस्टम Update
या Draw
विधियों में से हर एक को सौंपता हूं और सिस्टम को अपना काम करने देता हूं।
एनीमेशन
आप उत्सुक हो सकते हैं कि एनीमेशन सिस्टम कैसे काम करता है। मेरे मामले में आप IAnimatable इंटरफ़ेस देखना चाहते हैं:
public interface IAnimatable {
public AnimationComponent Animation { get; }
public ImageComponent Image { get; set; }
}
यहां ध्यान देने योग्य बात यह है ImageComponent
कि IAnimatable
इंटरफ़ेस का पहलू केवल-पढ़ने के लिए नहीं है; इसका एक सेटर है ।
जैसा कि आप अनुमान लगा सकते हैं, एनीमेशन घटक सिर्फ एनीमेशन के बारे में डेटा रखता है; फ़्रेम की एक सूची (जो छवि घटक हैं), वर्तमान फ्रेम, प्रति सेकंड फ़्रेम की संख्या खींची जाने वाली, अंतिम फ्रेम वृद्धि के बाद बीता हुआ समय और अन्य विकल्प।
एनिमेशन सिस्टम रेंडरिंग सिस्टम और इमेज कंपोनेंट रिलेशनशिप का फायदा उठाता है। यह बस इकाई के छवि घटक को बदलता है क्योंकि यह एनीमेशन के फ्रेम को बढ़ाता है। इस तरह, एनीमेशन को अप्रत्यक्ष रूप से रेंडरिंग सिस्टम द्वारा प्रस्तुत किया जाता है।