मैं मंदी को कैसे लागू करूं?


11

मैं कहता हूं "मंदी" क्योंकि मैं इस समय त्वरण का उपयोग नहीं कर रहा हूं; मेरा मतलब है कि वेग शून्य की ओर वापस बढ़ रहा है, अंततः रुक रहा है।

मैं वैक्टर के लिए नया हूं और भौतिकी और इस तरह से बहुत अच्छा नहीं हूं। सामान्य रूप से "मंदी" को कैसे नियंत्रित किया जाता है?


मेरे पास अब क्या काम है, लेकिन यह एक तरह का हैकिश है

update:function(Game, t, dt) {
    var speed = Game.Input.isKeyDown('shift') ? 8 : 4;

    if (Game.Input.isKeyDown('a')) {
        this.velocity.i -= speed;
    }
    else if (Game.Input.isKeyDown('d')) {
        this.velocity.i += speed;
    }
    else {
        if (Math.abs(this.velocity.i) > 3) {
            this.velocity.i += (this.velocity.i > 0) ? -speed : speed;
        }
        else {
            this.velocity.i = 0;
        }
    }

    if (Game.Input.isKeyDown('w')) {
        this.velocity.j -= speed;
    }
    else if (Game.Input.isKeyDown('s')) {
        this.velocity.j += speed;
    }
    else {
        if (Math.abs(this.velocity.j) > 3) {
            this.velocity.j += (this.velocity.j > 0) ? -speed : speed;
        }
        else {
            this.velocity.j = 0;
        }
    }

    this.updateVectors(dt);
}

मैंने 3 का उपयोग किया क्योंकि कुछ भी कम अजीब व्यवहार प्रदर्शित करता है, मैं अनुमान लगा रहा हूं कि अगर मैंने गति बढ़ा दी तो इसे बदलने की आवश्यकता होगी।


2
इसके अलावा छोटे अर्थ विस्तार .. बयान में अपने त्वरण, यानी दर है कि वेग से बदल जाता है वास्तव में है। :)velocity.i += speed;speed
Ipsquiggle

फ़्लिक्सल इस "ड्रैग" को कॉल करता है, यदि आप ऐसे शब्द की तलाश कर रहे हैं जो त्वरण से स्वतंत्र है।
ग्रेगरी एवरी-वियर

"मंदी" नकारात्मक त्वरण है। क्या आपने कैलकुलस लिया है?
डीएवी

1
वास्तव में "मंदी" एक वास्तविक चीज नहीं है, न ही "नकारात्मक त्वरण" है। यह सभी नियमित त्वरण है, बस अलग-अलग दिशाओं में।
MichaelHouse

जवाबों:


16

कुछ सरल के रूप में

this.velocity.i *= 0.9;

अच्छी तरह से काम करता है।


हे, मुझ पर भरोसा करो कि यह बहुत बुरा है। मैंने अभी हाल ही में पढ़ा कि आप बुनियादी वायु प्रतिरोध को 0.9 से गुणा करके अनुकरण कर सकते हैं और फिर भी यह ध्यान में नहीं आया। धन्यवाद।
Xavura

हाहा, अरे वाह, हाँ। मैं एक व्युत्क्रमानुपाती वेक्टर की गणना कर रहा था और इसे धीमा करने वाले कारक से गुणा कर रहा था। मैंने ऐसा क्यों नहीं किया? कभी-कभी वास्तव में स्पष्ट उत्तर याद करने में सबसे आसान होते हैं।
कोडेक्सआर्कनम

7

Pseudocode में, मैं इसके रूपांतर करता हूं:

स्पीड + = ((मूवडायरेक्शन * मैक्सिमपिड) - स्पीड) * एक्सेलेरेशन फ़ेक्टर

कहाँ पे:

  • गति वर्तमान गति है जो इकाई वर्तमान अक्ष पर यात्रा कर रही है।
  • MoveDirection वह दिशा है जिसे इकाई वर्तमान अक्ष पर यात्रा करने की कोशिश कर रही है, 1 आगे है, 0 अभी भी है और -1 पीछे है। बीच के सभी मूल्यों की अनुमति है।
  • मैक्सिममस्पीड एक निरंतरता है जो यह निर्धारित करती है कि इकाई वर्तमान अक्ष पर यात्रा कर सकती है।
  • AccelerationFactor 0 और 1 के बीच एक स्थिर है जो त्वरण और मंदी की दर का प्रतिनिधित्व करता है। 1 त्वरित है, और 0 कभी नहीं चलेगा।

जो एक्सेलेरेशन और डिसेलेरेशन दोनों को लाइन के बजाय एक घुमावदार तरीके से हैंडल करता है । यदि आप अलग-अलग त्वरण और मंदी दर चाहते हैं, तो आप IF कथन कर सकते हैं जो यह निर्धारित करता है कि खिलाड़ी विपरीत दिशा में जाने या स्थानांतरित करने का प्रयास नहीं कर रहा है।


1
यह बहुत दिलचस्प सूत्र है। मैं भविष्य के लिए ध्यान में रखना होगा!
Ipsquiggle

+1 दिलचस्प लगता है, मुझे लगता है कि मैं इसे काम करने के लिए इसे किसी कोड में फेंक सकता हूं।
डेविड यंग

बहुत अच्छा सूत्र। मैं इसका उपयोग करने जा रहा हूं। आपने इसे कहां से लिया? या आपने इसे खुद निकाला है?
रेकी

जवाब देने में देरी के लिए क्षमा करें, मैं अस्पष्ट रूप से ब्लिट्ज 3 डी डेमो में से एक के कोड से प्रेरित होकर याद करता हूं, मुझे याद नहीं है कि हालांकि कौन सा है।
०१:५५ पर बाज

3

यहां उत्तर ( vel = vel * 0.9) वास्तव में भीग रहे हैं , न कि मैं जो 'मंदी' पर विचार करूंगा ।

मैं अक्सर इस तरह से मंदी करता हूं:

if ( Game.Input.isKeyDown( "w" ) )
{
    this.velocity.i = Math.max( -WALKSPEED, this.velocity.i - WALKFORCE);
}
else if ( Game.Input.isKeyDown( "d" ) )
{
    this.velocity.i = Math.min( WALKSPEED, this.velocity.i + WALKFORCE);
}
else
{
    if (this.velocity.i < 0)
    {
        this.velocity.i = Math.min( 0, this.velocity.i + WALKFORCE);
    }
    else if (this.velocity.i > 0)
    {
        this.velocity.i = Math.max( 0, this.velocity.i - WALKFORCE);
    }
}

कुछ पेशेवरों और विपक्ष बनाम भिगोना:

पेशेवरों :

  • तेजी त्वरण और धीमा त्वरण दोनों रैखिक हैं, जो एक सुखद सूक्ष्म 'गेम फील' देता है जो मुझे लगता है कि भिगोना प्रदान नहीं करता है। यह महत्वपूर्ण हिस्सा है।
  • पुनरावृत्तियों की एक अनुमानित संख्या के बाद चरित्र एक पूर्वानुमानित पूर्ण विराम पर आता है।

विपक्ष :

  • यह लागू करने के लिए मुश्किल है अगर आप गैर-ऑर्थोगोनल गति का उपयोग कर रहे हैं (जो आपको लगता है कि आप कर रहे हैं?) मूल रूप से, आपको एक बल वेक्टर प्राप्त करना होगा जो वेग के साथ संरेखित हो, लंबाई की तुलना करें, और एप्रीकॉर्पोरेट को घटाएं या शून्य-आउट करें। (यदि आप चाहते हैं कि कोड के साथ समझाया जाए, तो बस पूछें।)

1

बहुत सरलता से, छद्म कोड में:

if(no movement keys pressed) [Meaning we want to start to decelerate]
current speed *= 0.85 [Or some number between 0 and 1, the smaller the faster the deceleration]

हालांकि, आपको यह जांचने की आवश्यकता होगी कि क्या (वर्तमान गति <0.001f) या कुछ और 0 पर सेट है।


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