कैसे एक चरित्र कूद बनाने के लिए?


44

मैं वर्तमान में डायरेक्ट X 9.0 का उपयोग करके C # में एक गेम बना रहा हूं। खेल का रीमेक गधा काँग एनईएस है। मेरे पास लगभग सब कुछ पूरा हो गया है, लेकिन मुझे मारियो के कूदने के भौतिकी के साथ समस्या है। मेरे पास वाई और एक्स समन्वय के लिए घोषित चर हैं।

मैं सोच रहा था कि क्या ऐसा करने का एक सरल तरीका था। मैंने एक उत्तर के लिए उच्च और निम्न खोज की है, लेकिन मुझे जो उत्तर मिले हैं वे या तो अप्रासंगिक हैं / या एक अलग प्रोग्रामिंग भाषा जैसे XNA का उपयोग कर रहे हैं।

वर्तमान में मेरे पास यह देखने के लिए कि क्या दबाया गया है, यह देखने के लिए जाँच करने के लिए एक बूल चर सेट है, जो उसे कूदने के लिए किसी भी कोड को ट्रिगर करेगा। मैं जैसे गड़बड़ कर रहा हूं।

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

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


5
एक अलग प्रोग्रामिंग भाषा का उपयोग करने वाले उत्तर में कोई समस्या नहीं होनी चाहिए। एल्गोरिथ्म ब्याज की है, विशिष्ट कार्यान्वयन की नहीं ... जब तक आप कुछ भी समझे बिना कॉपी और पेस्ट करने की उम्मीद नहीं कर रहे हैं, जो मुझे निश्चित रूप से उम्मीद है कि आप नहीं हैं! अन्य प्रोग्रामिंग भाषाओं से एल्गोरिदम को पढ़ने और अनुकूलित करने में सक्षम होना बहुत अच्छा कौशल है।
ccxvii

जवाबों:


84

सबसे पहले, XNA भी C # का उपयोग करता है इसलिए यह समान प्रोग्रामिंग भाषा है। और यद्यपि अंतर्निहित API में DirectX से कुछ अंतर हो सकते हैं, जिसका कूदने से कोई लेना-देना नहीं है, इसलिए यहां उसी ट्यूटोरियल या उत्तर को लागू करना चाहिए। इसके अलावा, कई कारकों के आधार पर, इसे लागू करने के कई तरीके हैं। नीचे मैं जो वर्णन करूंगा वह सिर्फ संभावनाओं में से एक है।

बुनियादी भौतिकी आवश्यकताएँ

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

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

फिक्स्ड हाइट जंप

अब एक छलांग को लागू करने का सबसे आसान तरीका जिसमें हमेशा एक ही ऊंचाई होती है, चाहे आप कितनी भी बार कुंजी दबाएं, बस एक बार ऊर्ध्वाधर वेग को बदलना है। इससे चरित्र उभरने लगेगा, जबकि गुरुत्वाकर्षण स्वतः उसे नीचे लाने का ध्यान रखेगा:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

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

चर ऊँचाई कूद

लेकिन मारियो और सोनिक जैसे खेलों में एक वैरिएबल जंप होता है जहां जंप की ऊंचाई इस बात पर निर्भर करती है कि आप बटन को कितने समय तक दबाते हैं। इस मामले में आपको जंप की को दबाने और छोड़ने दोनों को संभालने की आवश्यकता होगी । आप कुछ ऐसा जोड़ सकते हैं:

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

ऊपर दिए गए कोड में इन सभी मानों (जैसे संख्याएँ 0.5, -12.0fया -6.0f) को घुमाते हुए, अपनी छलांग का अहसास बदल सकते हैं, वह कितना ऊंचा कूदता है, कूदने का बटन जारी करने के बाद भी वह कितनी गति रखता है, कितनी तेजी से गिरता है, आदि। ।

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

काम करने का उदाहरण

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

http://jsfiddle.net/LyM87/


11
इस विषय से संबंधित जानकारी के साथ कुछ दिनों पहले लिखे गए इस अद्भुत लेख को साझा करने का मौका भी ले सकते हैं: 2D प्लेटफॉर्म को लागू करने के लिए मार्गदर्शिका । और यह भी: सोनिक जंपिंग
डेविड गौविया

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

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

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

1
यह बहुत मददगार था, 5 साल बाद :) और यह बेला बात बहुत अच्छी है - मुझे जेएस सीखना चाहिए!
तरलता

1

जैसे भौतिकी में। केवल इस समय आप दबाते हैं jump keyऔर चरित्र जमीन पर है ऊपर की ओर वेग जोड़ें (इसे आवेग कहा जाता है), लेकिन हर समय गुरुत्वाकर्षण द्वारा चरित्र गिरना।

यदि आप नहीं चाहते हैं कि हर बार कूदते समय वह पात्र कूद जाए - क्योंकि आप पकड़ रहे हैं jump key- jump key is being pressedचर जोड़ें जिसे आप jump keyजारी करने के बाद साफ़ करें और उसके बाद सेट करें। स्यूडोकोड:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

अगर मैंने आपका तरीका इस्तेमाल किया है:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

कैसे donkey.yपरिवर्तन होगा आपकी कल्पना तक। वेलोसिटी को छोटा होना चाहिए हेइगर गधा हवा में है ताकि यह अच्छा दिख सके।

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