साइड स्क्रॉलर में परिवर्तनीय ऊंचाई कूद


10

अगर जम्प की अधिक देर तक नीचे रखा जाता है तो मैं खिलाड़ी को ऊंची कूद कैसे लगा सकता हूं? मैं वर्तमान में केवल गुरुत्वाकर्षण को कम कर रहा हूं जब तक कि कुंजी पकड़ रखी है और खिलाड़ी कूद रहा है, लेकिन यह अजीब लगता है।


हो सकता है कि सिर्फ कुछ संशोधन से आप गुरुत्वाकर्षण को कम कर सकें, आपको एक बेहतर कूद कार्रवाई मिल सके।
अली

@ गजीत बल्कि क्लंकी है और इसे करने का एक अजीब तरीका लगता है।
कम्युनिस्ट डक

हम्म आप गुरुत्वाकर्षण को कम करने का मतलब यह नहीं है कि आप एक भौतिकी इंजन का उपयोग कर रहे हैं। क्या यह मामला है? क्या आप छलांग लगाने के लिए आवेगों का उपयोग कर रहे हैं?
जोनाथन कॉनेल ने

कोई भौतिकी इंजन नहीं है, और मैं
इम्पल्स

किस मामले में, आप खिलाड़ी कैसे गिरते हैं? क्या आप सिर्फ एक आंदोलन * कूद * गुरुत्वाकर्षण वेक्टर के अनुसार उसकी स्थिति का अनुवाद करते हैं?
जोनाथन कॉनेल

जवाबों:


9

पहले आपको यह तय करने की आवश्यकता है कि आप क्या देखना चाहते हैं।

वास्तविक जीवन में, कूद की ऊंचाई इस समय तय की जाती है कि आप मैदान छोड़ दें। जब आप पहले से ही मिड-एयर में होते हैं तो आप ऊंची कूद नहीं रख सकते।

इसलिए यदि आप हवा में रहते हुए अपनी ऊँचाई को नियंत्रित कर सकते हैं, तो आपको कुछ प्रकार के "जेट-पैक" जैसा प्रभाव मिलने वाला है।

मुझे लगता है कि मुझे एक ऐसा बाज़ याद आ रहा था जिसमें दो अलग-अलग जंप हाइट थे, मुझे लगता है कि यह सुपर मैरियो गेम्स में से एक था। जब आप जंप बटन को पकड़ते हैं तो ऊंची छलांग होती है, और कूदना वास्तव में एक दो भाग की छलांग होती है, जो शुरुआती नियमित छलांग के साथ शुरू होती है, इसके बाद दूसरा आवेग आता है जो आपको ऊंचा उठाता है।

तो, आप क्या चाहते हैं कि आपकी छलांग कैसी लगे? आप किस तरह का नियंत्रण चाहते हैं कि खिलाड़ी को कूदना पड़े?

मैं इसके साथ क्या शुरू करूंगा:

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


मैंने कोशिश की कि, और मुझे जेटपैक प्रभाव मिले। मैं सोच रहा था कि क्या इससे बचने का कोई रास्ता था।
जॉन स्टिमैक

1
हो सकता है कि आपके दिमाग में यह खेल न हो, लेकिन सुपर मारियो 2 में आप कूदने से पहले थोड़ा डक करके उच्च कूद गए। (जो एक निश्चित मात्रा में सहज ज्ञान युक्त है, क्योंकि आप बहुत दूर तक नहीं कूदते हैं यदि आप इसे एक खड़े स्थान से सीधा करने की कोशिश करते हैं।)
डेरेन

3
Jcubed: वेग में बल जोड़ने के बजाय, बल को सीधे स्थिति में जोड़ने का प्रयास करें। फिर खिलाड़ी ऊपर ले जाने के बजाय, रैखिक रूप से ऊपर जाएगा।
ओल्होव्स्की

@ जुबेड: जब कुछ गेम खेलते हैं super meat boy, जो मुझे लगता है कि एक ही कूद प्रभाव है जो आप चाहते हैं, ऐसा लगता है कि जब तक आप जंप बटन दबाते हैं, तो एक बल चरित्र पर लागू होता है, यह गुरुत्वाकर्षण के विपरीत है और इससे छोटा है, और बाकी जैसा अल्हॉव्स्की ने कहा है। अगर मैं कुछ इस तरह लागू करने वाला होता तो मैं कूदते बल के रूप में 60% -80% गुरुत्वाकर्षण के साथ कुछ शुरू करता।
अली

1
मैं यह हर समय करता हूं, बस उस समय को रखें जिसके दौरान आप बटन को काफी नीचे दबाकर कूदते हुए वेग को सेट करते हैं, इसलिए यह ध्यान देने योग्य जेट पैक प्रभाव नहीं है - तो यह सुपर मारियो की तरह आसानी से हो जाएगा, कुछ जादू के साथ संख्या में परिवर्तन। "बल" को छोटा न करें, बस तब तक वेग को अधिकतम जंपस्पीड पर रीसेट करते रहें जब तक कि जम्प हायर टाइमफायर समाप्त नहीं हो जाता है या खिलाड़ी बटन को छोड़ देता है ... साथ ही, मुझे लगता है कि सुपर मीट लड़के कूदते हुए अभेद्य और कष्टप्रद हो सकते हैं, जैसा कि किसी भी मंच पर कूद रहा है। यह केवल एक भौतिकी इंजन पर निर्भर करता है; पी
ऑस्कर ड्यूवॉर्न

7

मैंने कुछ लोगों को ऐसा करते देखा है:

  1. एक वैरिएबल बनाएं (मैं इसे कॉल करूंगा jumpTime) (नंबर / डबल / फ्लोट)। जब जंप की दबाया जाता है, तो jumpTimeकुछ संख्या पर सेट करें (यानी 0.5। यह सेकंड की संख्या होगी जो जंप कुंजी को प्रभावित करेगा)।

  2. फिर, हर कदम के लिए, वेग के लिए सेट jumpTimeकुछ अन्य संख्या से गुणा, और कमी jumpTimeसे delta(प्रत्येक चरण के बीच समय अंतर)।

  3. दोहराएं कि जब jumpTimeतक शून्य या नीचे तक नहीं पहुंच जाता है, या जब खिलाड़ी कूद कुंजी जारी करता है। ऐसा होने के बाद, सामान्य भौतिकी का उपयोग करें (खिलाड़ी के मैदान तक पहुंचने तक लगातार नकारात्मक त्वरण लागू करें)।

आपको "कुछ संख्या" s के लिए उपयुक्त मान खोजने के लिए परीक्षण और त्रुटि (या "तार्किक अनुमान") का उपयोग करने की आवश्यकता हो सकती है, जब तक कि आप यह नहीं जानते कि यह कैसे करना है।


अद्यतन: मैंने चाल को पाया जो कूद को थोड़ा अधिक यथार्थवादी बनाता है (क्योंकि यह मूल रूप से धीमा हो रहा है लेकिन फिर तेजी से नीचे जा रहा है)। अनंत मारियो निम्न पंक्ति (जावास्क्रिप्ट संस्करण के 29. अक्षर का भी उपयोग करता है) ... this.Ya *= 0.85;यह बस "एयर ड्रैग" की तरह है, और मध्य-हवा में होने पर चरित्र के वेग को सीमित / धीमा कर देता है। इसलिए प्रत्येक फ्रेम, y- वेग (ऊर्ध्वाधर गति) को एक से कम संख्या से गुणा करें ताकि यह वापस नीचे गिरने पर धीमा हो जाए (और इसलिए एक छलांग के दौरान ऊपर की तरफ और नीचे की तरफ जाना दोनों समान और अधिक यथार्थवादी होगा)। मुझे पता है, मैं समझाने में बुरा हूँ ...

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

इस समस्या को हल करने के अन्य तरीके भी हैं, जैसे कि चरित्र पर गुरुत्वाकर्षण के प्रभाव को कम करना क्योंकि यह गिरता है। हालांकि, हमें यह पता लगाने की जरूरत है कि हमें गुरुत्वाकर्षण को कितना कम करना चाहिए।


केस स्टडी: अनंत मारियो

यह वही है जो मुझे मिला (मार्कस पर्सन (नॉच) द्वारा मारियो.जावा की लाइन 206 से):

    if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding))
    {
        if (jumpTime < 0)
        {
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            jumpTime++;
        }
        else if (onGround && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = 0;
            yJumpSpeed = -1.9f;
            jumpTime = 7;
            ya = jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;
        }
        else if (sliding && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = -facing * 6.0f;
            yJumpSpeed = -2.0f;
            jumpTime = -6;
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;

            facing = -facing;
        }
        else if (jumpTime > 0)
        {
            xa += xJumpSpeed;
            ya = jumpTime * yJumpSpeed;
            jumpTime--;
        }
    }
    else
    {
        jumpTime = 0;
    }

जावास्क्रिप्ट संस्करण मूल रूप से एक ही है https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js

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

मेरा जावास्क्रिप्ट संस्करण:

    if ( onGround && jump && !jumped ) {
        jumpTime = maxJumpTime;
        onGround = false;
        jumped = true;
        this.vel.y = jumpTime * jumpConstant;
        A = true;
    } else if ( !onGround && jump && jumpTime > 0 && !released ) {
        jumpTime -= evt.delta;
        this.vel.y = jumpTime * jumpConstant;
        B = true;
    } else if ( !onGround && ( !jump || jumpTime <= 0 ) ) {
        this.vel.y -= gravityConstant * evt.delta;
        jumpTime = 0
        released = true;
    } if ( this.pos.y < 0 && !A && !B ) {
        onGround = true;
        released = false;
        this.pos.y = 0;
        this.vel.y = 0;
    }
    if ( !jump && onGround ) jumped = false;

हालाँकि, स्थिरांक के लिए कुछ मान (जैसे "गुरुत्वाकर्षणसंकेतन" और "जंपकॉस्टेंट") हालांकि अवास्तविक कूद देंगे। लेकिन कभी-कभी खेल यथार्थवादी नहीं होते हैं! ( अद्यतन ऊपर अद्यतन अनुभाग देखें)

यह प्रश्न पहले से ही एक वर्ष से अधिक पुराना है, लेकिन मुझे आशा है कि यह मदद करता है!


2

जैसा कि ओल्होव्स्की ने कहा है, कूदने का समय उस समय तय किया जाता है जब आप मैदान छोड़ते हैं, उसके बाद नहीं।

यदि आप वास्तव में जेटपैक प्रभाव से बचना चाहते हैं, तो मैं केवल दो तरीके देखता हूं: उच्च कूदने के लिए एक प्रमुख संयोजन , या मूल रूप से कूदने के काम के तरीके को बदलना:

कुंजी दबाते ही खिलाड़ी कूदने के बजाय, कुंजी जारी होने तक कूदने में देरी करें । तो मूल रूप से कुंजी प्रेस की अवधि यह नियंत्रित करती है कि खिलाड़ी के पैरों में वसंत तनाव कितना है, और बाद में जारी किया गया।

बेशक, यह मूल रूप से खेल यांत्रिकी को बदल देता है और खिलाड़ी के लिए अपरिचित हो सकता है। लेकिन प्रभाव काफी दिलचस्प हो सकता है और अच्छी तरह से अपरिचित के लायक हो सकता है।


2
मुझे लगता है कि मुझे उस मैकेनिक के साथ कुछ प्लेटफ़ॉर्मर बजाने की याद है - जब तक आप "कूद" के लिए चार्ज नहीं करते हैं, तब तक जमीन न छोड़ें। कुछ सुंदर एनिमेशन के साथ (जैसे चरित्र के पैरों पर धूल के बादल बढ़ते हैं) यह सहज महसूस करने के लिए किया जा सकता है।
जरी कोमप्पा

2

मैंने डेविड गौविया के सवाल के जवाब में एक और समाधान पाया है " चरित्र कूद कैसे करें? "

सारांश:

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

मुझे उसका जवाब चोरी नहीं करना चाहिए, इसलिए आगे बढ़ें और उसकी पोस्ट पढ़ें। उनका समाधान " वैरिएबल हाइट जंप " अनुभाग के तहत है।

तो वास्तव में लोग इस समस्या को हल करने के लिए कई अलग-अलग तरीकों से आए ...

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