Làm thế nào để tôi thực hiện giảm tốc?


11

Tôi nói "giảm tốc" vì hiện tại tôi không sử dụng gia tốc; ý tôi là di chuyển vận tốc về không, cuối cùng dừng lại.

Tôi chưa quen với vectơ và không tuyệt vời lắm với vật lý. Làm thế nào là "giảm tốc" thường được xử lý?


Những gì tôi có bây giờ hoạt động, nhưng nó có vẻ như là hackish .

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);
}

Tôi đã sử dụng 3 vì bất cứ điều gì thấp hơn thể hiện hành vi kỳ lạ, tôi đoán nếu tôi tăng tốc độ thì nó sẽ cần phải được thay đổi.


2
Ngoài ra chi tiết nhỏ ngữ nghĩa .. trong báo cáo kết quả velocity.i += speed;các speedlà trong thực tế khả năng tăng tốc của bạn, tức là tỷ lệ mà vận tốc thay đổi theo. :)
Ipsquiggle

Flixel gọi đây là "kéo", trong trường hợp bạn đang tìm kiếm một thuật ngữ không phụ thuộc vào gia tốc.
Gregory Avery-Weir

"Giảm tốc" là gia tốc âm. Bạn đã tính toán chưa?
3Dave

1
Trên thực tế "Giảm tốc" không phải là một điều có thật, cũng không phải là "gia tốc âm". Đó là tất cả gia tốc thường xuyên, chỉ theo các hướng khác nhau.
MichaelHouse

Câu trả lời:


16

Một cái gì đó đơn giản như

this.velocity.i *= 0.9;

hoạt động độc đáo.


Heh, tin tưởng tôi để làm phức tạp nó quá tệ. Tôi mới đọc gần đây rằng bạn có thể mô phỏng sức cản không khí cơ bản bằng cách nhân 0,9 và điều đó vẫn chưa xuất hiện trong tâm trí. Cảm ơn bạn.
Xavura

Haha, oh wow, vâng. Tôi đã tính toán một vectơ nghịch đảo bình thường và nhân nó với hệ số chậm. Tại sao tôi không làm điều này? Đôi khi các câu trả lời thực sự rõ ràng là dễ bỏ lỡ nhất.
CodexArcanum

7

Trong Pseudocode, tôi thực hiện các biến thể của điều này:

Tốc độ + = ((MoveDirection * MaximumSpeed) - Tốc độ) * AccelerationFactor

Ở đâu:

  • Tốc độ là tốc độ hiện tại mà thực thể đang di chuyển trên trục hiện tại.
  • MoveDirection là hướng mà thực thể đang cố gắng di chuyển trên trục hiện tại, 1 là chuyển tiếp, 0 là tĩnh và -1 là lùi. Tất cả các giá trị ở giữa được cho phép.
  • MaximumSpeed ​​là một hằng số xác định nhanh nhất mà thực thể có thể di chuyển trên trục hiện tại.
  • Gia tốc là một hằng số từ 0 đến 1 đại diện cho tốc độ tăng tốc và giảm tốc. 1 là tức thì và 0 sẽ không bao giờ di chuyển.

Mà xử lý cả Tăng tốc và Giảm tốc độc đáo theo đường cong chứ không phải đường thẳng. Nếu bạn muốn tốc độ tăng tốc và giảm tốc khác nhau, bạn có thể thực hiện các câu lệnh IF xác định xem người chơi có cố gắng không di chuyển hoặc di chuyển theo hướng ngược lại hay không.


1
Đó là một công thức rất thú vị. Tôi sẽ phải ghi nhớ điều đó cho tương lai!
Ipsquiggle

+1 Có vẻ thú vị, tôi nghĩ rằng tôi có thể ném nó vào một số mã để thấy nó hoạt động.
David Young

Công thức rất tốt. Tôi sẽ sử dụng cái này. Bạn đã có được nó từ đâu? Hay bạn đã tự mình lấy được nó?
Riki

Xin lỗi vì sự chậm trễ khi trả lời, tôi mơ hồ nhớ được truyền cảm hứng từ mã của một trong những bản demo Blitz3D, mặc dù vậy tôi không thể nhớ cái nào.
háo hức

3

Những câu trả lời ở đây ( vel = vel * 0.9) đang thực sự giảm xóc , không phải những gì tôi sẽ xem xét 'giảm tốc' .

Tôi thường làm giảm tốc như thế này:

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);
    }
}

Một số ưu và nhược điểm so với giảm xóc:

Ưu điểm :

  • Việc tăng tốc tăng tốc và tăng tốc chậm đều là tuyến tính, điều này mang lại cảm giác 'trò chơi' tinh tế dễ chịu mà tôi nghĩ rằng giảm xóc không cung cấp. Đây là phần quan trọng .
  • Nhân vật đi đến một điểm dừng hoàn toàn có thể dự đoán được sau một số lần lặp có thể dự đoán được.

Nhược điểm :

  • Điều này sẽ khó thực hiện hơn nếu bạn đang sử dụng chuyển động không trực giao (nghe có vẻ giống bạn?) Về cơ bản, bạn phải có được một vectơ lực được căn chỉnh với vận tốc, so sánh độ dài và trừ hoặc không xuất hiện dưới dạng phù hợp. (Nếu bạn muốn giải thích bằng mã, chỉ cần hỏi.)

1

Rất đơn giản, đặt mã giả:

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]

Tuy nhiên, bạn sẽ cần kiểm tra xem (tốc độ hiện tại <0,001f) hay thứ gì đó và đặt thành 0.


Tôi hình dung tôi cũng sẽ phải đặt một tấm séc, nhưng có vẻ như nó không hoạt động.
Xavura
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.