अगर जम्प की अधिक देर तक नीचे रखा जाता है तो मैं खिलाड़ी को ऊंची कूद कैसे लगा सकता हूं? मैं वर्तमान में केवल गुरुत्वाकर्षण को कम कर रहा हूं जब तक कि कुंजी पकड़ रखी है और खिलाड़ी कूद रहा है, लेकिन यह अजीब लगता है।
अगर जम्प की अधिक देर तक नीचे रखा जाता है तो मैं खिलाड़ी को ऊंची कूद कैसे लगा सकता हूं? मैं वर्तमान में केवल गुरुत्वाकर्षण को कम कर रहा हूं जब तक कि कुंजी पकड़ रखी है और खिलाड़ी कूद रहा है, लेकिन यह अजीब लगता है।
जवाबों:
पहले आपको यह तय करने की आवश्यकता है कि आप क्या देखना चाहते हैं।
वास्तविक जीवन में, कूद की ऊंचाई इस समय तय की जाती है कि आप मैदान छोड़ दें। जब आप पहले से ही मिड-एयर में होते हैं तो आप ऊंची कूद नहीं रख सकते।
इसलिए यदि आप हवा में रहते हुए अपनी ऊँचाई को नियंत्रित कर सकते हैं, तो आपको कुछ प्रकार के "जेट-पैक" जैसा प्रभाव मिलने वाला है।
मुझे लगता है कि मुझे एक ऐसा बाज़ याद आ रहा था जिसमें दो अलग-अलग जंप हाइट थे, मुझे लगता है कि यह सुपर मैरियो गेम्स में से एक था। जब आप जंप बटन को पकड़ते हैं तो ऊंची छलांग होती है, और कूदना वास्तव में एक दो भाग की छलांग होती है, जो शुरुआती नियमित छलांग के साथ शुरू होती है, इसके बाद दूसरा आवेग आता है जो आपको ऊंचा उठाता है।
तो, आप क्या चाहते हैं कि आपकी छलांग कैसी लगे? आप किस तरह का नियंत्रण चाहते हैं कि खिलाड़ी को कूदना पड़े?
मैं इसके साथ क्या शुरू करूंगा:
अकेले गुरुत्वाकर्षण छोड़ें (अर्थात इसे कभी न बदलें)। जब कोई खिलाड़ी जंप बटन दबाता है, तो जंप बल तब तक लगाएं जब तक खिलाड़ी जंप बटन (कुछ समय सीमा तक) दबा रहा हो। फिर जब खिलाड़ी कूद बटन जारी करता है, तो वह किसी भी कूद बल को फिर से लागू नहीं कर सकता (यानी वह फिर से कूद नहीं सकता) जब तक कि वह पहले जमीन को नहीं छूता है, जिस बिंदु पर जंप फिर से सक्षम होते हैं।
super meat boy
, जो मुझे लगता है कि एक ही कूद प्रभाव है जो आप चाहते हैं, ऐसा लगता है कि जब तक आप जंप बटन दबाते हैं, तो एक बल चरित्र पर लागू होता है, यह गुरुत्वाकर्षण के विपरीत है और इससे छोटा है, और बाकी जैसा अल्हॉव्स्की ने कहा है। अगर मैं कुछ इस तरह लागू करने वाला होता तो मैं कूदते बल के रूप में 60% -80% गुरुत्वाकर्षण के साथ कुछ शुरू करता।
मैंने कुछ लोगों को ऐसा करते देखा है:
एक वैरिएबल बनाएं (मैं इसे कॉल करूंगा jumpTime
) (नंबर / डबल / फ्लोट)। जब जंप की दबाया जाता है, तो jumpTime
कुछ संख्या पर सेट करें (यानी 0.5
। यह सेकंड की संख्या होगी जो जंप कुंजी को प्रभावित करेगा)।
फिर, हर कदम के लिए, वेग के लिए सेट jumpTime
कुछ अन्य संख्या से गुणा, और कमी jumpTime
से delta
(प्रत्येक चरण के बीच समय अंतर)।
दोहराएं कि जब 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;
हालाँकि, स्थिरांक के लिए कुछ मान (जैसे "गुरुत्वाकर्षणसंकेतन" और "जंपकॉस्टेंट") हालांकि अवास्तविक कूद देंगे। लेकिन कभी-कभी खेल यथार्थवादी नहीं होते हैं! ( अद्यतन ऊपर अद्यतन अनुभाग देखें)
यह प्रश्न पहले से ही एक वर्ष से अधिक पुराना है, लेकिन मुझे आशा है कि यह मदद करता है!
जैसा कि ओल्होव्स्की ने कहा है, कूदने का समय उस समय तय किया जाता है जब आप मैदान छोड़ते हैं, उसके बाद नहीं।
यदि आप वास्तव में जेटपैक प्रभाव से बचना चाहते हैं, तो मैं केवल दो तरीके देखता हूं: उच्च कूदने के लिए एक प्रमुख संयोजन , या मूल रूप से कूदने के काम के तरीके को बदलना:
कुंजी दबाते ही खिलाड़ी कूदने के बजाय, कुंजी जारी होने तक कूदने में देरी करें । तो मूल रूप से कुंजी प्रेस की अवधि यह नियंत्रित करती है कि खिलाड़ी के पैरों में वसंत तनाव कितना है, और बाद में जारी किया गया।
बेशक, यह मूल रूप से खेल यांत्रिकी को बदल देता है और खिलाड़ी के लिए अपरिचित हो सकता है। लेकिन प्रभाव काफी दिलचस्प हो सकता है और अच्छी तरह से अपरिचित के लायक हो सकता है।
मैंने डेविड गौविया के सवाल के जवाब में एक और समाधान पाया है " चरित्र कूद कैसे करें? "
उनका विचार एक वेग सेट करने का था जब खिलाड़ी कूद बटन दबाता है। हर फ्रेम में यह केवल गुरुत्वाकर्षण की गणना करता है। हालाँकि, जब खिलाड़ी बटन छोड़ता है, तो यह वेग को एक छोटे मान पर सेट करता है यदि वेग इससे अधिक हो। वेग केवल गुरुत्वाकर्षण द्वारा प्रत्येक फ्रेम को घटाया जाता है।
मुझे उसका जवाब चोरी नहीं करना चाहिए, इसलिए आगे बढ़ें और उसकी पोस्ट पढ़ें। उनका समाधान " वैरिएबल हाइट जंप " अनुभाग के तहत है।
तो वास्तव में लोग इस समस्या को हल करने के लिए कई अलग-अलग तरीकों से आए ...
http://excitemike.com/JumpingControlTester (विभिन्न खेलों में विभिन्न जंपिंग तंत्र को दिखाता है)
http://meyermike.com/wp/?p=175 (मारियो के कूदने के मार्ग की भी चर्चा)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps (3 अलग-अलग तरीकों का वर्णन करता है)
संभवतः अधिक (बहुत अधिक खोज परिणामों के माध्यम से नहीं गया है, लेकिन "चर कूद ऊंचाई" मदद करता है)