Bagaimana saya bisa membuat pemain melompat lebih tinggi jika tombol melompat ditekan lebih lama? Saya saat ini hanya mengurangi gravitasi selama kunci dipegang dan pemain melompat, tetapi ini terlihat aneh.
Bagaimana saya bisa membuat pemain melompat lebih tinggi jika tombol melompat ditekan lebih lama? Saya saat ini hanya mengurangi gravitasi selama kunci dipegang dan pemain melompat, tetapi ini terlihat aneh.
Jawaban:
Pertama, Anda perlu memutuskan seperti apa lompatan yang Anda inginkan.
Dalam kehidupan nyata, ketinggian lompatan ditentukan pada saat Anda meninggalkan tanah. Anda tidak bisa terus melompat lebih tinggi saat Anda sudah di udara.
Jadi, jika Anda dapat mengontrol ketinggian lompatan Anda saat Anda sudah berada di udara, Anda akan mendapatkan semacam efek "jet-pack".
Sepertinya saya ingat sebuah sidescroller yang memiliki dua ketinggian lompatan berbeda, saya pikir itu adalah salah satu permainan super mario. Lompatan yang lebih tinggi terjadi ketika Anda menahan tombol lompatan, dan lompatan itu sebenarnya merupakan lompatan dua bagian, dimulai dengan lompatan reguler awal, diikuti oleh dorongan kedua yang membawa Anda lebih tinggi.
Jadi, kamu ingin seperti apa lompatanmu? Kontrol seperti apa yang Anda inginkan agar pemain dapat melewati lompatan?
Yang akan saya mulai adalah ini:
Biarkan gravitasi sendiri (yaitu tidak pernah mengubahnya). Ketika seorang pemain menekan tombol lompat, terapkan gaya lompat selama pemain menekan tombol lompat (hingga batas waktu tertentu). Kemudian ketika pemain melepaskan tombol lompat, dia tidak dapat menerapkan gaya lompat apa pun lagi (yaitu dia tidak dapat memulai lompatan lagi) sampai dia menyentuh tanah terlebih dahulu, di mana titik lompatan diaktifkan kembali.
super meat boy
, yang saya pikir memiliki efek lompatan yang sama seperti yang Anda inginkan, sepertinya selama Anda menahan tombol lompat, gaya diterapkan pada karakter, itu berlawanan dengan gravitasi dan lebih kecil dari itu, dan sisanya seperti apa yang dikatakan alhovsky. jika saya menerapkan sesuatu seperti itu saya akan mulai dengan sesuatu seperti 60% -80% gravitasi sebagai kekuatan lompat.
Saya telah melihat beberapa orang melakukan ini:
Buat variabel (saya akan menyebutnya jumpTime
) (angka / ganda / float). Ketika tombol lompat ditekan, atur jumpTime
ke beberapa nomor (mis 0.5
. Ini akan menjadi jumlah detik yang menahan tombol lompat akan mempengaruhi).
Kemudian, untuk setiap langkah, atur kecepatan untuk jumpTime
dikalikan dengan angka lain, dan kurangi jumpTime
dengan delta
(perbedaan waktu antara setiap langkah).
Ulangi sampai jumpTime
mencapai nol atau di bawah, atau ketika pemain melepaskan tombol lompat. Setelah itu terjadi, gunakan fisika normal (terapkan akselerasi negatif konstan hingga pemain mencapai tanah).
Anda mungkin perlu menggunakan coba-coba (atau "tebakan logis") untuk menemukan nilai yang cocok untuk "beberapa nomor" itu, kecuali Anda tahu cara melakukannya.
UPDATE: Saya menemukan trik yang membuat lompatan sedikit lebih realistis (karena awalnya lambat naik tetapi kemudian cepat turun). Infinite Mario juga menggunakan baris berikut (293 dari Character.js versi JavaScript) ... this.Ya *= 0.85;
Ini hanya seperti "seret udara", dan membatasi / memperlambat kecepatan karakter ketika di udara. Jadi setiap frame, kalikan kecepatan-y (kecepatan vertikal) dengan angka kurang dari satu sehingga melambat ketika jatuh kembali (dan karena itu baik naik dan turun selama lompatan akan sama dan lebih realistis). Saya tahu, saya tidak bisa menjelaskan ...
Ketika karakter melompat menggunakan metode yang saya jelaskan di atas, itu "naik" lebih cepat kemudian "jatuh kembali ke bawah". Seret, bagaimanapun, memperlambat kecepatan vertikal. Karena kami mengatur kecepatan vertikal agar proporsional dengan jumpTime
setiap frame, hambatan ini tidak banyak berpengaruh pada paruh pertama lompatan. Namun di setengah berikutnya (jatuh kembali ke bawah), kecepatan vertikal tidak mengatur setiap frame, tetapi hanya ditambahkan oleh nomor lain (dalam hal ini adalah konstanta gravitasi). Oleh karena itu, gaya hambat berlaku dalam jatuh, dan karena itu mengurangi kecepatan (ke segala arah), itu memperlambat jatuh, membuatnya mirip dengan babak pertama.
Ada beberapa cara lain untuk menyelesaikan masalah ini, seperti mengurangi pengaruh gravitasi pada karakter saat jatuh. Namun, kita perlu menemukan berapa banyak kita harus mengurangi gravitasi.
Inilah yang saya temukan (dari baris 206 dari Mario.java oleh Markus Persson (Notch)):
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;
}
Versi javascript pada dasarnya adalah https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js yang sama
Ini mirip dengan saran dari Olhovsky, tetapi dalam hal ini gaya akan sebanding dengan jumlah waktu yang dilewati setelah pemain menekan tombol lompat.
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;
Namun, beberapa nilai untuk konstanta (misalnya "gravityConstant" dan "jumpConstant") akan memberikan lompatan yang tidak realistis. Tetapi terkadang game tidak harus realistis! ( pembaruan lihat bagian pembaruan di atas)
Pertanyaan ini sudah lebih dari setahun, tapi saya harap ini membantu!
Seperti yang Olhovsky katakan, ketinggian lompatan ditentukan saat Anda meninggalkan tanah, bukan setelah itu.
Jika Anda benar-benar ingin menghindari efek jetpack, saya hanya melihat dua cara: kombinasi tombol untuk melompat lebih tinggi, atau secara fundamental mengubah cara kerja tombol melompat:
Alih-alih membuat pemain melompat begitu kunci ditekan, tunda melompat sampai kunci dilepaskan . Jadi pada dasarnya durasi tombol tekan mengontrol berapa banyak ketegangan pegas di kaki pemain dibangun, dan kemudian dirilis.
Tentu saja, ini pada dasarnya mengubah mekanisme permainan dan mungkin asing bagi pemain. Tetapi efeknya bisa sangat menarik dan mungkin sepadan dengan ketidakbiasaan.
Saya telah menemukan solusi lain dalam jawaban David Gouveia untuk pertanyaan " Bagaimana cara membuat karakter melompat? "
Idenya adalah mengatur kecepatan ketika pemain menekan tombol lompat. Di setiap frame itu hanya menghitung gravitasi. Namun, ketika pemain melepaskan tombol, itu mengatur kecepatan ke nilai yang lebih kecil jika kecepatan lebih besar dari itu. Kecepatan hanya dikurangi setiap frame oleh gravitasi.
Saya seharusnya tidak mencuri jawabannya, jadi lanjutkan dan baca postingnya. Solusinya ada di bawah bagian " Variable Height Jump ".
Jadi orang benar-benar datang dengan banyak cara berbeda untuk menyelesaikan masalah ini ...
http://excitemike.com/JumpingControlTester (mengilustrasikan berbagai mekanisme melompat di berbagai permainan)
http://meyermike.com/wp/?p=175 (juga membahas jalur lompat Mario)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps (menjelaskan 3 metode berbeda)
mungkin lebih (belum melalui terlalu banyak hasil pencarian, tetapi googling "tinggi lompatan variabel" membantu)