Menentukan player.isFalling () melalui perubahan y?


8

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?


2
Bukankah seorang pemain memiliki kecepatan ke bawah untuk menunjukkan jatuh?
Bebek Komunis

1
Apa "jatuh" dalam kasus Anda? Apakah ini kecepatan turun yang sederhana? Apakah tidak ada permukaan padat tepat di bawahnya? Apakah Anda "jatuh" ketika karakter Anda melompat dari sebuah bangunan dan masih berjalan ke atas, tetapi jelas akan mencapai beton beberapa detik dari sekarang?
Anko

@Aku faling kapan saja tidak masuk akal baginya untuk melompat (karena tidak ada permukaan untuk dilompati)
jmasterx

3
Biasanya mesin fisika harus 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.
Jonathan Connell

@Duck dan @ 3nixios kedengarannya seperti jawaban yang baik, mengapa tidak membuatnya .. ehm jawaban;) Saya, karena seseorang akan
membesarkan hati

Jawaban:


9

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


3

Anda membutuhkan dua boolean, isColidingWithGrounddanisJumping

Saat pengguna menekan tombol lompat, jika isColidingWithGroundada true, dan isJumpingsalah, maka panggil jump()yang ditetapkan isJumpingketrue

Jika ykecepatan pemain positif maka isJumpingsama denganfalse

Jika pemain bertabrakan dengan tanah, maka isColidingWithGround sama dengan true, kalau tidak isColidingWithGroundsama dengan false.

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.


Menggunakan metode ini, akan menarik untuk memeriksa apakah tombol lompat ditekan ketika pemain jatuh, dan jika ditekan seperti 200 ms sebelum menyentuh tanah, panggil jump()lagi.
JCM

2

Cara saya menangani ini adalah setiap pemain memiliki isJumpingboolean yang, ketika mereka melompat, diatur ke true. Ketika mereka bertabrakan dengan permukaan, saya memeriksa apakah itu sesuatu yang bisa mereka lompati dan ketentuan lainnya seperti apakah mereka berdiri rata, dll. Dan mengaturnya false.

Kemudian, ketika mereka mencoba untuk melompat, jika permukaannya bagus dan isJumping == falsesaya 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, isJumpingmasih akan false. Anda dapat memperbaikinya dengan metode Contact Listener EndContact(lihat bagian 9.4 dokumen Box2D . Anda hanya perlu mengatur isJumpingproperti trueketika tabrakan dengan dunia berhenti.


2
Bagaimana jika mereka berjalan di tepi tanpa melompat? isJumpingakan false, tetapi mereka masih tidak diizinkan untuk melompat
BlueRaja - Danny Pflughoeft

@BlueRaja - Poin bagus. Saya lupa tentang itu, saya juga memiliki pemeriksaan pada pelanggaran tabrakan. Lihat EndContactdi 9.4 dari Box2d Docs . Edit jawaban yang diperbarui.
Richard Marskell - Drackir

0

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!


0

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 :)


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.