Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Game Development
  2. Platformer
Gamedevelopment

Fizik Pelantar 2D Asas, Bahagian 3

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Basic 2D Platformer Physics .
Basic 2D Platformer Physics, Part 2
Basic 2D Platformer Physics, Part 4

Malay (Melayu) translation by Seurion (you can also view the original English article)

Platform satu hala

Oleh kerana kami baru saja selesai bekerja di pemeriksaan perlanggaran tanah, kami mungkin juga menambah platform sehala semasa kami berada di situ. Mereka akan bimbang hanya pemeriksaan perlanggaran tanah. Platform sehala berbeza daripada blok pepejal kerana mereka akan menghentikan objek hanya jika ia jatuh. Di samping itu, kami juga akan membenarkan watak turun dari platform sedemikian.

Pertama sekali, apabila kita mahu menurunkan platform sehala, pada dasarnya kita mahu mengabaikan perlanggaran dengan tanah. Cara mudah di sini adalah untuk menetapkan satu offset, selepas lulus mana watak atau objek tidak lagi bertabrakan dengan platform.

Sebagai contoh, jika watak itu sudah dua piksel di bawah bahagian atas platform, ia tidak seharusnya mengesan perlanggaran lagi. Dalam kes itu, apabila kita mahu melepaskan platform, yang perlu kita lakukan ialah memindahkan watak dua piksel ke bawah. Mari buatkan pemalar mengimbangi ini.

Dalam kes itu, apabila kita mahu melepaskan platform, yang perlu kita lakukan ialah memindahkan watak dua piksel ke bawah. Mari buatkan pemalar mengimbangi ini.

Mari ubah suai definisi fungsi HasGround untuk juga merujuk kepada boolean yang akan ditetapkan jika objek telah mendarat pada platform sehala.

Kini, selepas kita memeriksa sama ada jubin kita sekarang adalah penghalang, dan tidak, kita harus memeriksa sama ada ia adalah platform sehala.

Seperti yang dijelaskan sebelum ini, kami juga perlu memastikan bahawa perlanggaran ini tidak diendahkan jika kami telah jatuh di luar cOneWayPlatformThreshold di bawah platform.

Sudah tentu, kita tidak boleh membandingkan perbezaan antara bahagian atas jubin dan sensor, kerana mudah untuk membayangkan bahawa walaupun kita jatuh, kita mungkin akan berada di bawah dua piksel dari bahagian atas platform. Untuk platform sehala untuk menghentikan objek, kami mahu jarak sensor antara bahagian atas jubin dan sensor kurang daripada atau sama dengan cOneWayPlatformThreshold ditambah dengan offset dari kedudukan bingkai ini kepada yang sebelumnya.

Akhirnya, ada satu lagi perkara yang perlu dipertimbangkan. Apabila kita mencari platform sehala, kita tidak boleh keluar dari gelung, kerana terdapat keadaan apabila wataknya sebahagiannya berada di platform dan sebahagiannya pada blok pepejal.

Kita tidak sepatutnya menganggap kedudukan sedemikian sebagai "platform satu hala", kerana kita tidak boleh turun dari sana-blok padu menghalang kita. Itulah sebabnya kita perlu terus mencari blok padu, dan jika ada yang dijumpai sebelum kita memulangkan hasilnya, kita juga perlu menetapkan OnOneWayPlatform palsu.

Sekarang, jika kita melewati semua jubin yang kita perlukan untuk memeriksa secara mendatar dan kita dapati platform satu hala tetapi tidak ada blok pepejal, maka kita dapat memastikan bahawa kita berada di platform satu arah yang dapat kita jatuhkan.

Itulah sebabnya, jadi sekarang mari kita tambah pada kelas watak pilihan untuk menurunkan platform. Dalam kedua-dua keadaan pendirian dan larian, kita perlu menambah kod berikut.

Mari lihat bagaimana ia berfungsi.

Semuanya berfungsi dengan betul.

Mengendalikan Perlanggaran untuk Siling

Kita perlu mencipta fungsi analog ke HasGround untuk setiap sisi AABB, jadi mari bermula dengan siling. Perbezaannya adalah seperti berikut:

  • Talian sensor berada di atas AABB dan bukan di bawahnya
  • Kami memeriksa jubin siling dari bawah ke atas, ketika kami bergerak ke atas
  • Tidak perlu mengendalikan platform sehala

Inilah fungsi yang diubah suai.

Menangani Perlanggaran untuk Dinding Kiri

Begitu juga dengan cara kami mengendalikan pemeriksaan perlanggaran untuk siling dan tanah, kami juga perlu menyemak sama ada objek bertembung dengan dinding di sebelah kiri atau dinding di sebelah kanan. Mari bermula dari dinding kiri. Idea di sini agak sama, tetapi terdapat beberapa perbezaan:

  • Baris sensor berada di sebelah kiri AABB.
  • Bahagian dalaman untuk gelung perlu beralih melalui jubin secara menegak, kerana sensor kini merupakan garis menegak.
  • Gelung luar perlu beralih melalui jubin secara mendatar untuk melihat jika kita tidak melangkau dinding ketika bergerak dengan kelajuan mendatar yang besar.

Menangani Perlanggaran untuk Tembok Kanan

Akhir sekali, mari buat fungsi CollidesWithRightWall, yang mana yang anda bayangkan, akan melakukan perkara yang sama seperti CollidesWithLeftWall, tetapi bukan menggunakan sensor di sebelah kiri, kami akan menggunakan sensor di sebelah kanan watak.

Perbezaan lain di sini adalah bahawa bukannya memeriksa jubin dari kanan ke kiri, kami akan memeriksa mereka dari kiri ke kanan, kerana itu adalah arah yang bergerak.

Gerakkan Objek Daripada Perlanggaran

Semua fungsi pengesanan perlanggaran telah dilakukan, jadi mari menggunakannya untuk menyelesaikan tindak balas perlanggaran terhadap tilemap. Sebelum kita melakukannya, kita perlu memikirkan pesanan di mana kita akan memeriksa perlanggaran. Mari kita pertimbangkan situasi berikut.

Dalam kedua-dua situasi ini, kita dapat melihat watak itu berakhir bertindih dengan jubin, tetapi kita perlu memikirkan bagaimana kita harus menyelesaikan pertindihan itu.

Situasi di sebelah kiri sangat mudah-kita dapat melihat bahawa kita jatuh ke bawah, dan kerana itu kita pasti harus mendarat di atas blok.

Keadaan di sebelah kanan adalah sedikit lebih rumit, kerana sebenarnya kita dapat mendarat di sudut jubin, dan mendorong watak ke puncak adalah masuk akal sebagai menolaknya ke kanan. Mari pilih keutamaan pergerakan mendatar. Tidak semestinya perkara yang kami ingin lakukan terlebih dahulu; kedua-dua pilihan kelihatan betul dalam tindakan.

Mari pergi ke fungsi UpdatePhysics kami dan tambahkan pembolehubah yang akan memegang hasil pertanyaan perlanggaran kami.

Sekarang mari kita mulakan dengan melihat apakah kita harus memindahkan objek ke kanan. Syarat-syarat di sini ialah:

  • kelajuan mendatar kurang atau sama dengan sifar
  • kami bertembung dengan dinding kiri
  • dalam bingkai sebelumnya kami tidak bertindih dengan jubin pada paksi mendatar-keadaan yang serupa dengan yang di sebelah kanan dalam gambar di atas

dalam bingkai sebelumnya kami tidak bertindih dengan jubin pada paksi mendatar-keadaan yang serupa dengan yang di sebelah kanan dalam gambar di atas

Jika keadaan itu benar, kita perlu menyelaraskan bahagian kiri AABB kami ke sisi kanan jubin, pastikan kami berhenti bergerak ke kiri, dan tandakan bahawa kami berada di sebelah dinding di sebelah kiri.

Jika mana-mana syarat selain yang terakhir adalah palsu, kita perlu menetapkan mPushesLeftWall palsu. Itu kerana keadaan terakhir yang palsu tidak semestinya memberitahu kita bahawa watak itu tidak menolak dinding, tetapi sebaliknya, ia memberitahu kita bahawa ia bertabrakan dengannya dalam bingkai sebelumnya. Oleh sebab itu, adalah yang terbaik untuk menukar mPushesLeftWall kepada palsu hanya jika ada dua syarat pertama yang salah juga.

Sekarang mari kita periksa perlanggaran dengan dinding yang betul.

Seperti yang anda dapat lihat, formula itu sama dengan yang kami gunakan untuk memeriksa perlanggaran dengan dinding kiri, tetapi dicerminkan.

Kami sudah mempunyai kod untuk memeriksa perlanggaran dengan tanah, jadi selepas itu kita perlu memeriksa perlanggaran dengan siling. Tidak ada yang baru di sini juga, dan kami tidak perlu melakukan pemeriksaan tambahan kecuali bahawa kelajuan menegak perlu lebih besar atau sama dengan sifar dan kami sebenarnya bertembung dengan jubin yang berada di atas kami.

Pusingan Sudut

Sebelum kita menguji jika tindak balas perlanggaran berfungsi, ada satu perkara yang lebih penting untuk dilakukan, iaitu untuk mengelilingi nilai-nilai sudut yang kita kira untuk pemeriksaan perlanggaran. Kita perlu melakukan itu, supaya pemeriksaan kami tidak dimusnahkan oleh kesalahan terapung, yang mungkin timbul dari kedudukan peta pelik, skala karakter atau hanya saiz AABB yang pelik.

Pertama, untuk kemudahan kami, mari kita buat fungsi yang mengubah vektor terapung menjadi vektor terapung bulat.

Sekarang mari kita gunakan fungsi ini dalam setiap pemeriksaan perlanggaran. Pertama, mari tentukan fungsi HasCeiling.

Seterusnya ialah OnGround.

PushesRightWall.

Dan akhirnya, PushesLeftWall.

Itu sepatutnya menyelesaikan isu kita!

Semak Keputusan

Itulah yang akan terjadi. Mari kita uji bagaimana perlanggaran kita berfungsi sekarang.

Ringkasan

Itulah bahagian ini! Kami telah mendapat set lengkap perlanggaran tilemap, yang sepatutnya sangat dipercayai. Kita tahu di mana kedudukan menyatakan objek pada masa ini: sama ada di atas tanah, menyentuh jubin di sebelah kiri atau di sebelah kanan, atau menembus siling. Kami juga telah melaksanakan platform sehala, yang merupakan alat yang sangat penting dalam setiap permainan platformer.

Di bahagian seterusnya, kami akan menambah mekanik meraih penghujung, yang akan meningkatkan pergerakan watak yang mungkin lebih jauh lagi, jadi tunggu!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.