Yan kaydırıcılarda değişken yükseklik atlama


10

Atlama tuşu daha uzun basılı tutulursa, oyuncuyu nasıl daha yükseğe atlayabilirim? Şu anda sadece tuş tutulduğu ve oyuncu atladığı sürece yerçekimini azaltıyorum, ama bu garip görünüyor.


belki sadece yerçekimini ne kadar azalttığınız bazı değişikliklerle daha iyi bir atlama eylemi elde edersiniz.
Ali1S232

@Gajet Bu oldukça hantal ve bunu yapmanın garip bir yolu gibi görünüyor.
Komünist Ördek

Hmm, yer çekimini azaltmak bir fizik motoru kullandığınız anlamına gelmez. Durum böyle mi? Atlamak için Impulses kullanıyor musunuz?
Jonathan Connell

Fizik motoru yok ve ben Impulses kullanmıyorum
John Stimac

Hangi durumda, oyuncu nasıl düşer? Pozisyonunu sadece bir hareket * zıplama * yerçekimi vektörüne göre mi çeviriyorsunuz?
Jonathan Connell

Yanıtlar:


9

Öncelikle atlayışın neye benzemesini istediğinize karar vermelisiniz.

Gerçek hayatta, zıplama yüksekliğine yerden ayrıldığınız anda karar verilir. Zaten havadaysanız daha yükseğe zıplayamazsınız.

Zaten havada iken atlama yüksekliğinizi kontrol edebiliyorsanız, bir çeşit "jet-pack" benzeri efekt elde edeceksiniz.

İki farklı atlama yüksekliği olan bir sidecroller'ı hatırlıyorum, sanırım süper mario oyunlarından biri. Daha yüksek atlama, atlama düğmesini basılı tuttuğunuzda meydana geldi ve atlama aslında başlangıçtaki normal atlamadan başlayarak sizi daha yükseğe çıkaran ikinci bir dürtü ile başladı.

Peki, atlayışınızın neye benzemesini istiyorsunuz? Oyuncunun atlayışta nasıl bir kontrole sahip olmasını istiyorsunuz?

Ne ile başlamak budur:

Yerçekimini yalnız bırakın (yani asla değiştirmeyin). Bir oyuncu atlama düğmesine bastığında, atlama düğmesine bastığı sürece atlama kuvvetini uygulayın (bir süre sınırına kadar). Daha sonra oyuncu atlama düğmesini bıraktığında, önce zemine temas edene kadar bir daha atlama kuvveti uygulayamaz (yani tekrar zıplayamaz), bu noktada sıçramalar yeniden etkinleştirilir.


Bunu denedim ve jetpack etkisi elde ettim. Bundan kaçınmanın bir yolu olup olmadığını merak ediyordum.
John Stimac

1
Belki aklınızdaki oyun değil, ama Super Mario 2'de atlamadan önce biraz eğilerek daha yükseğe atladınız. (Bu, belirli bir miktarda sezgisel mantıklıdır, çünkü doğrudan ayakta durma pozisyonundan yapmaya çalışırsanız çok uzağa
atlamazsınız

3
Jcubed: Hıza kuvvet eklemek yerine, kuvveti doğrudan konuma eklemeyi deneyin. Sonra oyuncu hızlanmak yerine doğrusal olarak yukarı hareket edecektir.
Olhovsky

@Jcubed: İstediğinizle super meat boyaynı atlama efektine sahip olduğunu düşündüğüm bazı oyunları oynarken , karaktere bir kuvvet uygulandığında atlama düğmesini basılı tuttuğunuz sürece, yerçekiminin tersine ve ondan daha küçük gibi görünüyor ve dinlenme alhovsky'nin söylediği gibi. böyle bir şey uygulasaydım, atlama gücü olarak yerçekimi% 60-% 80 gibi bir şeyle başlardım.
Ali1S232

1
Bunu her zaman yapıyorum, sadece düğmeyi yeterince kısa tutarak yukarı doğru hızını ayarladığınız zamanı koruyun, böylece fark edilebilir bir jet paketi efekti değil - o zaman Süper Mario gibi olacak, birkaç büyü ile numara tweaks. "Kuvvet" daha küçük yapmayın, sadece jumpHigherTime sona erene veya oyuncu düğmeyi bırakana kadar hızı maksimum atlama hızına sıfırlamaya devam edin ... sadece bir fizik motoruna güveniyor; p
Oskar Duveborn

7

Bazı insanların bunu yaptığını gördüm:

  1. Bir değişken oluşturun (ben diyeceğim jumpTime) (sayı / çift / float). Atlama tuşuna basıldığında, jumpTimebir sayıya ayarlayın (yani 0.5, atlama tuşunu tutmanın saniye cinsinden etkisi olacaktır).

  2. Then, her adım için, hız set jumpTimebaşka bir sayı ile çarpılarak ve azaltmak jumpTimeile delta(her bir adım arasında bir zaman farkı).

  3. Bunu jumpTimesıfıra veya altına ulaşıncaya veya oyuncu atlama tuşunu bırakıncaya kadar tekrarlayın . Bundan sonra, normal fizik kullanın (oyuncu yere ulaşıncaya kadar sabit bir negatif hızlanma uygulayın).

Nasıl yapılacağını bilmiyorsanız, bu "bazı numaralar" için uygun değerleri bulmak için deneme yanılma (veya "mantıksal tahmin") kullanmanız gerekebilir.


GÜNCELLEME: Atlamayı biraz daha gerçekçi yapan hileyi buldum (çünkü başlangıçta yavaş yukarı ama sonra hızlı aşağı iniyor). Sonsuz Mario ayrıca aşağıdaki satırı kullanır (JavaScript sürümünün Character.js'nin 293'ü) ... this.Ya *= 0.85;Bu sadece "hava sürüklemesi" gibidir ve havada iken karakterin hızını sınırlar / yavaşlatır. Az biri çok geri aşağı düşen (ve bu nedenle, her iki zaman yavaşlar daha bir dizi her çerçevede, çarpma y hızı (dikey hız) nedenle yukarı doğru olacak ve aşağı doğru giderek benzer ve daha gerçekçi bir atlama sırasında). Biliyorum, açıklamakta kötüyüm ...

Karakter, başlangıçta yukarıda tarif ettiğim yöntemi kullanarak atladığında, "daha hızlı yükselir" sonra "geriye doğru düşer". Ancak sürükleme, dikey hızı yavaşlatır. Dikey hızı jumpTimeher kareyle orantılı olacak şekilde ayarladığımız için , bu sürüklemenin atlamanın ilk yarısında fazla bir etkisi yoktur. Bununla birlikte, bir sonraki yarıda (aşağıya doğru düşme), dikey hız her kareye ayarlanmaz, sadece başka bir sayı ile eklenir (bu durumda yerçekimi sabiti). Bu nedenle, sürükleme düşmede etkili olur ve hızı (herhangi bir yönde) düşürdüğü için, düşmeyi yavaşlatır ve ilk yarıya benzer hale getirir.

Bununla birlikte, bu sorunu çözmenin, yerçekiminin düşme üzerindeki karakter üzerindeki etkisini azaltmak gibi başka yolları da vardır. Ancak, yer çekimini ne kadar azaltmamız gerektiğini bulmalıyız.


Örnek Olay: Sonsuz Mario

Ben buldum bu (Markus Persson (Notch) tarafından Mario.java 206 satırından):

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

Javascript sürümü temelde aynı https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js

Bu Olhovsky'nin önerisine benzer, ancak bu durumda kuvvet, oyuncu atlama tuşuna bastıktan sonra geçen süre ile orantılı olacaktır.

Javascript sürümüm:

    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;

Ancak, sabitler için bazı değerler (örneğin, "gravityConstant" ve "jumpConstant") gerçekçi olmayan bir sıçrama verecektir. Ancak bazen oyunların gerçekçi olması gerekmez! ( güncelleme yukarıdaki güncelleme bölümüne bakın)

Bu soru zaten bir yıldan daha eski, ama umarım bu yardımcı olur!


2

Olhovsky'nin dediği gibi, atlama yüksekliği bundan sonra değil, yerden ayrıldığınız anda belirlenir.

Jetpack efektinden gerçekten kaçınmak istiyorsanız, sadece iki yol görüyorum: daha yükseğe zıplamak için temel bir kombinasyon veya zıplama tuşunun çalışma şeklini temel olarak değiştirmek:

Tuşa basıldığı anda müzikçaları zıplatmak yerine tuş bırakılana kadar zıplamayı geciktirin . Temel olarak tuşa basma süresi, oyuncunun bacaklarında ne kadar yay gerginliğinin oluştuğunu ve daha sonra serbest bırakıldığını kontrol eder.

Tabii ki, bu oyun mekaniğini temelden değiştirir ve oyuncu için tanıdık olmayabilir. Ancak etki oldukça ilginç olabilir ve yabancılığa değebilir.


2
Sanırım tam da bu tamirciyle bazı platform oyunları oynadığımı hatırlıyorum. Bazı güzel animasyonlarla (karakterin ayaklarında büyüyen toz bulutu gibi) bu sezgisel hissetmek için yapılabilir.
Jari Komppa

2

David Gouveia'nın " Bir karakter zıplaması nasıl yapılır? " Sorusuna başka bir çözüm buldum.

Özet:

Onun fikri, oyuncu atlama düğmesine bastığında bir hız ayarlamaktı. Her çerçevede sadece yerçekimini hesaplar. Ancak, oynatıcı düğmeyi bıraktığında, hız ondan daha büyükse hızı daha küçük bir değere ayarlar. Hız sadece her kareyi yerçekimi ile azaltır.

Cevabını çalmamalıyım, bu yüzden devam et ve görevini oku. Onun çözümü " Değişken Yükseklik Atlama " bölümünde.

Yani gerçekten insanlar bu sorunu çözmenin birçok farklı yolunu buldular ...

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.