Yavaşlamayı nasıl uygularım?


11

"Yavaşlama" diyorum çünkü şu anda ivmelenme kullanmıyorum; Demek istediğim, hızı tekrar sıfıra taşımak, sonunda durmak.

Vektörlerde yeniyim ve fizik ve benzeri ile çok iyi değilim. "Yavaşlama" normal olarak nasıl ele alınır?


Şu an sahip olduğum şey işe yarıyor, ama biraz hileli görünüyor .

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

Ben 3 kullandım çünkü daha düşük bir şey garip davranışlar sergiliyor, sanırım hızı yükseltirsem değiştirilmeli.


2
Ayrıca küçük semantik detay .. açıklamada aslında yani hız ile değiştiğine dikkat oranına senin ivme vardır. :)velocity.i += speed;speed
Ipsquiggle

Hızlanmadan bağımsız bir terim arıyorsanız Flixel buna "sürükleme" adını verir.
Gregory Avery-Weir

"Yavaşlama" negatif ivmedir. Matematik aldınız mı?
3Dave

1
Aslında “Yavaşlama” ne gerçek bir şey, ne de “negatif ivmelenme” değildir. Her şey düzenli hızlanma, sadece farklı yönlerde.
MichaelHouse

Yanıtlar:


16

Kadar basit bir şey

this.velocity.i *= 0.9;

güzel çalışıyor.


Heh, bana bu kadar kötü bir şey yapmam konusunda güven . Kısa süre önce okudum, temel hava direncini 0,9 ile çarparak simüle edebileceğinizi ve yine de akla gelmediğini okudum. Teşekkür ederim.
Xavura

Haha, oh vay, evet. Normal bir ters vektör hesaplayıp yavaşlama faktörü ile çarpıyordum. Neden bunu yapmadım? Bazen gerçekten açık cevaplar kaçırılması en kolay olanlardır.
CodexArcanum

7

Pseudocode, ben bu varyasyonları yapmak:

Hız + = ((MoveDirection * MaximumSpeed) - Hız) * Hızlanma Faktörü

Nerede:

  • Hız, varlığın mevcut eksende kat ettiği mevcut hızdır.
  • MoveDirection, varlığın mevcut eksende hareket etmeye çalıştığı yön, 1 ileri, 0 sabit ve -1 geri. Aradaki tüm değerlere izin verilir.
  • MaximumSpeed, varlığın mevcut eksende hareket edebileceği en hızlısı belirleyen bir sabittir.
  • Hızlanma Faktörü, hızlanma ve yavaşlama oranını temsil eden 0 ile 1 arasında bir sabittir. 1 anında olur ve 0 asla hareket etmez.

Hangi kolları hem bir eğri yerine doğrultusunda güzel hızlanma ve yavaşlama. Farklı hızlanma ve yavaşlama oranları istiyorsanız, oynatıcının ters yönde hareket etmemeye veya hareket etmemeye çalıştığını belirleyen IF ifadeleri yapabilirsiniz.


1
Bu çok ilginç bir formül. Gelecek için bunu aklımda tutmam gerekecek!
Ipsquiggle

+1 İlginç görünüyor, sanırım çalıştığını görmek için bazı kodlara atabilirim.
David Young

Çok iyi formül. Bunu kullanacağım. Nereden aldın? Yoksa kendin mi türettin?
Riki

Yanıt vermede geciktiğim için üzgünüm, belirsiz bir şekilde Blitz3D demolarından birinin kodundan ilham aldığını hatırlıyorum, hangisini hatırlayamıyorum.
earok

3

Burada cevapları ( vel = vel * 0.9) aslında olan sönümleme değil ben dikkate alacağını, 'yavaşlama' .

Sık sık böyle yavaşlama yaparım:

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

Bazı artıları ve eksileri sönümleme:

Artıları :

  • Hızlanma hızlanma ve yavaşlama hızlanma doğrusaldır, bu da sönümlemenin sağlayamadığını düşündüğümüz hoş bir 'oyun hissi' verir. Bu önemli kısım.
  • Karakter, tahmin edilebilir sayıda tekrardan sonra tahmin edilebilir bir tam durma noktasına gelir.

Eksileri :

  • Ortogonal olmayan bir hareket kullanıyorsanız (ki bu sizin gibi geliyor mu?) Uygulamak daha zordur. (Bunun kodla açıklanmasını istiyorsanız, sormanız yeterlidir.)

1

Çok basit bir şekilde, sözde kodla koymak:

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]

Ancak, (geçerli hız <0.001f) veya başka bir şey olup olmadığını kontrol etmeniz ve 0'a ayarlamanız gerekir.


Ben de bir çek koymak zorunda olacağını düşündüm, ama biri olmadan çalışmak gibi görünüyor.
Xavura
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.