सममितीय टकराव का पता लगाने


11

मैं दो सममितीय टाइल की टक्कर का पता लगाने की कोशिश कर रहा हूँ।

मैंने टाइल पर प्रत्येक बिंदु के बीच की रेखाओं को प्लॉट करने की कोशिश की है और फिर लाइन इंटरसेप्ट्स के लिए जाँच की है जो कि काम नहीं किया (शायद गलत फॉर्मूले के कारण)

आज थोड़ी देर के लिए इस पर गौर करने के बाद मुझे विश्वास है कि मैं इसमें बहुत सोच रहा हूं और एक आसान तरीका होना चाहिए।

मैं ओवरलैप का पता लगाने के लिए सबसे अच्छे तरीके से सिर्फ कुछ सलाह कोड की तलाश नहीं कर रहा हूं


4
वास्तव में आप क्या करने की कोशिश कर रहे हैं? पता लगाएँ कि जब माउस एक टाइल के ऊपर है, या यह पता लगाने पर कि क्या दो इकाइयाँ ओवरलैप हो रही हैं? यदि यह बाद में है, तो आपको वास्तव में अपने "गेम" को "ग्राफिक्स" से अलग करने के बारे में सोचना चाहिए
जॉन मैकडॉनल्ड्स

मुझे इसे बनाने की ज़रूरत है जब एक चलती आइसो-टाइल का पक्ष एक गैर-चलती टाइल को हिट करता है जो चलती टाइल बंद हो जाती है। केवल एक चीज जिससे मुझे परेशानी हो रही है वह है टकराव के लिए परीक्षण। मैं एक बाउंड बॉक्स का उपयोग कर सकता था, लेकिन मुझे सटीक होने के लिए टक्कर की आवश्यकता है।
क्रिस क्रू

जवाबों:


23

मैं सीधे बाहर आऊंगा और कहूँगा कि मुझे नहीं पता कि आप इस समस्या का समाधान कैसे कर सकते हैं जो आपने प्रश्न में वर्णित है (आइसो-टाइल के आकार के आयतों के बीच टकराव का पता लगाना), लेकिन मैं आपको बता सकता हूं कि दूसरों ने इसे अतीत में कैसे हल किया है :

जिस तरह से यह अन्य खेलों में किया जाता है वह खेल की दुनिया को स्क्रीन की दुनिया से अलग करना है । जब आप शुरुआत कर रहे होते हैं, तो उन्हें एक ही चीज़ होने की कल्पना करना आम बात है, लेकिन फिर यह उन समस्याओं की ओर ले जाता है, जिनका आप वर्णन कर रहे हैं।

सामान्य विचार यह है कि खेल की दुनिया को पूरी तरह से स्मृति में संग्रहीत किया जाता है, पर्दे के पीछे, यह सिर्फ संख्या, संदर्भ और तर्क है। तथ्य यह है कि आप आइसोमेट्री में खेल की दुनिया को आकर्षित कर रहे हैं अप्रासंगिक है। आपके गेम की दुनिया में आइसोमेट्रिक, या वर्गाकार की अवधारणा नहीं होनी चाहिए, या भले ही स्क्रीन को 3 डी के रूप में आकर्षित किया जा रहा हो। जब आप खेल की दुनिया को स्क्रीन (उर्फ स्क्रीन की दुनिया ) पर आकर्षित करते हैं, तो इस बात का ध्यान रखा जाता है । गेम की दुनिया को सबसे सरल तरीके से संग्रहीत और रखरखाव किया जाना चाहिए जो गेम के लिए, आइसोमेट्रिक गेम्स के लिए समझ में आता है, आप आमतौर पर इस तथ्य को पूरी तरह से अनदेखा करते हैं कि यह आइसो है और इसके बजाय पदों को स्टोर करें जैसे कि आप एक अक्ष-संरेखित ग्रिड का उपयोग कर रहे थे। अधिकांश खेलों में दो दुनियाओं के बीच समन्वय को परिवर्तित करने की विधियाँ होंगी, जिन्हें मैं कहता हूं ScreenToWorld(x, y)औरWorldToScreen(x, y)। रूपांतरण अक्सर मैट्रिक्स गणित के साथ किया जाता है, लेकिन अन्य तरीकों से हासिल किया जा सकता है। जब आप माउस का उपयोग करेंगे, तब आप स्क्रीनट्वर्ड का उपयोग करेंगे और जब आप ड्रा करेंगे तो वर्ल्डटॉक्स को।

गेम की दुनिया और स्क्रीन की दुनिया को विभाजित करने के कई फायदे हैं । एक लाभ यह है कि टक्कर का पता लगाने और आंदोलन सभी खेल की दुनिया में होता है, और इसलिए आमतौर पर काफी सीधे आगे होता है क्योंकि आप एक slanted ग्रिड, या तिरछे निर्देशांक के साथ काम नहीं कर रहे हैं, या जहां स्क्रीन है, आदि आपके मामले में। , आप अक्ष-संरेखित आयतों और वर्गों के साथ काम करेंगे। एक बार खेल की दुनिया को अपडेट कर दिया गया है, तो आप स्क्रीन, कीवर्ड: प्रतिनिधित्व के लिए खेल की दुनिया का प्रतिनिधित्व करते हैं। यह पहली बार में सहज ज्ञान युक्त लग सकता है, लेकिन आपकी स्क्रीन केवल इस बात का प्रतिनिधित्व करती है कि खेल की दुनिया में क्या चल रहा है। यह समर्पित सर्वर और टर्मिनल जैसे क्लाइंट को संभव बनाता है।

FreeCiv वास्तव में इन सभी चीजों का एक बड़ा उदाहरण है। आप किसी भी एक के रूप में एक ही सटीक दुनिया देख सकते हैं: एक वर्ग उत्तर / दक्षिण ग्रिड, आइसोमेट्रिक या हेक्स। आपके द्वारा चलाए जाने वाले प्रत्येक गेम में बैकग्राउंड में एक समर्पित सर्वर चलता है, यहां तक ​​कि सिंगल-प्लेयर गेम्स के लिए भी, इसलिए क्लाइंट भी सिर्फ एक डिस्प्ले पोर्ट है, इससे ज्यादा कुछ नहीं।

लंबी कहानी छोटी: खेल की दुनिया और तर्क को स्क्रीन की दुनिया से अलग करना खेल तर्क को सरल करता है, खेल को कम करता है <-> प्रदर्शन युग्मन , और बदले में, "आइसो" टाइलों के बीच टकराव का पता लगाना आसान और संभालना आसान है।


अच्छी तरह से समझाए गए उत्तर के लिए धन्यवाद, मैं लॉजिक को अलग कर रहा था कि व्हाट्सएप क्या है और बैकग्राउंड में क्या हो रहा है लेकिन मैं सब कुछ एक स्लेटेड ग्रिड के रूप में मान रहा था।
क्रिस क्रू

1
भविष्य के लोगों के लिए; ग्राफिक्स डेटा की एक व्याख्या है। एक खेल के चार प्रमुख टुकड़े: तर्क, डेटा, इनपुट, आउटपुट। उन्हें एक साथ lumping से बचें। इसके अलावा, उत्कृष्ट प्रतिक्रिया जॉन, +1
एरोविम

9

जॉन का जवाब काफी सही है, लेकिन मैं इसे अलग तरीके से समझाने की कोशिश करूंगा:

वहाँ कोई आइसोमेट्रिक टक्कर का पता लगाने नहीं है।

टकराव का पता लगाने से कोई फर्क नहीं पड़ता कि आपका प्रक्षेपण मैट्रिक्स / परिवर्तन कैसा दिखता है। टकराव का पता लगाने से कोई फर्क नहीं पड़ता अगर आप चीजों को प्रस्तुत करते हैं (आखिरकार, जो वस्तुएं स्क्रीन से दूर हैं वे अभी भी टकरा सकती हैं, ठीक है?)

यह एक अधिक दार्शनिक सवाल है: क्या जंगल में गिरने वाला पेड़ वास्तव में जमीन से टकराता है जब वहां कोई नहीं होता है?

पारंपरिक ज्ञान कहेंगे: हाँ। इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे देखते हैं। चीजें विश्व-अंतरिक्ष में टकराती हैं, दृश्य-स्थान नहीं।


2
+1 अच्छी तरह से रखा। "वहाँ कोई आइसोमेट्रिक टक्कर का पता लगाने नहीं है"
जॉन मैकडॉनल्ड्स

1
धन्यवाद, मैंने वही कहा जो आपने पहले ही कहा था। लेकिन थोड़ा अलग।
19

0

आप प्रत्येक व्यक्तिगत पिक्सेल के प्रत्येक getRGB () मूल्यों के एक बिटमैप की रचना करने वाले पिक्सेल की एक सरणी आवंटित करने का प्रयास कर सकते हैं। मानों की तुलना एक इफ स्टेटमेंट के साथ करें क्योंकि टाइल की सीमाएं टाइल (जल, रेत, घास) का प्रतिनिधित्व करने वाले रंग की तुलना में एक अलग रंग मान हैं। एक बुनियादी सममितीय ग्रिड के लिए। या आपके पास मानचित्र की दो परतें हो सकती हैं। हरे रंग की स्क्रीन की तरह एक परत जिसमें एक टकराती हुई वस्तु के प्रत्येक प्रतिनिधि की रूपरेखा तैयार की जाती है और दूसरी परत मानचित्र ही होगी।

आप मानचित्र परत के प्रत्येक पिक्सेल के बिटमैप सरणी की रचना नहीं करते हैं, इसके बजाय आप उन रंगों के एक सेट की गणना करना चाहते हैं जो किसी वस्तु के टकराने / बनाए रखने के रंग मूल्य की सीमा को प्रभावित करने वाले प्रभावों का प्रतिनिधित्व करते हैं। या तो आप मानों को कम करना चाहते हैं या वेग बढ़ रहा है जिसमें ऑब्जेक्ट चल रहा है। प्रत्येक वस्तु जो चलती है वह एक अलग स्थान पर संग्रहीत मेमोरी की एक डुप्लिकेट है।

मैं पिक्सेल सही टक्कर और बिटमैप सरणियों की समझ पर ध्यान दूंगा। प्रत्येक आयत किसी भी स्थान या वेक्टर में एक वस्तु को प्रदान करने के आधार पर प्रत्येक घटना को ट्रिगर करने वाली मेमोरी की तरह डेटा की प्रतिकृति बनाने की सीमा होती है। स्क्रीन पर हर बिंदु केवल 2 डी विमान पर है कि छाया की गहराई एक भ्रम प्रदान करती है कि वस्तु 3 डी के रूप में स्वयं का प्रतिनिधित्व करती है। एक तिरछा में आकृतियों के परिवर्तन से यह समझ में आता है कि वस्तु एक कोण पर है। एक केंद्र बिंदु है जहां कैमरा इसे प्रस्तुत करता है यह देखने के लिए सब कुछ इस केंद्र बिंदु के चारों ओर ले जाया जाता है जो आकार में घटने से दूर जा रहा है या आकार में बढ़ रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.