Tinggi variabel melompat di penggulung samping

10

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.

John Stimac
sumber
mungkin hanya dengan beberapa modifikasi dalam berapa banyak Anda mengurangi gravitasi Anda mendapatkan aksi lompatan yang lebih baik.
Ali1S232
@ Gajet Itu agak kikuk dan sepertinya cara yang aneh untuk melakukannya.
Bebek Komunis
Hmm Anda mengatakan mengurangi gravitasi tidak menyiratkan bahwa Anda menggunakan mesin fisika. Apakah ini masalahnya? Apakah Anda menggunakan Impuls untuk melompat?
Jonathan Connell
Tidak ada mesin fisika, dan saya tidak menggunakan Impuls
John Stimac
Dalam hal ini, bagaimana pemain Anda jatuh? Apakah Anda hanya menerjemahkan posisinya sesuai dengan gerakan * lompat * gravitasi vektor?
Jonathan Connell

Jawaban:

9

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.

Olhovsky
sumber
Saya mencobanya, dan saya mendapatkan efek jetpack. Saya bertanya-tanya apakah ada cara untuk menghindari itu.
John Stimac
1
Mungkin bukan permainan yang ada dalam pikiran Anda, tetapi di Super Mario 2 Anda melompat lebih tinggi dengan merunduk sedikit sebelum melompat. (Yang membuat sejumlah akal intuitif, karena Anda tidak melompat terlalu jauh jika Anda mencoba melakukannya langsung dari posisi berdiri.)
Darien
3
Jcubed: Alih-alih menambahkan kekuatan pada kecepatan, coba tambahkan gaya langsung ke posisi. Kemudian pemain akan bergerak ke atas secara linier, alih-alih mempercepat.
Olhovsky
@ Jcubed: ketika memainkan beberapa permainan seperti 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.
Ali1S232
1
Saya melakukan ini sepanjang waktu, teruskan waktu di mana Anda mengatur kecepatan melompat ke atas dengan menahan tombol cukup pendek sehingga itu bukan efek paket jet terlihat - maka itu akan seperti Super Mario cukup mudah, dengan beberapa sihir nomor tweak. Jangan membuat "kekuatan" lebih kecil, tetap atur ulang kecepatan ke kecepatan maksimum sampai jumpHigherTime berakhir atau pemain melepaskan tombol ... juga, saya merasa anak laki-laki daging super melompat menjadi tidak tepat dan menyebalkan, seperti halnya platform apa pun yang melompat yang hanya mengandalkan mesin fisika; p
Oskar Duveborn
7

Saya telah melihat beberapa orang melakukan ini:

  1. Buat variabel (saya akan menyebutnya jumpTime) (angka / ganda / float). Ketika tombol lompat ditekan, atur jumpTimeke beberapa nomor (mis 0.5. Ini akan menjadi jumlah detik yang menahan tombol lompat akan mempengaruhi).

  2. Kemudian, untuk setiap langkah, atur kecepatan untuk jumpTimedikalikan dengan angka lain, dan kurangi jumpTimedengan delta(perbedaan waktu antara setiap langkah).

  3. Ulangi sampai jumpTimemencapai 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 jumpTimesetiap 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.


Studi Kasus: Infinite Mario

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.

Versi javascript saya:

    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!

ErnWong
sumber
2

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.

Konrad Rudolph
sumber
2
Saya pikir saya ingat bermain platformer dengan mekanik itu - jangan meninggalkan tanah sampai Anda "mengisi" lompatan. Dengan beberapa animasi cantik (seperti awan debu yang tumbuh di kaki karakter) ini dapat dilakukan untuk merasa intuitif.
Jari Komppa
2

Saya telah menemukan solusi lain dalam jawaban David Gouveia untuk pertanyaan " Bagaimana cara membuat karakter melompat? "

Ringkasan:

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 ...

ErnWong
sumber