Fisika Platformer 2D yang Baik [ditutup]

76

Saya memiliki pengendali karakter dasar yang diatur untuk platformer 2D dengan Box2D, dan saya mulai men-tweak untuk mencoba membuatnya terasa enak. Mesin fisika memiliki banyak tombol untuk diubah, dan tidak jelas bagi saya, menulis dengan mesin fisika untuk pertama kalinya, mana yang harus saya gunakan. Haruskah melompat menerapkan kekuatan untuk beberapa kutu? Impuls? Atur kecepatan secara langsung? Bagaimana cara menghentikan avatar dari menempel ke dinding tanpa menghilangkan semua gesekannya (atau apakah saya menghilangkan semua gesekan, tetapi hanya di udara)? Haruskah saya memodelkan karakter sebagai kapsul? Sebuah kotak dengan sudut bulat? Sebuah kotak dengan dua roda? Hanya satu roda besar? Saya merasa seseorang pasti pernah melakukan ini sebelumnya!

Tampaknya ada sangat sedikit sumber daya yang tersedia di web yang bukan "fisika pertama bayi", yang semuanya memotong di mana saya berharap seseorang telah menyelesaikan masalah. Sebagian besar contoh mesin fisika untuk platformer memiliki kontrol perasaan ringan, atau lompatan di udara, atau perilaku yang mudah dieksploitasi ketika penetrasi sementara terlalu tinggi, dll.

Beberapa contoh yang saya maksud:

  • Ketukan pendek melompat melompat jarak pendek; ketukan panjang melompat lebih tinggi.
  • Penyaradan pendek saat berhenti atau membalikkan arah dengan kecepatan tinggi.
  • Berdiri stabil di tanjakan (tapi mungkin meluncur ke bawah saat menunduk).
  • Kecepatan analog saat menggunakan pengontrol analog.
  • Semua hal lain yang memisahkan platformer yang baik dari platformer yang buruk.
  • Berani saya sarankan, platform bergerak stabil?

Saya tidak benar-benar mencari "hei, lakukan ini." Jelas, hal yang benar untuk dilakukan adalah bergantung pada apa yang saya inginkan dalam permainan. Tapi saya berharap seseorang di suatu tempat telah melalui berbagai kemungkinan dan berkata "teknik baik A memang menonjolkan X dengan baik, teknik B baik Y, tetapi itu tidak bekerja dengan C", atau memiliki beberapa contoh yang berhasil di luar "jika (kunci = = spasi) character.impulse (0, 1) "

Josh
sumber

Jawaban:

25

Agak sulit untuk menerapkan, katakanlah, fisika 'mirip Mario' menggunakan mesin fisika sungguhan.

Terakhir kali saya mencoba ini, menggunakan Chipmunk, saya membuat model pemain sebagai 2 lingkaran - 'lingkaran tubuh' di atas 'lingkaran kaki'

'Lingkaran kaki' memiliki beberapa gesekan, tidak melenting, dan cukup kecil. 'Lingkaran tubuh' lebih besar dan tanpa gesekan, untuk menghindari menempel pada dinding / lereng curam

Objek dibatasi untuk tidak memungkinkan rotasi - itu hanya akan meluncur

Jika 'kaki' menyentuh sesuatu, atau berada di dalam beberapa frame terakhir (untuk memungkinkan jatuh lereng), pemain dianggap sebagai di tanah (mungkin memiliki cek permukaan yang normal, juga)

Sudah lama sejak saya melihat kode, tetapi perilaku itu di sepanjang baris:

Ketika di tanah:

  • Terapkan 'gravitasi tambahan' (gaya ke bawah untuk membantu berlari menuruni lereng)
  • Terapkan gesekan tanah (jumlah redaman horizontal lebih besar)
  • Terapkan kekuatan gerakan kiri / kanan, berdasarkan kontrol.
  • (Turunkan kekuatan gerakan kiri / kanan saat mendekati kecepatan lari maksimum)
  • Jika lompatan ditekan, terapkan dorongan ke atas

Saat di udara:

  • Terapkan hambatan udara (sedikit redaman horizontal)
  • Terapkan gravitasi reguler (atau berkurang)
  • Terapkan kekuatan gerakan kiri / kanan, jika Anda mengizinkan kontrol di udara

Anda harus sedikit berhati-hati dengan beralih di antara kedua kondisi - ingat bahwa ketika berlari menuruni lereng, Anda dapat meninggalkan tanah untuk beberapa bingkai - Anda mungkin tidak ingin berganti status / melarang lompat pada saat itu

Namun, beberapa hal lain yang harus diwaspadai ... platform 'loncatan' bisa sulit diterapkan, dan ketika Anda mulai melakukan hal-hal menyenangkan (platform bergerak, dunia berputar, dll.), Anda harus berhati-hati untuk pastikan pemain tidak bisa terjebak / dihancurkan oleh objek bergerak 'animasi didorong'.

bluescrn
sumber
Saya tahu ini adalah jawaban yang cukup lama tetapi saya punya beberapa pertanyaan tentang ini. 1) Bagaimana Anda memecahkan "menjaga kecepatan yang sama di mana pun lereng Anda berada?" 2) Jika Anda menggunakan lingkaran kecil untuk kaki dan lingkaran yang lebih besar untuk tubuh, bukankah pemain akan digantung di tepian beberapa kali? Saya sangat tertarik dengan pendekatan Anda.
Notbad
18

Jujur saya tidak berpikir menggunakan mesin fisika adalah pendekatan yang tepat untuk sesuatu dari domain ukuran itu dengan persyaratan super ketat.

Cukup tulis sendiri semuanya. Anda akan mendapatkan hasil yang lebih baik dengan mengatakan "pindahkan karakter ke atas dengan x unit dalam bentuk parabola ini ketika menahan tombol lompat untuk panjang y" daripada dengan memiliki banyak tombol untuk mengubah.

Tetrad
sumber
Saya sudah melakukan ini beberapa kali di masa lalu. Ini bekerja pada satu titik, tetapi Anda selalu membuang sesuatu yang lain karena itu "terlalu sulit" untuk melakukan fisika dengan benar dengan pengontrol peretasan. Dalam permainan khusus ini saya berharap untuk melibatkan beberapa pegas / tali mekanik untuk gerakan pemain, dan itu masuk ke ranah "Saya lebih suka merobohkan mesin fisika nyata" daripada "Saya lebih suka meretas sebuah kotak penggerak".
3
Saya lebih suka meretas penggerak kotak, setidaknya itu tidak bisa menjadi tidak stabil, sedangkan mesin fisika cenderung meledak jika Anda melemparkan terlalu banyak kekuatan di atasnya karena Anda perlu membatasi gerakan ke spesifikasi yang tepat (dan kendala mesin fisika tidak t kaku, mereka hanya bisa berusaha untuk mematuhi begitu banyak). Juga, menerapkan kekuatan untuk memecahkan satu masalah yang tidak diinginkan cenderung memengaruhi segala sesuatu yang lain, yang mengarah ke neraka tweaker.
Kaj
10

Saya menulis serangkaian artikel tentang membangun permainan platform dari bawah ke atas menggunakan teknologi modern dan itu termasuk bagaimana saya menangani fisika sederhana:

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

Namun jika Anda menginginkan sesuatu yang lebih berteknologi tinggi, sangat mungkin untuk melakukan pendekatan ini menggunakan mesin fisika penuh. Berikut adalah teknik yang dapat Anda gunakan (dari Little Big Planet) yang menjadikan karakter pemain bagian yang sepenuhnya terintegrasi dari mesin fisika:

Alih-alih menerapkan impuls atau mengatur kecepatan untuk memindahkan pemain sebagai 'input eksternal' ke mesin fisika, Anda dapat mengembangkan kendala yang mengontrol karakter.

Jadi batasan ini akan memiliki kecepatan dan arah yang diinginkan pemain sebagai input (dari permainan) dan akan memodelkan hal-hal seperti kekuatan dan kecepatan maksimum pemain. Batasan akan mencoba untuk menggerakkan pemain sesuai dengan inputnya (dan mematuhi maksimum), dan karena kendala itu akan menerapkan kekuatan yang sama dan berlawanan pada objek pemain berdiri, sehingga memungkinkan pemain untuk berdiri di atas platform yang bergerak dan untuk mempengaruhi hal-hal yang ia pindah.

Melakukan hal-hal seperti ini berarti Anda dapat membuat pemain benar-benar secara alami dapat menghadapi situasi seperti berada di bawah tumpukan besar kotak, atau melompat di beberapa platform yang bergerak karena ia sekarang menjadi bagian inti dari mesin fisika.

Semoga itu bisa membantu!

Salam, Paul.

kelinci liar
sumber
6

Pertanyaan ini telah melihat diskusi yang signifikan di forum Box2D. Membaca diskusi tentang gerakan karakter, melompat, atau platformer dan Anda akan menemukan setiap masalah yang mungkin terjadi. Namun, masalah menjadi cukup rumit sehingga sistem penyaringan tabrakan diperbarui dan contoh Test Bed dibuat semata-mata untuk menunjukkan bagaimana itu harus dilakukan.

deft_code
sumber