UI कोड से भौतिकी और गेम तर्क को अलग करना


12

मैं एक साधारण ब्लॉक-आधारित पहेली गेम पर काम कर रहा हूं।

खेल खेल में खेल क्षेत्र के चारों ओर बहुत सारे ब्लॉक होते हैं, इसलिए यह एक तुच्छ भौतिकी सिमुलेशन है। मेरा कार्यान्वयन, हालांकि, आदर्श से दूर मेरी राय में है और मैं सोच रहा हूं कि क्या आप मुझे इसे बेहतर करने के लिए कोई संकेत दे सकते हैं।

मैंने कोड को दो क्षेत्रों में विभाजित किया है: गेम लॉजिक और UI, जैसा कि मैंने बहुत सारे पहेली गेमों के साथ किया है:

  • खेल तर्क खेल के सामान्य नियमों (जैसे शतरंज में औपचारिक नियम प्रणाली) के लिए जिम्मेदार है
  • यूआई खेल क्षेत्र और टुकड़ों (जैसे शतरंज बोर्ड और टुकड़े) को प्रदर्शित करता है और एनिमेशन के लिए ज़िम्मेदार है (उदाहरण के लिए शतरंज के टुकड़ों का एनिमेटेड आंदोलन)

खेल तर्क एक तार्किक ग्रिड के रूप में खेल राज्य का प्रतिनिधित्व करता है, जहां प्रत्येक इकाई ग्रिड पर एक सेल की चौड़ाई / ऊंचाई है। चौड़ाई 6 के ग्रिड के लिए, आप चौड़ाई के एक ब्लॉक को 2 चार बार घुमा सकते हैं जब तक कि यह सीमा से टकरा न जाए।

यूआई इस ग्रिड को लेता है, और तार्किक आकारों को पिक्सेल आकारों में परिवर्तित करके खींचता है (अर्थात, इसे स्थिर करके गुणा करता है)। हालाँकि, चूंकि गेम में शायद ही कोई गेम लॉजिक है, मेरे गेम लॉजिक लेयर [1] में टक्कर का पता लगाने के अलावा बहुत कुछ नहीं है। यहां देखिए यह कैसे काम करता है:

  1. खिलाड़ी एक टुकड़ा खींचना शुरू कर देता है
  2. यूआई उस टुकड़े के कानूनी आंदोलन क्षेत्र के लिए खेल तर्क पूछता है और खिलाड़ी को उस क्षेत्र के भीतर खींचने देता है
  3. खिलाड़ी एक टुकड़ा जाने देता है
  4. UI टुकड़ा को ग्रिड पर भेजता है (ताकि यह एक वैध तार्किक स्थिति में हो)
  5. यूआई गेम लॉजिक को नई तार्किक स्थिति बताता है (उत्परिवर्ती तरीकों के माध्यम से, जिससे मैं बचूंगा)

मैं इससे बहुत खुश नहीं हूँ:

  • मैं अपने गेम लॉजिक लेयर के लिए यूनिट टेस्ट लिख रहा हूं, लेकिन यूआई नहीं, और यह यूआई में सभी पेचीदा कोड है: टुकड़े को दूसरों या सीमा से टकराने से रोकना और इसे ग्रिड पर स्नैप करना।
  • मुझे यह पसंद नहीं है कि यूआई नए राज्य के बारे में गेम लॉजिक बताता है, बल्कि मैं इसे movePieceLeft()अपने अन्य गेम की तरह एक विधि या ऐसा कुछ कहूंगा , लेकिन मैं उस दृष्टिकोण से दूर नहीं हुआ, क्योंकि गेम तर्क यूआई में संभव है कि खींच और तड़क के बारे में कुछ भी नहीं जानता है।

मुझे लगता है कि मेरे खेल तर्क परत से छुटकारा पाने और इसके बजाय भौतिकी परत को लागू करने के लिए सबसे अच्छी बात होगी। मुझे उससे संबंधित कुछ प्रश्न मिले हैं:

  1. क्या इस तरह की भौतिकी परत आम है, या खेल तर्क परत ऐसा करने के लिए यह अधिक विशिष्ट है?
  2. ग्रिड और पीस ड्रैगिंग कोड के लिए स्नैपिंग UI या भौतिकी परत से संबंधित होगा?
  3. क्या ऐसी भौतिकी परत आमतौर पर पिक्सेल आकार या किसी प्रकार की तार्किक इकाई के साथ काम करती है, जैसे कि मेरा गेम लॉजिक परत?
  4. मैंने एक गेम के कोड बेस में इवेंट-आधारित टकराव का पता लगा लिया है, यानी खिलाड़ी सिर्फ टुकड़ा खींचेगा, यूआई उस आज्ञाकारी को प्रस्तुत करेगा और भौतिकी प्रणाली को सूचित करेगा, और भौतिकी प्रणाली ऑनकॉलिशन () विधि को कॉल करेगी। एक बार टक्कर का पता लगने पर टुकड़े पर। क्या अधिक आम है? यह दृष्टिकोण या पहले कानूनी आंदोलन क्षेत्र के लिए पूछना?

[१] परत का मतलब शायद मेरे लिए सही शब्द नहीं है, लेकिन सबसिस्टम लगता है कि ओवरब्लाउन है और क्लास गुमराह कर रही है, क्योंकि प्रत्येक परत में कई कक्षाएं शामिल हो सकती हैं।


क्या मेरे जवाब से मदद मिली, कोई और जानकारी चाहिए?
विल मार्कॉइलर

कृपया, या तो उत्तर दें और उत्तर स्वीकार करें अगर इससे मदद मिली है या इस तरह की वास्तुकला या कुछ और को लागू करने में आपकी समस्याओं के बारे में बताएं, लेकिन हमें अपनी स्थिति के बारे में सूचित रखें ताकि हम बेहतर सहायता कर सकें। =)
मार्कॉइलर

जवाबों:


3

मैं इस सवाल का जवाब देने की कोशिश करूंगा क्योंकि मैं समझ सकता हूं कि आप क्या पूछ रहे हैं, हालांकि मेरे पास अभी तक केवल सीखने के लिए बहुत खेल विकास का अनुभव नहीं है।

जैसा कि मैंने इसे देखा है, तो आप अपने खेल तर्क और डोमेन ऑब्जेक्ट्स, यानी पहेली टुकड़ों से GUI कोड को अलग करने के लिए। ये वास्तव में तीन अलग-अलग परतें हैं - और हां, layerमेरी राय में एक उपयुक्त शब्द है। यह अक्सर एक सिस्टम के प्रत्येक ऑब्जेक्ट स्तर को सबसिस्टम में अलग करने की अवधारणाओं को समझाने के लिए उपयोग किया जाता है जो एक दूसरे से स्वतंत्र होते हैं।

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के संबंध में, प्रत्येक ऑब्जेक्ट एक वर्ग होगा। तो, आपकी पहेली के प्रत्येक टुकड़े में एक वर्ग प्रति ही होगा, और इसलिए खेल बोर्ड। गेम बोर्ड में अपने आकार और चालन क्षमता के आधार पर पहेली के एक्स टुकड़े होने चाहिए जो आप खिलाड़ी को देना चाहते हैं।

इसलिए, इस विषय पर मेरे विचार हैं - मुझे उम्मीद है कि इससे मदद मिलेगी:

  1. जीयूआई परत: इस परत में गेम बोर्ड पर टुकड़ों को केवल खेल और खिलाड़ी के बीच बातचीत की अनुमति के लिए प्रदर्शित करने के तरीके होंगे;
  2. गेम कंट्रोलर लेयर: खिलाड़ी के इनपुट के लिए जिम्मेदार है। यह वह परत है जिसे अलग-अलग दिशाओं में स्थानांतरित करने के लिए एक टुकड़ा बताना चाहिए, और गेम बोर्ड से पूछें कि क्या आंदोलन और इतने पर टकराव होंगे;
  3. व्यावसायिक परत: इस परत में आपके सभी व्यावसायिक वर्ग, यानी आपके खेल के टुकड़े और गेम बोर्ड ऑब्जेक्ट शामिल होंगे, जिसमें पहेली के टुकड़े शामिल हैं।

इस वास्तुकला में, आपके पास जीयूआई परत खेल राज्य के खिलाड़ी, पहेली के प्रत्येक टुकड़े का स्थान दिखाएगा। जीयूआई परत तब खिलाड़ी इनपुट प्राप्त करने के लिए ज़िम्मेदार होगी और इसे एक अंतर्निहित गेम कंट्रोलर लेयर के पास भेजा जाएगा, जो तब टकराव का पता लगाने के लिए जिम्मेदार होगा। यदि कोई नहीं है, तो टुकड़ा को उस इनपुट दिशा में स्थानांतरित करने का आदेश दिया जा सकता है। ऐसा करने के लिए, आपको बस इस टुकड़े को कॉल करना होगा MoveLeft;MoveRight, आदि टुकड़े को स्थानांतरित करने के तरीके। आप गेम बोर्ड को यह बता सकते हैं कि आप किस टुकड़े को स्थानांतरित करना चाहते हैं, और फिर यह अपने आप ही उस टुकड़े के चलने का आदेश देता है, और फिर टुकड़ा मांग की दिशा में चला जाता है। यह वास्तुकला विभिन्न परतों में कोड के प्रत्येक टुकड़े का परीक्षण करना आसान बनाता है, और फिर आपको इकाई परीक्षण, एकीकरण परीक्षण और कार्यात्मक परीक्षण के लिए अनुमति देता है।

मुझे पता है कि यह देखने के लिए थोड़ा भ्रमित कर सकता है, और अगर यह नहीं है तो भगवान का शुक्र है! क्या आपको आगे के विवरणों और सहायता की आवश्यकता है, कृपया बेझिझक पूछें, मुझे सबसे अच्छी मदद करने में खुशी होगी, हालांकि मैं खेल के विकास में एक शुरुआती हूं।

पढ़ने के लिए धन्यवाद! =)


2
जो कि मॉडल व्यू कंट्रोलर से बहुत मिलता जुलता है।
दसवें

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

मुझे आश्चर्य है कि यहाँ क्या इतना जटिल है, क्योंकि हम एक सीमांकित गेम बोर्ड पर एक पहेली के टुकड़े ले जा रहे हैं। नियंत्रणों को जीयूआई से प्राप्त किया जाता है, जो वास्तव में एक अच्छा तरीका है, और एक अमूर्त परत के लिए बाहर निकलता है, अर्थात, गेम कंट्रोलर। गेम कंट्रोलर आंदोलन पर टकरावों की जांच करता है, फिर टुकड़े को स्थानांतरित करने के लिए कहता है यदि कोई टक्कर का पता नहीं चला। पहेली का टुकड़ा फिर अनुरोधित दिशा की ओर ठीक से चलता है और अपनी Positionसंपत्ति पाने वाले फ़ंक्शन के माध्यम से अपनी नई स्थिति को प्रकट करता है, ताकि गेम कंट्रोलर को अब उस नए स्थान पर इस स्थानांतरित टुकड़े को प्रदर्शित करने के लिए जीयूआई की आवश्यकता हो।
बजे विल मार्कॉइलर

हे, मैंने कुछ महीने पहले खेल विकास में "एमवीसी" के बारे में ब्लॉग किया था। हाँ, यह खेल के विकास के साथ उन लोगों के लिए एक अच्छा प्रवेश द्वार की अवधारणा है: codecube.net/2010/08/xna-for-the-everyday-developer
जोएल मार्टिनेज

1
देर से स्वीकार करने के लिए क्षमा करें, मैं दुर्भाग्य से थोड़ी देर के लिए परियोजना से विचलित हो गया था। मुझे वास्तव में नियंत्रक दृष्टिकोण पसंद है, मैं इसे अपनाऊंगा!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.