ฉันจะใช้การลดความเร็วได้อย่างไร


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

Flixel เรียกสิ่งนี้ว่า "drag" ในกรณีที่คุณกำลังมองหาคำที่ไม่ขึ้นอยู่กับอัตราเร่ง
Gregory Avery-Weir

"Deceleration" เป็นการเร่งความเร็วเชิงลบ คุณถ่ายแคลคูลัสแล้วหรือยัง?
3Dave

1
จริงๆแล้ว "การชะลอตัว" ไม่ใช่ของจริงและไม่ใช่ "การเร่งความเร็วเชิงลบ" มันคือการเร่งความเร็วปกติในทิศทางที่ต่างกัน
MichaelHouse

คำตอบ:


16

สิ่งที่ง่ายเหมือน

this.velocity.i *= 0.9;

ทำงานได้ดี


เฮ้เชื่อใจฉันเถอะว่ามันแย่ขนาดนั้น ฉันเพิ่งอ่านเมื่อเร็ว ๆ นี้ว่าคุณสามารถจำลองการต้านแรงดันอากาศขั้นพื้นฐานได้โดยการคูณด้วย 0.9 และยังไม่ทราบ ขอบคุณ.
Xavura

ฮ่าฮ่าว้าวใช่แล้ว ฉันคำนวณเวกเตอร์ผกผันเป็นปกติแล้วคูณมันด้วยปัจจัยชะลอตัว ทำไมฉันไม่ทำเช่นนี้? บางครั้งคำตอบที่ชัดเจนจริงๆนั้นเป็นสิ่งที่พลาดง่ายที่สุด
CodexArcanum

7

ใน Pseudocode ฉันทำสิ่งต่าง ๆ นี้:

Speed ​​+ = ((MoveDirection * MaximumSpeed) - ความเร็ว) * AccelerationFactor

ที่ไหน:

  • ความเร็วคือความเร็วปัจจุบันที่เอนทิตีเดินทางบนแกนปัจจุบัน
  • MoveDirection เป็นทิศทางที่เอนทิตีพยายามเดินทางไปบนแกนปัจจุบัน 1 คือไปข้างหน้า 0 ยังคงและ -1 ย้อนหลัง อนุญาตให้ใช้ค่าทั้งหมดในระหว่าง
  • MaximumSpeed ​​เป็นการกำหนดค่าคงที่ที่เร็วที่สุดที่เอนทิตีสามารถเดินทางบนแกนปัจจุบัน
  • AccelerationFactor เป็นค่าคงที่ระหว่าง 0 และ 1 ที่แสดงถึงอัตราการเร่งความเร็วและการลดความเร็ว 1 คือทันทีและ 0 จะไม่ย้าย

ซึ่งจัดการทั้งการเร่งความเร็วและการลดความเร็วเป็นทางโค้งมากกว่าเส้น หากคุณต้องการอัตราเร่งและลดความเร็วที่แตกต่างกันคุณสามารถทำคำสั่ง IF ที่กำหนดว่าผู้เล่นพยายามที่จะไม่ย้ายหรือเคลื่อนที่ไปในทิศทางตรงกันข้าม


1
นั่นเป็นสูตรที่น่าสนใจมาก ฉันจะจำไว้ว่าในอนาคต!
Ipsquiggle

+1 ดูน่าสนใจฉันคิดว่าฉันอาจใช้รหัสนี้เพื่อดูว่าใช้งานได้หรือไม่
David Young Young

สูตรดีมาก ฉันจะใช้มัน คุณได้มาจากที่ไหน หรือว่าคุณได้มาด้วยตัวเอง?
Riki

ขออภัยสำหรับความล่าช้าในการตอบกลับฉันจำได้ว่าได้รับแรงบันดาลใจจากรหัสของการสาธิต Blitz3D อย่างใดอย่างหนึ่งฉันจำไม่ได้ว่าตัวไหน
earok

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.