घटक / इकाई-आधारित डिज़ाइन + व्यवहार पेड़ => कैसे एकीकृत करें?


9

अपनी वर्तमान परियोजना के लिए मैंने एक घटक / इकाई-आधारित प्रणाली को लागू किया , जो मूल रूप से अधिकांश सर्वोत्तम-अभ्यास का पालन करता है, बल्कि इस अपरिभाषित क्षेत्र में है

इसलिए मुझे (थोड़ी विस्तारित) इकाइयाँ मिलीं , जो मूल रूप से एक intआईडी हैं, एक मानव-पठनीय नाम, std::mapघटकों की और एक long"प्रकार सूचक" जिसका उपयोग यह दिखाने के लिए किया जाता है कि कौन से घटक मौजूद हैं (मेरे पास enumसभी घटकों के लिए दो की शक्ति है प्रकार और जब भी किसी घटक को इकाई में जोड़ा जाता है, तो मैं स्वचालित रूप से बिटवाइज़ ऑपरेशनों के माध्यम से उस समय को बदल देता हूं, इस उत्तर की तुलना करता हूं )।

फिर घटक होते हैं , बल्कि सरल भी होते हैं: intआईडी, enumघटक प्रकार के रूप में, माता-पिता इकाई सूचक और std::mapसभी गुणों में से एक यह घटक रखता है।

अंत में कुछ सिस्टम / प्रबंधक जो वास्तविक तर्क प्रसंस्करण को संभालते हैं। वे पहले जांचते हैं कि वर्तमान में संसाधित एंटिटी में एक मिलान long"टाइप इंडिकेटर" है = उस सिस्टम के लिए सभी आवश्यक घटक मौजूद हैं। इसके बाद जरूरत पड़ने पर कुछ संपत्तियों को एक्सेस करता है और या तो संबंधित घटक में कुछ फ़ंक्शन को सीधे कॉल करता है या कुछ संदेश भेजता है (एक संदेश डिस्पैचर के माध्यम से)।

निचला-रेखा: यहां तक, डेटा-संचालित दृष्टिकोण के साथ संयुक्त रूप से एक मानक मानक-संचालित घटक / इकाई-आधारित प्रणाली (तुलना, घटकों में हार्ड-कोडित डेटा चर नहीं है, लेकिन इसके बजाय एक जेनेरिक मानचित्र, कुछ (के रूप में) घटक हैं / घटकों के अभिलेखों को बाद में अतिरिक्त डेटा जोड़ने के विकल्प के साथ फाइलों से पढ़ा जाएगा, जो कि वास्तविक घटक कोड का हिस्सा नहीं है।

अब मैं उस परियोजना में व्यवहार पेड़ ( ऐगमेव बीटीएसके पर आधारित ) को भी पेश करना चाहूंगा , लेकिन मुझे यकीन नहीं है कि क्या और कैसे उन्हें पहले से मौजूद घटकों से जोड़ा जाना चाहिए या उन डिजाइनों को सामान्य रूप से कैसे एकीकृत किया जाए।

कई संबंधित विचार / बिंदु / प्रश्न दिमाग में आते हैं:

  1. मेरी बीटी को फाइलों से (फिर से) पढ़ा जाएगा। वर्तमान में मेरे पास यह देखने का एक कठिन समय है कि मैं BT Actionउस पेड़ के बीच संबंध कैसे बनाऊंगा और मेरे आवेदन में वास्तविक कोडिंग है। क्या मुझे बीटी फ़ाइलों में उपयोग किए जाने वाले एक्शन नामों और वास्तविक लॉजिक कार्यान्वयन के लिए फ़ंक्शन पॉइंटर के बीच किसी प्रकार का नक्शा बनाना चाहिए? इसे हल करने के लिए सामान्य दृष्टिकोण क्या है?

  2. मुझे लगता है कि मुझे अपने सभी विभिन्न Entityप्रकारों के लिए बीटीएस बनाना होगा (इसलिए प्रत्येक गेम-लॉजिक / एआई-प्रासंगिक घटकों के संयोजन के लिए जैसा कि मेरे कई बार लंबे "प्रकार संकेतक" द्वारा इंगित किया गया है)। इसके परिणामस्वरूप BT Actionघटकों में कार्यान्वयन को लागू करने का कोई मतलब नहीं है, क्योंकि ज्यादातर संभावना है कि कई घटक प्रति क्रिया में शामिल होंगे, क्या ऐसा होता है?

  3. तो क्या BT Actionतर्क को एक / कई अलग-अलग प्रणालियों में बैठना चाहिए (जिनके तरीकों से विचार # 1 अंक तक का नक्शा)? सिस्टम तब मेरे long"टाइप इंडिकेटर" की जांच करेगा कि क्या Entityबीटी की वर्तमान में जाँच की गई है और जिसे एक निश्चित कार्रवाई को निष्पादित करने के लिए कहा गया था (सिस्टम में विधि) वास्तव में ऐसा करने की अनुमति है (= आवश्यक घटक हैं)। लेकिन तब, यदि नहीं (क्योंकि उदाहरण के लिए बीटी निर्माता ने एक विशिष्ट स्थिति की अनदेखी की, जहां एक आवश्यक घटक रनटाइम में एंटिटी से जुड़ा नहीं हो सकता है), तो कुछ भी नहीं होगा।

प्रशन:

  • क्या उस तरह के एकीकरण के लिए सिद्ध अवधारणाएं हैं?
  • ऊपर मेरे 3 बिंदुओं पर आपका क्या लेना है?
  • सामान्य रूप से मेरे घटक / इकाई-आधारित डिज़ाइन के बारे में भी, कोई अन्य बातें जो मन में आती हैं?

बिंदु 1: व्यवहार पेड़ एक दृश्य डीएसएल से ज्यादा कुछ नहीं हैं जो ज्यादातर चरित्र व्यवहार बनाने के लिए उपयोग किए जाते हैं। BehaviorTree घटक एक स्क्रिप्ट घटक से कम या ज्यादा कुछ भी नहीं करना चाहिए। बिंदु 3: नियमित क्षेत्रों पर मानचित्र का उपयोग करने का क्या कारण है?
एरिक

# 1: इस संदर्भ में "डीएसएल" क्या है? # 3: क्षमा करें, लेकिन मैं इस पर आपका अनुसरण नहीं कर सकता। कृपया समझाने की परवाह करें कि आपका क्या मतलब है?
फिलिप अल्गैर

1
शायद डोमेन विशिष्ट भाषा, यानी। एक कस्टम सिंटैक्स एक बहुत विशिष्ट समस्या के साथ काम करने के लिए।
पैट्रिक ह्यूजेस

पैट्रिक सही है, हालांकि एक शब्दार्थ भी इसका हिस्सा है और इस परिभाषा से "बहुत" गिराया जा सकता है। - पुन: 3: मेरी क्षमा याचना, यह पढ़ना चाहिए: " घटकों में नियमित क्षेत्रों पर एक मानचित्र का उपयोग करने का कारण क्या है ?"
एरिक

पुन: 3: मैं बाद में C ++ कोड के बाहर अतिरिक्त गुणों को गतिशील रूप से निर्दिष्ट करने की क्षमता चाहता हूं (buzzword: data-संचालित)। सादगी के लिए मैंने (अभी के लिए कम से कम) सभी गुणों को इस जेनेरिक ढांचे (मानचित्रों का उपयोग करके) में रखा, यहां तक ​​कि उन जो कोड में ठीक हैं और इसलिए वास्तविक सी ++ फ़ील्ड हो सकते हैं। हो सकता है कि बाद में एक बिंदु पर, अगर यह एक प्रदर्शन मुद्दा बन जाता है ...
फिलिप Allgaier

जवाबों:


2

वर्तमान में मेरे पास यह देखने का एक कठिन समय है कि मैं उस पेड़ में बीटी एक्शन और अपने आवेदन में वास्तविक कोडिंग के बीच संबंध कैसे बनाऊंगा। क्या मुझे बीटी फाइलों में इस्तेमाल होने वाले एक्शन नामों और वास्तविक लॉजिक कार्यान्वयन के लिए फ़ंक्शन पॉइंटर के बीच किसी प्रकार का नक्शा बनाना चाहिए? इसे हल करने के लिए सामान्य दृष्टिकोण क्या है?

फ़ंक्शन पॉइंटर्स के बारे में भूल जाएं और ऑब्जेक्ट्स के बारे में सोचें। व्यवहार ट्री में प्रत्येक नोड (इस बिंदु से बीटी) आदर्श रूप से आपके कोड में एक ऑब्जेक्ट के अनुरूप होगा। उन वस्तुओं में एक मानक इंटरफ़ेस होगा जो आपको उन्हें एक पेड़ के रूप में व्यवस्थित करने और उन्हें ट्रैवर्स करने के लिए देगा। फ़ंक्शन पॉइंटर्स का एक सेट व्यवहार के लिए ठीक है, लेकिन यह आपके पेड़ की संरचना पर बिल्कुल कब्जा नहीं करता है।

परिणामस्वरूप बीटी एक्शन क्रियान्वयन को कलपुर्जों में डालने का कोई मतलब नहीं है, क्योंकि प्रति क्रिया में कई घटक शामिल होंगे, क्या ऐसा होता है?

मुझे उम्मीद है कि संस्थाओं के पास एक एकल व्यवहार घटक होगा जो उस इकाई के बीटी के लिए प्रासंगिक डेटा संग्रहीत करता है। बीटी का निष्पादन या तो बीटी घटक या बीटी सबसिस्टम द्वारा किया जाता है, इस पर निर्भर करता है कि आप अपने सिस्टम में घटकों को कैसे संभालते हैं। घटकों का उपयोग करते हुए बहुत कुछ के साथ, उन्हें काम करने के लिए अन्य घटकों का उल्लेख करना होगा, लेकिन उन अन्य घटकों को बीटी के बारे में कुछ भी नहीं जानना होगा।

उपलब्ध विभिन्न कार्य सरलतम स्तर पर, विभिन्न बीटी नोड वस्तुओं में एन्कोड किए जाएंगे। उन्हें आवश्यक रूप से घटकों में हेरफेर करके संबंधित इकाई अधिनियम बनाने में सक्षम होना चाहिए, जैसे। स्थानांतरित करने के लिए आंदोलन घटक का उपयोग।


अनुच्छेद # 1: हां, बीटी अपने आप में एक वस्तु होगी (जैसा कि मैंने ऐगमडेव से संस्करण की तरह कहा है)। मैं केवल क्रियाओं के लिए स्वयं के बारे में सोच रहा था, लेकिन आपके अनुच्छेद # 2 ने इसे बदल दिया। किसी कारण से यह वास्तव में सरल दृष्टिकोण मेरे साथ नहीं हुआ (इकाई का अपना बीटी सदस्य उदाहरण है)। संभवतः पूरे नए घटक की वजह से, मैं अब सीधे और सरल नहीं सोचता था, इसलिए मैं बीटी सामान के साथ घटकों को मिश्रण करने का एक तरीका ढूंढ रहा था, लेकिन वास्तव में इसकी आवश्यकता नहीं है।
फिलिप अल्गैयर

मुख्य बात जो मुझे पहले से खो गई थी, वह इकाई के साथ कार्रवाई को कैसे जोड़ना था। अब यह स्पष्ट है: क्रियाएँ जानती हैं कि कौन सी संस्था अपने पेड़ के माध्यम से जो बदले में उस इकाई को जानती है जिससे वह संबंधित है।
फिलिप अल्गैयर

@Philip Allgaier मैं उत्सुक हूं, आपने बीटी नोड कैसे बनाया? क्या आपने इसे 1 व्यवहार नोड = 1 इकाई के रूप में बनाया (जो कि 1 गेम ऑब्जेक्ट के अनुसार बहुत सारी इकाइयाँ होंगी), या नोड को एक सामान्य वर्ग (ईसीएस संबंधित नहीं) के रूप में बनाएँ, या अन्य दृष्टिकोणों का उपयोग करें? धन्यवाद!
cppBeginner
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.