Saat ini saya menggunakan Box2D dan karakter saya adalah sekelompok perlengkapan di Box2D. Saya bertanya-tanya apakah, untuk menentukan apakah seorang pemain jatuh, mendeteksi perubahan posisi Y akan tepat?
Apakah mungkin ada cara lain yang tidak saya pikirkan? Bagaimana hal semacam ini biasanya terdeteksi?
Jawaban:
(Dari komentar saya.) Saya tidak terbiasa dengan Box2D, tetapi biasanya mesin fisika akan memberi Anda cara untuk memeriksa normal tabrakan.
Jika 'naik' ini berarti pemain Anda berdiri di atas sesuatu, dan harus bisa melompat.
Sebaliknya jika dia tidak bertabrakan, atau jika tidak ada tabrakan yang mengarah ke atas maka dia jatuh.
sumber
Anda membutuhkan dua boolean,
isColidingWithGround
danisJumping
Saat pengguna menekan tombol lompat, jika
isColidingWithGround
adatrue
, danisJumping
salah, maka panggiljump()
yang ditetapkanisJumping
ketrue
Jika
y
kecepatan pemain positif makaisJumping
sama denganfalse
Jika pemain bertabrakan dengan tanah, maka isColidingWithGround sama dengan
true
, kalau tidakisColidingWithGround
sama denganfalse
.Kadang-kadang pemain masih bersentuhan dengan tanah setelah dorongan lompatan awal, dan saya menemukan bahwa dengan menggunakan dua bendera ini, itu mencegah lompatan () dipanggil beberapa kali ketika lompatan ditekan.
sumber
jump()
lagi.Cara saya menangani ini adalah setiap pemain memiliki
isJumping
boolean yang, ketika mereka melompat, diatur ketrue
. Ketika mereka bertabrakan dengan permukaan, saya memeriksa apakah itu sesuatu yang bisa mereka lompati dan ketentuan lainnya seperti apakah mereka berdiri rata, dll. Dan mengaturnyafalse
.Kemudian, ketika mereka mencoba untuk melompat, jika permukaannya bagus dan
isJumping == false
saya membiarkan mereka melompat, kalau tidak mereka tidak bisa melompat. Saya pikir ini lebih baik daripada menghitung tabrakan setiap kali Anda ingin melihat apakah mereka melompat.Sunting
Seperti @BlueRaja tunjukkan di bawah, jika pengguna berjalan keluar dari tepi,
isJumping
masih akanfalse
. Anda dapat memperbaikinya dengan metode Contact ListenerEndContact
(lihat bagian 9.4 dokumen Box2D . Anda hanya perlu mengaturisJumping
propertitrue
ketika tabrakan dengan dunia berhenti.sumber
isJumping
akanfalse
, tetapi mereka masih tidak diizinkan untuk melompatEndContact
di 9.4 dari Box2d Docs . Edit jawaban yang diperbarui.Pindahkan semua komponen yang relevan di "sekelompok perlengkapan" Anda (yang bersama-sama membuat pemain) turun sedikit, dan periksa tabrakan dengan apa pun yang Anda anggap mungkin untuk dilompati. Jika tidak ada tabrakan, pemain jatuh. Kalau tidak, dia tidak. Jangan lupa untuk memindahkan komponen dengan jumlah yang sama.
Jika karakter Anda adalah humanoid, Anda mungkin harus bergerak dan memeriksa hanya kaki karakter tersebut, karena jika tidak, karakter Anda akan dapat melompat bahkan ketika berdiri di atas kepalanya!
sumber
Ini mungkin atau mungkin tidak berlaku, tetapi kami akan mendeteksi perbedaan antara melompat / mendarat dan jatuh sehingga kami tahu kapan harus menukar ke animasi yang jatuh, melakukan kerusakan karena jatuh terlalu lama (tidak terlalu jauh;)) dan sejenisnya.
Itu cukup banyak dilakukan dengan melacak berapa lama suatu objek tanpa titik referensi. Apa pun yang ada di tanah, atau benda lain, memiliki referensi ke apa benda itu berdiri .. Tidak berdiri di atas apa pun? Kemudian Anda berada di udara, dan setelah 1-2 detik, Anda 'jatuh' bukannya mendarat dengan anggun :)
sumber
Sangat naif dan sederhana, Anda dapat memeriksa apakah pemain memiliki kecepatan y (kecepatan, bukan kecepatan) yaitu> 0, dengan asumsi Anda menggunakan (0,0) sebagai kiri atas.
sumber