Ada satu hal yang membingungkan saya, dan itu adalah bagaimana menerapkan lompatan 'impuls-impuls' pada platformer. Jika Anda tidak tahu apa yang saya bicarakan, maka pikirkan lompatan Mario, Kirby, dan Kutipan dari Cave Story. Apa kesamaan mereka? Nah, ketinggian lompatan Anda ditentukan oleh berapa lama Anda terus menekan tombol lompat.
Mengetahui bahwa 'impuls' karakter ini dibangun bukan sebelum lompatan mereka, seperti dalam fisika aktual, tetapi saat berada di udara - yaitu, Anda dapat dengan baik mengangkat jari Anda di tengah ketinggian maksimal dan itu akan berhenti, bahkan jika dengan penghancuran antara itu dan berhenti penuh; itulah sebabnya Anda cukup mengetuk hop dan menahannya untuk lompat jauh -, saya terpesona oleh bagaimana mereka menjaga trajetories mereka sebagai busur.
Implementasi saya saat ini berfungsi sebagai berikut:
Ketika tombol lompat ditekan, gravitasi dimatikan dan koordinat Y avatar dikurangi dengan nilai gravitasi yang konstan. Misalnya, jika semuanya jatuh pada Z unit per tick, itu akan naik Z unit per tick.
Setelah tombol dilepaskan atau batas tercapai, avatar akan mengalami dekaserasi dalam jumlah yang akan membuatnya mencakup unit X hingga kecepatannya mencapai 0; setelah itu, ia mempercepat sampai kecepatannya cocok dengan gravitasi - berpegang pada contoh, saya bisa mengatakan itu mempercepat dari 0 hingga Z unit / centang sambil masih mencakup X unit.
Implementasi ini, bagaimanapun, membuat lompatan terlalu diagonal, dan kecuali kecepatan avatar lebih cepat daripada gravitasi, yang akan membuatnya terlalu cepat dalam proyek saya saat ini (bergerak sekitar 4 piksel per kutu dan gravitasi 10 piksel per kutu, pada framerate dari 40FPS), itu juga membuatnya lebih vertikal daripada horizontal. Mereka yang akrab dengan platformer akan melihat bahwa lompatan karakter busur hampir selalu memungkinkan mereka untuk melompat lebih jauh bahkan jika mereka tidak secepat gravitasi permainan, dan ketika itu tidak, jika tidak dimainkan dengan benar, akan membuktikan dirinya sebagai sangat kontra-intuitif. Saya tahu ini karena saya bisa membuktikan bahwa implementasi saya sangat menjengkelkan.
Adakah yang pernah mencoba mekanik serupa, dan mungkin bahkan berhasil? Saya ingin tahu apa yang ada di balik platformer jumping ini. Jika Anda belum pernah memiliki pengalaman dengan ini sebelumnya dan ingin mencobanya, maka tolong, jangan mencoba untuk memperbaiki atau meningkatkan implementasi yang saya jelaskan, kecuali saya berada di jalan yang benar - cobalah untuk membuat solusi dari menggaruk. Saya tidak peduli jika Anda menggunakan gravitasi, fisika atau yang lainnya, asalkan itu menunjukkan bagaimana impuls semu ini bekerja, itu berhasil.
Juga, saya ingin presentasinya untuk menghindari pengkodean khusus bahasa; seperti, membagikan contoh C ++, atau Delphi ... Sebanyak saya menggunakan kerangka XNA untuk proyek saya dan tidak akan keberatan dengan barang C #, saya tidak punya banyak kesabaran untuk membaca kode orang lain, dan saya pengembang game tertentu dari bahasa lain akan tertarik dengan apa yang kami capai di sini, jadi jangan keberatan tetap berpegang pada kode semu.
Terima kasih sebelumnya.
sumber
Jawaban:
Saya pikir masalah utama Anda ada di sini:
Gravitasi tidak berfungsi seperti itu. Google "gerakan yang dipercepat secara seragam" untuk detailnya, tetapi secara sederhana, seperti yang dikatakan anggota lain, gravitasi adalah akselerasi, bukan kecepatan.
Sederhananya, sementara kecepatan adalah laju perubahan posisi yang konstan dari waktu ke waktu, akselerasi adalah laju perubahan kecepatan yang konstan dari waktu ke waktu.
Jadi urutan pertama bisnis Anda adalah mengubah algoritme jatuh Anda untuk memasukkan akselerasi, bukan hanya kecepatan. Dari pada:
Anda harus melakukan sesuatu seperti
Dengan begitu semuanya akan jatuh dalam parabola, yang merupakan gerakan yang benar secara fisik.
Sekarang, untuk menerapkan lompatan sederhana (kami akan langsung ke pertanyaan Anda tepat setelah ini), Anda cukup mengatur
velocity_y
ke nilai yang diinginkan. Selama tandaacceleration_y
dan keinginan Andavelocity_y
berbeda, objek Anda akan melompat dengan benar (Dengan kata lain, Anda tidak "mematikan gravitasi". Anda tetap menggunakannya, dan cukup atur kecepatan objek ke beberapa nilai yang telah ditentukan).Anda akan melihat bahwa semakin besar
velocity_y
ketika Anda mulai melompat, semakin tinggi pula lompatannya. Jadi untuk menerapkan efek yang Anda inginkan, Anda menambahkan semacam akselerasi ke lompatan (dalam hal fisik, ini berarti menambah kekuatan. Pikirkan menambahkan roket kecil ke objek).Untuk melakukan ini, Anda melakukan hal yang sama seperti sebelumnya, tetapi sekarang akselerasi dan kecepatan harus memiliki tanda yang sama. Anda melakukan ini saat tombol ditekan:
sumber
Solusinya adalah jangan menunda perlambatan. Saat Anda melempar bola ke atas di udara, bola itu tidak bergerak dengan kecepatan konstan hingga mencapai ketinggian maksimum, tetapi melambat dari saat impuls.
Gravitasi bukan kecepatan, tetapi percepatan. Jadi jika seorang pemain memiliki kecepatan ke atas 20 unit, dan gravitasi -10 unit, pada centang berikutnya, kecepatan ke atas akan menjadi 10 unit, pada berikutnya, 0 unit, dll.
Alasan mengapa lompatan Anda terlihat begitu diagonal adalah karena kecepatan pemain Anda naik dan turun adalah konstan. Jadi, jika Anda benar-benar menggambar garis mengikuti jalur pemain, Anda akan melihat garis dengan kemiringan, positif atau negatif, dari nilai gravitasi Anda atas perubahan dalam posisi x.
Agar pemain Anda mengontrol ketinggian lompatan Anda, pemain Anda harus diberikan kecepatan awal berdasarkan dorongan, gravitasi harus dimatikan, dan nilai gravitasi khusus (kurang dari gravitasi biasa) harus diterapkan pada kecepatan pemain. Setelah tombol lompat dilepaskan atau kecepatan pemain mencapai 0, gravitasi normal harus diterapkan.
Dengan cara ini, pemain akan melihat kurva yang bagus selama lompatan mereka, apakah mereka melambat oleh gravitasi biasa atau tidak.
sumber
Cerpennya adalah: Anda akan memiliki bagian non-parabola di lompatan Anda di suatu tempat.
Saya mencoba beberapa pendekatan ketika menerapkan jumping:
Pendakian konstan: Ini tampaknya, pada dasarnya, apa yang Anda coba: memiliki kecepatan vertikal positif tetap sampai tombol dilepaskan, di mana titik gravitasi normal menendang. Busur diagonal pada pendakian, tetapi normal pada musim gugur - ini biasanya terlihat OK, dan (yang lebih penting) terasa OK, karena cukup mudah untuk menilai ketinggian lompatan dengan baik.
Pendakian ditangkap: Di sinilah Anda memulai karakter naik ke atas pada parabola dengan ketinggian maksimum, menerapkan impuls awal. Kemudian, ketika tombol dilepaskan, Anda mengatur kecepatan vertikal ke nol (atau kecepatan kecil ke atas). Ini berarti lompatan terbesar Anda adalah parabola yang dijamin, dan lompatan yang lebih kecil terasa lebih seperti Anda melakukan lompatan besar kemudian melambat.
Impuls awal variabel: Inilah yang akhirnya saya pilih: menekan lompatan akan menerapkan impuls ke atas awal yang cukup untuk lompatan, dan kemudian melanjutkan menerapkan akselerasi ke atas (jauh lebih besar dari gravitasi) selama periode singkat - jendela lompatan - sampai tombol dilepaskan. Setelah jendela lompat ditutup, gerakannya akan menjadi parabola, dan periode impuls awal variabel cukup singkat sehingga tidak terlihat aneh, tetapi cukup lama untuk memberikan pemain yang cukup berpengalaman lingkup untuk mengontrol ketinggian lompatan. Kelemahannya adalah tidak mudah untuk menilai ketinggian lompatan, karena jendelanya jauh lebih kecil dan tidak memiliki korespondensi waktu pelepasan dengan tinggi. Seperti yang terjadi sebagian besar waktu Anda baik menginginkan ketukan atau lompatan penuh pula, jadi itu bukan masalah seperti itu.
Coba ini dan lihat mana yang terasa terbaik.
sumber