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.
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.
Yanıtlar:
Ö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.
super meat boy
aynı 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.
Bazı insanların bunu yaptığını gördüm:
Bir değişken oluşturun (ben diyeceğim jumpTime
) (sayı / çift / float). Atlama tuşuna basıldığında, jumpTime
bir sayıya ayarlayın (yani 0.5
, atlama tuşunu tutmanın saniye cinsinden etkisi olacaktır).
Then, her adım için, hız set jumpTime
başka bir sayı ile çarpılarak ve azaltmak jumpTime
ile delta
(her bir adım arasında bir zaman farkı).
Bunu jumpTime
sı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ı jumpTime
her 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.
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.
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!
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.
David Gouveia'nın " Bir karakter zıplaması nasıl yapılır? " Sorusuna başka bir çözüm buldum.
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 ...
http://excitemike.com/JumpingControlTester (çeşitli oyunlarda farklı atlama mekanizmalarını gösterir)
http://meyermike.com/wp/?p=175 (ayrıca Mario'nun atlama yolunu da tartışıyor)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps (3 farklı yöntemi açıklar)
muhtemelen daha fazla (çok fazla arama sonucundan geçmediniz, ancak googling "değişken atlama yüksekliği" yardımcı olur)