यहां प्रासंगिक तर्क है जो मैंने अपने मुखपृष्ठ पर पोंग पर उपयोग किया है : (कृपया इसे पढ़ने से पहले चलाएं, ताकि आपको पता चल जाए कि मैं निम्नलिखित कोड के साथ क्या प्रभाव प्राप्त कर रहा हूं)
अनिवार्य रूप से, जब गेंद पैडल से टकराती है, तो उसकी दिशा पूरी तरह से अवहेलना होती है; यह टकराव के केंद्र से कितनी दूर है, इसके अनुसार एक नई दिशा दी गई है। यदि गेंद केंद्र में पैडल से टकराती है, तो इसे बिल्कुल क्षैतिज भेजा जाता है; यदि यह किनारे पर सही हिट करता है, तो यह एक चरम कोण (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 या अधिक पदों और उन पदों के समय की आवश्यकता है)
अब आपको गेंद के कोणीय वेग को भी ट्रैक करने की आवश्यकता है , जो व्यावहारिक रूप से उस वक्र का प्रतिनिधित्व करता है जिसके साथ वह यात्रा कर रहा है, लेकिन गेंद की वास्तविक दुनिया की स्पिन के बराबर है। पैडल के साथ टकराव पर गेंद की सापेक्ष स्थिति से बाउंस कोण को आप कैसे प्रक्षेपित करेंगे, इसके समान, आपको टक्कर पर पैडल के वेग से इस कोणीय वेग (या स्पिन) को प्रक्षेपित करने की भी आवश्यकता होगी। केवल स्पिन सेट करने की बजाय जैसे आप उछाल कोण के साथ करते हैं, आप गेंद के मौजूदा स्पिन को जोड़ना या घटा सकते हैं, क्योंकि यह खेल में अच्छा काम करता है (खिलाड़ी नोटिस कर सकता है कि गेंद घूम रही है, और स्पिन करने का कारण बन सकती है) और भी बेतहाशा, या सीधे यात्रा करने के प्रयास में स्पिन का मुकाबला करें)।
ध्यान दें, हालांकि, जबकि यह सबसे सामान्य ज्ञान है और शायद इसे लागू करने का सबसे आसान तरीका है, उछाल का वास्तविक भौतिकी पूरी तरह से उस वस्तु के वेग पर निर्भर नहीं करता है जो इसे हिट करता है; एक कोणीय वेग (कोई स्पिन) के साथ एक वस्तु जो एक कोण पर एक सतह को हिट करती है, उस पर एक स्पिन लगाया जाएगा। इससे एक बेहतर गेम मैकेनिक बन सकता है, इसलिए आप इस पर गौर करना चाहते हैं, लेकिन मैं इसके पीछे भौतिकी के बारे में निश्चित नहीं हूं इसलिए मैं इसे समझाने की कोशिश नहीं करूंगा।