पोंग में, आप गेंद की दिशा की गणना कैसे करते हैं जब वह पैडल से उछलती है?


28

मैं खेल के विकास में इस बहुत ही हैलो वर्ल्ड-वाई समस्या के आसपास अपना सिर लपेटने की कोशिश कर रहा हूं। मैंने XNA में एक TicTacToe गेम बनाया है, इसलिए मुझे लगता है कि अगला कदम एक ब्रेकआउट क्लोन होगा।

ध्यान रखें कि मुझे गेम प्रोग्रामिंग पर कोई ज्ञान नहीं है या यहां तक ​​कि मुझे क्या गणित लागू करना चाहिए। इसलिए मैं यह सवाल पूछ रहा हूं।


प्रश्न के लिए: मैं यह कैसे निर्धारित कर सकता हूं कि स्क्रीन के नीचे पैडल मारने पर गेंद कहाँ उछलनी चाहिए?

मुझे लगता है कि यह कुछ इस तरह होगा:

  1. आने वाली गेंद से गति और कोण पर कब्जा।
  2. पता लगाएँ कि यह कहाँ बार (दूर बाएँ, दूर दाएँ, केंद्र) को छुआ और उसके अनुसार यदि यह बाहरी क्षेत्रों को छूता है तो इसे एक उच्च गति प्रदान करें।
  3. यह वह जगह है जहां मैं फंस गया हूं। हेहे।

कोई अंतर्दृष्टि? मुझे लगता है कि यह एक सीधा जवाब प्रकार का सवाल नहीं है, लेकिन मुझे यकीन है कि यह किसी न किसी बिंदु पर सभी का सामना कर रहा है।

मैं किताब बीजगणित बीजगणित पढ़ रहा हूँ जो इस वेबसाइट पर सुझाया गया था, लेकिन मुझे अभी भी पता नहीं है कि मुझे इसे यहाँ लागू करना चाहिए।


ब्रेकआउट से पहले पोंग लिखें, आप तब गेंद, दीवार और पैडल कक्षाओं का निर्यात कर सकते थे और उन्हें इस तरह बढ़ा सकते थे कि वे विभिन्न प्रकार की ईंटों और पॉवरअप के साथ काम करें। इसके अलावा, मैं ब्रेकआउट की तुलना में पोंग को सरल मानूंगा।
गुप्त

जवाबों:


30

यहां प्रासंगिक तर्क है जो मैंने अपने मुखपृष्ठ पर पोंग पर उपयोग किया है : (कृपया इसे पढ़ने से पहले चलाएं, ताकि आपको पता चल जाए कि मैं निम्नलिखित कोड के साथ क्या प्रभाव प्राप्त कर रहा हूं)

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

var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;

पैडल के मध्य Y मान लें, और गेंद के Y प्रतिच्छेदन को घटाएं। यदि पैडल 10 पिक्सेल ऊंचा है, तो यह संख्या -5 और 5 के बीच होगी। मैं इसे "रिलेटिव इंटरसेक्ट" कहता हूं, क्योंकि यह अब "पैडल स्पेस" में है, पैडल के मध्य के सापेक्ष बॉल का चौराहा।

var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;

रिश्तेदार चौराहे को ले लो और इसे आधा पैडल ऊंचाई से विभाजित करें। अब हमारा -5 से 5 नंबर -1 से 1 तक का दशमलव है; यह सामान्यीकृत है । फिर इसे अधिकतम कोण से गुणा करें जिसके द्वारा आप चाहते हैं कि गेंद उछल जाए। मैंने इसे 5 * पाई / 12 रेडियन (75 डिग्री) पर सेट किया।

ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);

अंत में, सरल त्रिकोणमिति का उपयोग करके नई बॉल वेलोसिटी की गणना करें।

यह वह प्रभाव नहीं हो सकता है जो आप के लिए जा रहे हैं, या आप एक सामान्य गति से सामान्यीकृत सापेक्ष चौराहे को गुणा करके एक गति निर्धारित करना चाहते हैं; यदि गेंद केंद्र के पास टकराती है, तो यह गेंद को तेजी से आगे बढ़ाती है, अगर यह पैडल के किनारे से टकराती है या धीमी हो जाती है।


मैं संभवत: कुछ कोड को पसंद करूंगा कि एक वेक्टर कैसा दिखेगा या मैं कैसे वेक्टर के गोले को बचा सकता हूं (गति और दिशा)।

एक सदिश में गति और दिशा दोनों निहित हैं। मैं अपने वेक्टर को "vx" और "vy" के रूप में संग्रहीत करता हूं; वह है, x दिशा में गति और y दिशा में गति। यदि आपने भौतिकी में कोई परिचयात्मक पाठ्यक्रम नहीं लिया है तो यह आपको कुछ हद तक विदेशी लग सकता है।

ऐसा करने का कारण यह है क्योंकि यह प्रति-फ्रेम गणना को कम करता है; प्रत्येक फ्रेम, आप बस करते हैं x += vx * time;और y += vy * time;जहां समय अंतिम फ्रेम के बाद का समय है, मिलीसेकंड में (इसलिए वेग प्रति पिक्सेल पिक्सल में हैं)।


गेंद को वक्र करने की क्षमता को लागू करने के बारे में:

सबसे पहले, आपको गेंद के हिट होने के समय पैडल के वेग को जानना होगा; जिसका अर्थ है कि आपको पैडल के इतिहास पर नज़र रखने की आवश्यकता होगी, ताकि आप पैडल की पिछली स्थितियों में से एक या एक से अधिक जान सकें, ताकि आप उन्हें स्थानांतरित करने के लिए इसकी वर्तमान स्थिति से तुलना कर सकें। (स्थिति / समय में परिवर्तन = वेग; इसलिए आपको 2 या अधिक पदों और उन पदों के समय की आवश्यकता है)

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

ध्यान दें, हालांकि, जबकि यह सबसे सामान्य ज्ञान है और शायद इसे लागू करने का सबसे आसान तरीका है, उछाल का वास्तविक भौतिकी पूरी तरह से उस वस्तु के वेग पर निर्भर नहीं करता है जो इसे हिट करता है; एक कोणीय वेग (कोई स्पिन) के साथ एक वस्तु जो एक कोण पर एक सतह को हिट करती है, उस पर एक स्पिन लगाया जाएगा। इससे एक बेहतर गेम मैकेनिक बन सकता है, इसलिए आप इस पर गौर करना चाहते हैं, लेकिन मैं इसके पीछे भौतिकी के बारे में निश्चित नहीं हूं इसलिए मैं इसे समझाने की कोशिश नहीं करूंगा।


वह प्रभाव जो मैं जा रहा हूं; तेज गति के रूप में यह बार के किनारों को हिट करता है। यह लिखने के लिए समय निकालने के लिए एक गुच्छा धन्यवाद। मुझे कुछ चीजों को समझने में थोड़ी परेशानी हो रही है; उदाहरण के लिए, पहले स्निपर में, 'इंटरसेक्टी' क्या है? इसके अलावा, 'पैडल 1 वाई' बार की ऊंचाई सही है?

प्रतिच्छेदन गेंद की स्थिति है जहां वह पैडल को काटता है। मैं एक ओवरकॉम्प्लिकेटेड गणना करता हूं, जिसे मैं ईमानदारी से अभी ठीक से समझ भी नहीं पाया हूं, लेकिन अनिवार्य रूप से यह उस समय गेंद का वाई मान है जब वह टकराता है। paddle1Y स्क्रीन के शीर्ष से पैडल का Y मान है; पैडलेहाइट पैडल ("बार") की ऊंचाई है।
Ricket

"वक्र" गेंदों की अनुमति देने के लिए आपको क्या जोड़ना होगा? उदाहरण के लिए, जब गेंद पैडल को मारने वाली होती है तो आप गेंद को मोड़ने के लिए पैडल को हिलाते हैं। कुछ इस तरह: en.wikipedia.org/wiki/Curve_ball
Zolomon

संपादित करें देखें, और मुझे पता है आप क्या सोचते हैं (अगर आप कुछ के बारे में अधिक जानकारी की आवश्यकता है, कुछ भी नहीं मिलता है आदि)
Ricket

धन्यवाद! शानदार जवाब, मुझे हमेशा आश्चर्य होता है कि उस प्रभाव को कैसे प्राप्त किया जाए!
ज़ोलोमन

8

मुझे यह करते हुए कुछ समय हो गया है, लेकिन मुझे लगता है कि मुझे यह अधिकार मिल गया है।

एक पूर्ण टक्कर को देखते हुए, प्रतिबिंब का कोण घटना के कोण के बराबर है।

आप अपने पैडल (एक समतल सतह को मानते हुए) के सामान्य को जानते हैं: N आप अपनी गेंद की अपनी मूल स्थिति (अपनी टाइमस्टेप की शुरुआत में) जानते हैं: P आप गेंद की अपनी नई स्थिति (टाइमस्टेप के अंत में) जानते हैं: P 'आप टकराव के अपने बिंदु को जानते हैं: सी मान लें कि आपने गणना की है कि सेगमेंट P -> P' आपके पैडल से होकर गुजरता है, आपका नया परिलक्षित पोशन (P '') होगा:

पी '+ 2 * (एन * (पी' डॉट-एन))

N * (P 'dot -N) सबएक्प्रेशन डिप्रेशन की सामान्य गणना के साथ-साथ गेंद के कूच करने की गहराई की गणना करता है। माइनस साइन इस तथ्य के लिए सही है कि हम सामान्य की दिशा के विपरीत गहराई की जाँच कर रहे हैं।

पी '+ 2 * उपसंचाई का हिस्सा टकराव की गहराई से गेंद को टकराव के विमान से ऊपर ले जाता है।

यदि आप पूर्ण टक्कर से कम चाहते हैं, तो कारक 2 को (1 + (1-k)) में बदल दें जहां k आपके घर्षण का गुणांक है। एक सही टक्कर में ak का मान 0 होता है, जिससे परावर्तन कोण बिल्कुल आने वाले कोण का हो जाता है। 1 का k मान टकराव का कारण बनता है जहाँ गेंद टकराव के विमान की सतह पर रुकेगी।

आपका नया वेग वेक्टर, V '', दिशा P '' होगा - C. इसे सामान्य करें और अपने आने वाले वेग से गुणा करें और आपका परिणामी वेग परिमाण समान होगा, लेकिन नई दिशा में। आप उस वेग के साथ एक गुणांक, l से गुणा करके बंदर कर सकते हैं, जिसके परिणामस्वरूप या तो वृद्धि होगी (l> 1) या कमी (l <1) परिणामी वेग।

संक्षेप में:

P '' = P '+ (1-k) * (N * (P dot -N)) V' '= l * V * ((P' '- C) / | P' '- C |

जहां k और l आपके चयन के गुणांक हैं।


5

प्रतिबिंब या तो "सही" हो सकता है या "आसान" हो सकता है।

"सही" तरीका है दीवारों पर लंबवत वैक्टर की गणना करना। 2 डी में यह बहुत आसान है और आप शायद केवल कठिन कोड उन्हें दे सकते हैं। फिर, प्रतिबिंब कदम अनिवार्य रूप से गति के "समानांतर" घटक को बरकरार रखता है और "लंबवत" घटक को उलट देता है। इसके लिए वेब पर शायद विस्तृत जानकारी है, शायद मैथवर्ल्ड पर भी।

"आसान" तरीका सिर्फ दीवार से टकराने पर एक्स या वाई गति को नकारना है। यदि आप साइड की दीवारों से टकराते हैं, तो आप X को नकार देंगे। यदि आप ऊपर से टकराते हैं तो आप Y को नकार देते हैं। यदि आप गेंद को गति देना चाहते हैं, तो आप जो चाहें बढ़ाएँ; आप इसे X और Y दोनों गति से गुणा करके इसकी वर्तमान दिशा में गति प्रदान कर सकते हैं या केवल एक अक्ष पर गति कर सकते हैं।


"आसान" तरीका और ऊपर वर्णित "सही" तरीका अनिवार्य रूप से समान नहीं है ??
टॉम

यदि दीवारें प्रमुख अक्षों के साथ हैं तो वे बिल्कुल समान हैं। यदि दीवारें X, Y और Z कुल्हाड़ियों के साथ नहीं हैं, तो नहीं, दोनों पूरी तरह से अलग हैं।
डैश-टॉम-बैंग

5

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

  • बेशक, चूंकि गेंद की गति समय में बढ़ जाती है, इसलिए मैं पहले / बाद में एक्स को प्रक्षेपित करता हूं, सटीक टकराव का पता लगाने के लिए वाई चरण, सभी "स्टेपएक्स" और "स्टेपवाई" के माध्यम से लूपिंग की गणना की जाती है, जो वेक्टर के मापांक द्वारा प्रत्येक गति घटक को विभाजित करते हैं। वर्तमान और भविष्य की गेंद की स्थिति के अनुसार।

  • यदि पैडल के खिलाफ टक्कर होती है, तो मैं 20 की वाई गति को विभाजित करता हूं। यह "20" सबसे सुविधाजनक मूल्य है जिसे मैंने अपना परिणाम प्राप्त करने के लिए अधिकतम कोण प्राप्त किया जब गेंद पैडल के किनारों पर टकराती है, लेकिन आप इसे जो कुछ भी बदल सकते हैं आपकी आवश्यकताएं हैं, बस कुछ मूल्यों के साथ खेलें और आपके लिए बेहतर चुनें। विभाजित करके, मान लें कि 5 की गति, जो इस संख्या (20) द्वारा मेरी प्रारंभिक गेम गति है, मुझे 0.25 का "रिबाउंड फैक्टर" मिलता है। यह गणना मेरे कोणों को काफी आनुपातिक रखती है जब गति मेरी अधिकतम गति मान तक बढ़ जाती है, उदाहरण के लिए, 15 हो सकती है (उस स्थिति में: 15/20 = 0.75)। यह देखते हुए कि मेरे पैडल एक्स, वाई कोर्ड्स मिडहैंडल्ड हैं (एक्स और वाई पैडल के केंद्र का प्रतिनिधित्व करते हैं), मैं फिर इस परिणाम को गेंद की स्थिति और पैडल की स्थिति के बीच के अंतर से गुणा करता हूं। अधिक से अधिक अंतर, परिणामी कोण महान। इसके अलावा, एक मिडहेल्ड पैडल का उपयोग करते हुए, आपको केंद्र की गणना के बारे में चिंता किए बिना गेंद के हिट के आधार पर एक्स वेतन वृद्धि के लिए सही संकेत मिलता है। छद्म कोड में:

N = 0 से मापांक के लिए ...

अगर टकराव_डिटेड है तो स्पीडएक्स = - (स्पीडी / 20) * (पैडलएक्स - बॉलएक्स); speedY = -speedY;
बाहर जाएं; अगर अंत

...

x = x + stepX; y = y + stepY;

के लिए अंत

रिमाइबर, हमेशा चीजों को सरल रखने की कोशिश करें। मुझे उम्मीद है यह मदद करेगा!


4

ब्रेकआउट में पैडल, जब आप जिस शैली का वर्णन कर रहे हैं, वह आमतौर पर एक घुमावदार सतह के रूप में तैयार की जाती है। घटना के कोण के आधार पर परिवर्तन जहां पैडल पर हिट करता है। मृत केंद्र पर वक्र के लिए स्पर्शरेखा रेखा बिल्कुल क्षैतिज है, और गेंद अपेक्षा के अनुरूप दिखाई देती है। जैसे ही आप केंद्र से बाहर जाते हैं, वक्र की स्पर्शरेखा तेजी से कोण हो जाती है, और परिणामस्वरूप गेंद अलग रूप से प्रतिबिंबित होती है।

मुख्य बिंदु यह है कि प्रतिबिंब का कोण, गेंद की गति नहीं है, जो कि परिवर्तन है। गेंद की गति आम तौर पर समय के साथ धीरे-धीरे बढ़ती है।


1
आप एक घुमावदार सतह के रूप में कहते हैं और यह मेरे सिर में तार्किक लगता है लेकिन एक बार जब मैं इसे सोचने की कोशिश करता हूं तो कोड चीजों के बारे में फजीहत होती है। मैं यह भी घोषित कर सकता हूं कि कोड में एक चर या कुछ और के रूप में।

कुछ ऐसा है angle = 1 - 2 * (ball.x - paddle.left) / paddle.widthजो आपको 1 और -1 के बीच एक नंबर देगा; यह (आपके खेल यांत्रिकी के लिए ट्विस्ट किए गए कुछ समय) गेंद के टकराने के बिंदु पर स्पर्शरेखा रेखा का ढलान है। कड़ाई से क्षैतिज एक के बजाय उस रेखा को प्रतिबिंबित करें।

4

नोलन बुशनेल ने इस पिछले सप्ताहांत में SIEGE में एक मुख्य वक्ता के रूप में दिया और मूल पोंग के साथ इसी तरह के मुद्दे पर बात की। आपको जटिल गणनाएँ करने की ज़रूरत नहीं है। यदि आप हेट पैनल के बाएं हिस्से की ओर हिट करते हैं, तो गेंद को बाएं भेजें। दाएं तरफ के लिए भी ऐसा ही करें।

आपके साथ शुरू करने के लिए बाएँ और दाएँ पक्ष को 45 डिग्री के लिए कोण बना सकते हैं। एक बार जब आप खेल को समाप्त कर लेते हैं तो यदि आप वापस जाना चाहते हैं और इसे और अधिक जटिल बना सकते हैं लेकिन इसे शुरू करने के लिए जितना संभव हो उतना सरल बनाएं।


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

4

ब्रेकआउट एक क्लासिक शुरुआती है जो भौतिकी आधारित गेम प्रोग्रामिंग की दुनिया में गोता लगाने के लिए काम करता है। मूल रूप से गेंद की उछाल गति तब होती है जब वह दीवार पर टकराती है। जैसा कि ऊपर दिए गए किसी व्यक्ति ने घटना के कोण को प्रतिबिंब के कोण के बराबर बताया है। लेकिन जब आप पैडल मारने वाली गेंद पर विचार करते हैं। तर्क को 3 खंडों में विभाजित किया गया है। 1.) गेंद पैडल के केंद्र भाग को मारती है। 2.) गेंद पैडल के बाएं हिस्से को मारती है। 3.) गेंद पैडल की सही स्थिति को मार रही है।

जब आप केंद्र के हिस्से पर विचार करते हैं: आपको गेंद के टकराने पर लागू होने वाले उछाल प्रभाव की आवश्यकता नहीं होती है। गेंद को सामान्य रूप से विक्षेपित किया जाता है। लेकिन, जब दोनों दिशा में मारा जाता है, तो मामला अलग होता है।

जब गेंद बाईं ओर से टकराती है, तो स्क्रीन के बाईं ओर से आने वाली गेंद पर विचार करें और आप दाईं ओर से पैडल लेकर आ रहे हैं। फिर जब आप बाएं हिस्से से गेंद को मारते हैं, तो गेंद को उस दिशा से प्रतिबिंबित होना चाहिए जो .ie.leftwards से उसी कोण से आती है जहां से यह आया था। वही मामला इसके विपरीत है। दाहिने हिस्से में भी यही बात लागू होती है।

हिट होने पर बाईं या दाईं दिशा की ओर गेंद का यह आंदोलन इसे और अधिक विश्वसनीय बनाता है।

आशा है कि आपको विचार मिल गया होगा, कम से कम तर्क के अनुसार। धन्यवाद


1

कल्पना कीजिए कि आप पैडल के केंद्र और उस बिंदु के बीच की दूरी की गणना करते हैं जहां बॉल Y हिट करता है और उसे कॉल करता है d। मान लें कि dजब पैडल के केंद्र के ऊपर गेंद हिट होती है, तो इसका सकारात्मक मूल्य होता है। अब आप d * -0.1अपनी गेंद के वाई वेग में जोड़ सकते हैं और यह दिशा बदलना शुरू कर देगा। यहाँ जावास्क्रिप्ट में एक उदाहरण है जिसे आसानी से c # में अनुवादित किया जा सकता है!

var canvas = document.querySelector('canvas');
var resize = function () {
  canvas.width = innerWidth;
  canvas.height = innerHeight;
};
resize();
var ctx = canvas.getContext('2d');
var ball = {
  size: 3,
  x: 1,
  y: canvas.height/2,
  vx: 2,
  vy: 0
};
var paddle = {
  height: 40,
  width: 3,
  x: canvas.width/2,
  y: canvas.height/2
};
addEventListener('mousemove', function (e) {
  paddle.y = e.clientY - (paddle.height/2);
});
var loop = function () {
  resize();
  ball.x += ball.vx;
  ball.y += ball.vy;
  if (ball.x > canvas.width || ball.x < 0) ball.vx *= -1; // horiz wall hit
  if (ball.y > canvas.height || ball.y < 0) ball.vy *= -1; // vert wall hit
  if (ball.x >= paddle.x && ball.x <= paddle.x + paddle.width && ball.y >= paddle.y && ball.y <= paddle.y + paddle.height) {
    // paddle hit
    var paddleCenter = paddle.y + (paddle.height/2);
    var d = paddleCenter - ball.y;
    ball.vy += d * -0.1; // here's the trick
    ball.vx *= -1;
  }
  ctx.fillRect(ball.x,ball.y,ball.size,ball.size);
  ctx.fillRect(paddle.x,paddle.y,paddle.width,paddle.height);
  requestAnimationFrame(loop);
};
loop();
body {overflow: hidden; margin: 0}
canvas {width: 100vw; height: 100vh}
<canvas></canvas>


0

यह http://www-classes.usc.edu/engr/ee-s/477p/s00/pong.html आपको बस x और y को उल्टा करने में मदद करेगा जहां यह स्क्रीन को हिट करता है। अगर उसका ऊपर जाना, और ऊपर से टकराता है, तो यह x वेग को रखते हुए y वेग को रोक देता है


0

नमस्ते, मुझे हाल ही में एक बॉल गेम बनाने की कोशिश की गई है और इसके लिए एक समाधान निकाला गया है। इसलिए मैंने क्या किया: जब हम गेम खेल रहे होते हैं तो पैडल हिल रहा होता है। मेरे समन्वय प्रणाली को छोड़ दिया गया है जैसा कि यह है, कैनवास का शीर्ष-बाएं बिंदु 0,0 है। इस समन्वय प्रणाली में चप्पू आगे बढ़ रहा है। X अक्ष 0 से कैनवास की चौड़ाई की ओर इशारा करता है, और y अक्ष 0 से कैनवास की ऊँचाई की ओर इशारा करता है। मैंने फिक्स आकार 100 की चौड़ाई और 20 ऊंचाई के साथ एक चप्पू बनाया। और फिर मैं इसके चारों ओर एक काल्पनिक चक्र खींचता हूं। जब गेंद पैडल मारती है तो मैं पैडल के केंद्र बिंदु की गणना करता हूं

double paddleCenter=Squash.paddle.getXpos()+Squash.paddle.getPaddleWidth()/2;

फिर मैं गेंद की वर्तमान स्थिति से केंद्र को हटाता हूं, इस तरह से समन्वय प्रणाली पैडल के केंद्र में होगी, बॉलकेंटर वह बिंदु है जहां गेंद पैडल से टकराती है (- (पैडल एक्सपोज़र + आर) .. 0 .. (पैडल + आर) )) यह और कुछ नहीं है बल्कि पैडल पर मार करने वाला बिंदु है

double x0 = ballCenterX-paddleCenter;

सर्कल के चौराहे के बिंदु को बॉल के हिटिंग पॉइंट (x0) की सहायता से गणना करें यह एक पुनर्संयोजन है, हम सर्कल पर y समन्वय के लिए पूछते हैं x0 के साथ पहले से ही ज्ञात समन्वय और y अक्ष के लिए एक फ्लिप की आवश्यकता थी

double y0 = -Math.sqrt(paddleRadius*paddleRadius-x0*x0);

वृत्त के सामान्य समीकरण की व्युत्पत्ति की गणना करें जो कि पैडल के चारों ओर मूली पैडल के साथ परिभाषित किया गया है (x, y) = x ^ 2 + y ^ 2-r ^ 2

double normalX=2*x0;
double normalY=2*y0;

सतह को सामान्य के लिए एक इकाई वेक्टर प्राप्त करने के लिए, एन वेक्टर को सामान्य करें

double normalizer=Math.sqrt(normalX*normalX + normalY*normalY);
normalX=normalX/normalizer;
normalY=normalY/normalizer;

अब हमारे पास पैडल के लिए सामान्यीकृत (यूनिट) सतह मानदंड हैं। इन सतह मानदंडों के साथ नई दिशा की गणना करें, यह परावर्तन सदिश सूत्र की सहायता से गणना की जाएगी: new_direction = old_direction-2 * dot (N, old_direction) * N, लेकिन सामान्य सामान्य वसीयत के साथ सतह की ओर संकेत करते हैं उस बिंदु से बिंदु पर बदलना जहां गेंद पैडल मारती है

double eta=2; //this is the constant which gives now perfect reflection but with different normal vectors, for now this set to 2, to give perfect reflection
double dotprod=vX*normalX+vY*normalY;
vX=vX-eta*dotprod*normalX;//compute the reflection and get the new direction on the x direction
vY=-vY;//y direction is remain the same (but inverted), as we just want to have a change in the x direction

मैंने इस समस्या का समाधान प्रकाशित किया है। अधिक जानकारी के लिए और पूर्ण गेम के लिए आप मेरे गित्बम भंडार देख सकते हैं:

https://github.com/zoli333/BricksGame

ग्रहण के साथ जावा में लिखा है। Ball.java में इस टिप्पणी के लिए एक और उपाय है, जहां rescaling ऐसा नहीं होता है मैं निर्देशांक समन्वय प्रणाली को पैडल के केंद्र बिंदु पर नहीं ले जाता, इसके बजाय मैं इन सभी को ऊपर की ओर से गणना करता हूं 0,0 समन्वयक के सापेक्ष पैडल का केंद्र बिंदु। यह भी काम करता है।

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