Advertisement
  1. Game Development
  2. Platformer
Gamedevelopment

Fizik Pelantar 2D Asas, Bahagian 4

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Basic 2D Platformer Physics .
Basic 2D Platformer Physics, Part 3
Basic 2D Platformer Physics, Part 5: Object vs. Object Collision Detection

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

Grabbing Ledge

Sekarang kita boleh melompat, turun dari platform sehala dan berjalan-jalan, kita juga boleh melaksanakan merebut langkan. Mekanisme meraih tonggak pastinya tidak perlu dalam setiap perlawanan, tetapi ia adalah satu kaedah yang sangat popular untuk memperluaskan jurang pergerakan pemain semasa masih tidak melakukan sesuatu yang melampau seperti lompat berganda.

Mari lihat bagaimana kita menentukan sama ada langkan boleh ditangkap. Untuk menentukan sama ada watak itu boleh meraih langkan, kami akan sentiasa menyemak sisi watak bergerak ke arah. Jika kita mencari jubin kosong di bahagian atas AABB, dan kemudian sebuah jubin pepejal di bawahnya, maka bahagian atas jubin pepejal itu adalah tajuk yang dapat kita ambil.

Menyediakan Pembolehubah

Mari pergi ke kelas Character kami, di mana kami akan melaksanakan meraih tebing. Tidak ada gunanya melakukan ini dalam kelas MovingObject, kerana kebanyakan objek tidak akan mempunyai pilihan untuk merebut langkan, jadi ia menjadi sisa untuk melakukan apa-apa pemprosesan ke arah itu.

Pertama, kita perlu menambah beberapa pemalar. Mari kita mulakan dengan mewujudkan pemalar mengimbangi sensor.

CGrabLedgeStartY dan cGrabLedgeEndY adalah offset dari bahagian atas AABB; yang pertama adalah titik penderia pertama, dan yang kedua adalah titik sensor yang berakhir. Seperti yang anda dapat lihat, watak itu perlu mencari langkan dalam 2 piksel.

Kami juga memerlukan pemalar tambahan untuk menyelaraskan watak kepada jubin yang baru saja diambil. Untuk watak kami, ini akan ditetapkan kepada -4.

Selain itu, kami juga ingin mengingati koordinat jubin yang kami ambil. Mari kita simpan mereka sebagai pembolehubah watak watak.

Pelaksanaan

Kita perlu melihat sama ada kita boleh merebut langkan dari keadaan melompat, jadi mari kepala di sana. Selepas kita memeriksa sama ada watak itu telah mendarat di atas tanah, mari kita lihat sama ada keadaan untuk meraih langkan itu dipenuhi. Syarat utama adalah seperti berikut:

  • Kelajuan menegak kurang daripada atau sama dengan sifar (watak itu jatuh).
  • Wataknya tidak berada di siling-tiada penggunaan meraih langkan jika anda tidak dapat melompat.
  • Watak bertembung dengan dinding dan bergerak ke arahnya.

Jika ketiga-tiga syarat tersebut dipenuhi, maka kita perlu mencari langkan untuk merebut. Mari kita mulakan dengan mengira kedudukan teratas sensor, yang akan menjadi sudut atas kiri atau kanan atas AABB.

Sekarang, seperti yang anda bayangkan, di sini kita akan menghadapi masalah yang sama dengan yang kami dapati apabila melaksanakan pemeriksaan perlanggaran-jika watak itu jatuh dengan sangat cepat, sebenarnya ia mungkin akan terlepas hotspot di mana ia boleh merebut langkan . Itulah sebabnya kita perlu menyemak jubin yang kita perlukan untuk merebut tidak bermula dari sudut bingkai semasa, tetapi yang sebelumnya seperti yang diilustrasikan di sini:


Imej atas watak adalah kedudukannya dalam bingkai sebelumnya. Dalam keadaan ini, kita perlu mencari peluang untuk meraih tongkat dari sudut kanan atas bingkai AABB sebelumnya dan berhenti di kedudukan bingkai semasa.

Mari dapatkan koordinat jubin yang perlu kita periksa, bermula dengan mengisytiharkan pembolehubah. Kami akan memeriksa jubin dalam satu lajur, jadi semua yang kami perlukan adalah koordinat X lajur serta koordinat atas dan bawah Y.

Mari dapatkan koordinat X dari sudut AABB.

Kami mahu mula mencari langkan dari kedudukan bingkai sebelumnya hanya jika kita sebenarnya telah bergerak ke arah tembok ditekan pada masa itu-jadi kedudukan X karakter kita tidak berubah.

Seperti yang anda lihat, dalam hal ini kita menghitung topY menggunakan kedudukan bingkai sebelumnya, dan bahagian bawah menggunakan bingkai semasa. Jika kita tidak berada di sebelah mana-mana dinding, maka kita akan melihat sama ada kita boleh merebut langkan hanya menggunakan kedudukan objek dalam bingkai semasa.

Baiklah, sekarang kita tahu jubin mana yang hendak diperiksa, kita boleh mula melangkah melalui mereka. Kami akan pergi dari atas ke bahagian bawah, kerana pesanan ini paling masuk akal kerana kami membiarkan barisan meraih hanya apabila wataknya jatuh.

Sekarang mari kita semak sama ada jubin yang kita lelapkan memenuhi syarat-syarat yang membolehkan watak merebut langkan. Keadaan seperti yang dijelaskan sebelum ini adalah seperti berikut:

  • Jubin itu kosong.
  • Jubin di bawahnya adalah jubin pepejal (ini jubin yang kita mahu ambil).

Langkah seterusnya adalah untuk mengira kedudukan sudut jubin yang kita mahu ambil. Ini cukup mudah-kita hanya perlu mendapatkan kedudukan jubin dan kemudian mengimbanginya dengan saiz jubin.

Sekarang kita tahu ini, kita perlu semak sama ada sudut antara titik sensor kita. Sudah tentu kita mahu melakukan itu hanya jika kita menyemak jubin berkenaan dengan kedudukan bingkai semasa, iaitu jubin dengan koordinat Y sama dengan bahagian bawah. Sekiranya tidak demikian, kami dengan selamat boleh mengandaikan bahawa kami melewati langkan antara bingkai sebelumnya dan sekarang - jadi kami mahu merebut tebing.

Kini kami pulang ke rumah, kami telah menemui tebing yang ingin kami ambil. Pertama, mari kita jimatkan kedudukan jubin tebing.

Kita juga perlu menyelaraskan watak dengan langkan. Apa yang ingin kami lakukan ialah menjajarkan bahagian atas sensor langkan watak dengan bahagian atas jubin, dan kemudian mengimbangi kedudukan itu oleh cGrabLedgeTileOffsetY.

Selain itu, kita perlu melakukan perkara-perkara seperti menetapkan kelajuan menjadi sifar dan menukar keadaan kepada CharacterState.GrabLedge. Selepas ini, kita boleh memecah dari gelung kerana tidak ada titik yang melaluinya melalui seluruh jubin.

Itulah yang akan! Tepi kini boleh dikesan dan dirampas, jadi sekarang kita hanya perlu melaksanakan keadaan GrabLedge, yang telah dilangkau sebelumnya.

Kawalan Merah Ledge

Setelah wataknya meraih langkan, pemain mempunyai dua pilihan: mereka boleh melompat atau turun. Melompat berfungsi seperti biasa; pemain menekan kekunci melompat dan daya melompat adalah sama dengan gaya yang digunakan apabila melompat dari tanah. Penurunan turun dilakukan dengan menekan butang bawah, atau kunci arah yang menunjuk jauh dari langkan.

Pelaksanaan Kawalan

Perkara pertama di sini adalah untuk mengesan sama ada tongkat di sebelah kiri atau ke kanan watak. Kita boleh melakukan ini kerana kita menyelamatkan koordinat bujur yang watak itu diambil.

Kita boleh menggunakan maklumat itu untuk menentukan sama ada watak itu sepatutnya melepaskan langkan. Untuk menurunkan, pemain perlu sama ada:

  • tekan butang bawah
  • tekan butang kiri apabila kita meraih langkan di sebelah kanan, atau
  • tekan butang kanan apabila kita meraih langkan di sebelah kiri

Terdapat kaveat kecil di sini. Pertimbangkan keadaan apabila kita memegang butang bawah dan butang yang betul, apabila wataknya memegang bujur di sebelah kanan. Ini akan mengakibatkan keadaan berikut:

Masalahnya di sini ialah watak merebut langkan dengan serta-merta selepas ia melepaskannya.

Satu penyelesaian mudah untuk ini adalah untuk mengunci pergerakan ke arah bingkai untuk beberapa bingkai selepas kami menurunkan tebing. Oleh itu, kita perlu menambah dua pemboleh ubah baru; mari kita panggil mereka mCannotGoLeftFrames dan mCannotGoRightFrames.

Apabila watak itu jatuh dari tebing, kita perlu menetapkan pembolehubah itu dan menukar keadaan untuk melompat.

Sekarang mari kita kembali sedikit ke keadaan Jump, dan mari pastikan ia menghalang pengharaman kita bergerak sama ada kiri atau kanan setelah menjatuhkan langkan. Mari kita tetapkan semula input sebelum kita memeriksa sama ada kita perlu mencari langkan untuk merebut.

Seperti yang dapat anda lihat, dengan cara ini kita tidak akan memenuhi syarat-syarat yang diperlukan untuk merebut langkan selagi arah yang disekat adalah sama seperti arah langkan yang mungkin dicuba oleh watak tersebut. Setiap kali kita menafikan input tertentu, kita akan menurunkan bingkai yang tersekat, jadi akhirnya kita akan dapat bergerak lagi-dalam kes kita, selepas 3 bingkai.

Sekarang mari kita teruskan kerja di GrabLedge state. Oleh kerana kita ditangani menjatuhkan langkan, kita kini perlu untuk melonjak dari kedudukan meraih.

Jika watak itu tidak jatuh dari langkan, kita perlu menyemak sama ada kunci melompat telah ditekan; jika ya, kita perlu menetapkan kelajuan menegak lompat dan menukar keadaan:

Itu cukup banyak! Kini merebut langkan harus berfungsi dengan baik dalam semua situasi.

Benarkan Watak Lompat Tidak lama Selepas Meninggalkan Platform

Selalunya, untuk melompat lebih mudah dalam permainan platformer, watak itu dibenarkan untuk melompat jika ia hanya melangkah dari tepi platform dan tidak lagi di atas tanah. Ini adalah kaedah yang popular untuk mengurangkan ilusi bahawa pemain telah menekan butang melompat tetapi watak tidak melompat, yang mungkin muncul disebabkan oleh ketinggalan input atau pemain menekan butang melompat sejurus selepas watak telah berpindah dari platform.

Mari laksanakan mekanik seperti sekarang. Pertama sekali, kita perlu menambah pemalar berapa banyak bingkai selepas langkah-langkah watak dari platform itu masih boleh melakukan lompatan.

Kami juga memerlukan kaunter bingkai dalam kelas Character, jadi kami tahu berapa banyak bingkai watak di udara sudah ada.

Sekarang mari kita tetapkan mFramesFromJumpStart kepada 0 setiap kali kita baru sahaja meninggalkan tanah. Mari kita lakukan itu selepas kita memanggil UpdatePhysics.

Dan mari kita kenaikan setiap bingkai kita dalam keadaan melompat.

Jika kita berada dalam keadaan melompat, kita tidak boleh membenarkan lompat udara jika kita sama ada di siling atau mempunyai kelajuan tegak positif. Kelajuan menegak positif bermakna bahawa watak itu tidak melepaskan lompatan.

Jika itu bukan kes dan kunci melompat ditekan, semua yang perlu kita lakukan ialah menetapkan kelajuan menegak ke nilai lompat, seolah-olah kita melompat secara normal, walaupun wataknya berada dalam keadaan lompat sudah.

Dan itu sahaja! Kita boleh menetapkan cJumpFramesThreshold kepada nilai yang besar seperti 10 bingkai untuk memastikan ia berfungsi.

Kesan di sini agak dibesar-besarkan. Ia tidak begitu ketara jika kita membenarkan watak untuk melompat hanya 1-4 bingkai selepas ia sebenarnya tidak lagi di atas tanah, tetapi secara keseluruhannya ini membolehkan kita untuk mengubah suai bagaimana lembut yang kita mahu melompat kita menjadi.

Meningkatkan Objek

Mari kita membuat skala objek. Kami sudah mempunyai mScale dalam kelas MovingObject, jadi semua yang kita perlu lakukan adalah memastikan ia memberi kesan kepada AABB dan AABB mengimbangi dengan betul.

Pertama sekali, mari kita edit kelas AABB supaya ia mempunyai komponen skala.

Sekarang mari kita edit halfSize, supaya apabila kita mengaksesnya, kita sebenarnya mendapat saiz yang berskala bukannya yang tidak terjawab.

Kami juga akan dapat mendapatkan atau menetapkan hanya nilai X atau Y separuh saiz, jadi kami perlu membuat pemisah dan penentu yang terpisah untuk mereka juga.

Selain daripada memancarkan AABB itu sendiri, kita juga perlu membuat skala mAABBOffset, supaya selepas kita membuat skala objek itu, spritnya akan tetap sepadan dengan AABB dengan cara yang sama apabila objek itu tidak jelas. Mari kembali ke kelas MovingObject untuk mengeditnya.

Sama seperti sebelum ini, kami juga akan mempunyai akses kepada komponen X dan Y secara berasingan juga.

Akhir sekali, kita juga perlu memastikan bahawa apabila skala diubahsuai dalam MovingObject, ia juga diubah suai dalam AABB. Skala objek boleh menjadi negatif, tetapi AABB sendiri tidak seharusnya mempunyai skala negatif kerana kita bergantung pada separuh saiz untuk selalu positif. Itulah sebabnya bukan hanya melewati skala AABB, kita akan lulus skala yang mempunyai semua komponen positif.

Apa yang perlu dilakukan sekarang ialah memastikan di mana sahaja kami menggunakan pembolehubah secara langsung, kami menggunakannya melalui getter dan setter sekarang. Di mana pun kita menggunakan halfSize.x, kita akan mahu menggunakan HalfSizeX, di mana sahaja kita menggunakan halfSize.y, kita akan mahu menggunakan HalfSizeY, dan sebagainya. Beberapa kegunaan mencari dan menggantikan fungsi harus berurusan dengan ini dengan baik.

Semak Keputusan

Pengukuran perlu berfungsi dengan baik sekarang, dan kerana cara kami membina fungsi pengesanan perlanggaran kami, tidak kira jika watak itu adalah gergasi atau kecil-ia harus berinteraksi dengan peta dengan baik.

Ringkasan

Bahagian ini menyimpulkan kerja kami dengan tilemap. Di bahagian seterusnya, kami akan menetapkan perkara untuk mengesan perlanggaran antara objek.

Ia memerlukan sedikit masa dan usaha, tetapi sistem pada umumnya perlu sangat teguh. Satu perkara yang mungkin kurang sekarang ialah sokongan untuk cerun. Banyak permainan tidak bergantung kepada mereka, tetapi banyak yang mereka lakukan, jadi itu adalah matlamat peningkatan yang paling besar untuk sistem ini. Terima kasih kerana membaca setakat ini, berjumpa dengan anda di bahagian seterusnya!

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.