Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Platformer
Gamedevelopment

Asas 2D Pelantar Fizik, Bahagian 8: Lereng

by
Difficulty:IntermediateLength:LongLanguages:

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

Final product image
What You'll Be Creating

Demo

Demo menunjukkan hasil akhir pelaksanaan cerun. Gunakan WASD untuk menggerakkan watak. Butang tetikus kanan membuat jubin. Anda boleh menggunakan roda skrol atau kekunci anak panah untuk memilih jubin yang anda mahu letakkan. Slider menukar saiz watak pemain.

Demo telah diterbitkan di bawah Unity 5.5.2f1, dan kod sumber juga serasi dengan versi Perpaduan ini.

Sebelum Kami Mulakan ...

Seperti yang berlaku untuk bahagian sebelumnya dalam siri ini, kami akan meneruskan kerja kami di mana kami berhenti di bahagian terakhir. Kali terakhir kami mengira dan memindah data yang diperlukan untuk menggerakkan objek keluar dari perlanggaran cerun dan mengubah bagaimana perlanggaran diperiksa terhadap tilemap. Di bahagian ini, kami memerlukan persediaan yang sama dari akhir bahagian terakhir.

Anda boleh memuat turun fail projek dari bahagian sebelumnya dan menulis kod itu bersama-sama dengan tutorial ini.

Di bahagian ini, kami akan melaksanakan perlanggaran dengan cerun atau jubin adat lain, menambah lereng sehala, dan membolehkan objek permainan berjalan di sepanjang lereng dengan lancar.

Pelancongan Lereng

Pemeriksaan Lereng Menegak

Kita akhirnya boleh sampai ke cerun! Pertama, kami akan cuba mengendalikan apabila bahagian bawah objek berada dalam jubin cerun.

Mari pergi dan lihatlah fungsi CollidesWithTileBottom kami, terutamanya bahagian di mana kami mengendalikan jubin.

Untuk dapat melihat sama ada objek kita bertembung dengan cerun, kita perlu mendapatkan offset daripada fungsi yang kita buat sebelumnya, yang mana kebanyakan kerja kita.

Oleh kerana kita menyemak satu piksel di bawah watak kita, kita perlu menyesuaikan offset.

Keadaan untuk perlanggaran adalah bahawa offset freeUp lebih besar atau sama dengan 0, yang bermaksud sama ada kita menggerakkan karakter atau watak itu berdiri di lereng.

Kita tidak sepatutnya melupakan perkara ini apabila kita mahu wataknya berpegang pada cerun, walaupun. Ini bererti walaupun wataknya berjalan di lereng bukit, kita mahu ia berkelakuan seolah-olah ia berada di lereng bukit. Untuk ini, kita perlu menambah pemalar baru yang akan mengandungi nilai betapa curam cerun perlu untuk dianggap sebagai dinding menegak dan bukan cerun.

Sekiranya mengimbangi adalah di bawah pemalar ini, ia mestilah mungkin untuk objek berjalan dengan lancar di sepanjang lengkung cerun. Sekiranya ia sama atau lebih besar, ia harus dianggap sebagai dinding, dan melompat akan diperlukan untuk memanjat.

Sekarang kita perlu menambah syarat lain untuk penyataan kami. Keadaan ini akan memeriksa sama ada watak itu sepatutnya melekat pada cerun, sama ada pada bingkai terakhir cerun, dan sama ada ia perlu ditolak atau meningkat dengan lebih sedikit piksel daripada pemalar cSlopeWallHeight kami.

Sekiranya keadaan itu benar, kita perlu menyimpan jubin ini sebagai collidee potensi dengan objek tersebut. Kami masih perlu melelapkan melalui semua ubin lain di sepanjang paksi X. Pertama, buat pembolehubah yang akan memegang koordinat X dan nilai offset untuk jubin bertembung.

Sekarang simpan nilai-nilai, jika keadaan yang ditentukan berlaku. Jika kita sudah menemui jubin bertembung, kita perlu membandingkan offset, dan jubin bertembung akhir akan menjadi yang mana watak perlu diimbangi paling banyak.

Akhirnya, selepas kami melelepon melalui semua jubin dan mendapati jubin objek bertabrakan, kita perlu mengimbangi objek tersebut.

Itu cukup untuk cek bawah, jadi sekarang mari kita lakukan yang terbaik. Ini akan menjadi sedikit lebih mudah, kerana kita tidak perlu mengendalikan melekat.

Itu sahaja.

Periksa Lereng Mendatar

Cek mendatar akan sedikit lebih rumit, kerana di sini kita akan menangani kes-kes yang paling menyusahkan.

Mari mulakan dengan mengendalikan cerun di sebelah kanan. Terdapat beberapa perkara yang perlu kita ketahui, kebanyakannya mengenai memindahkan lereng. Mari kita pertimbangkan situasi berikut.

Different shaped slopes

Kita perlu mengendalikan kes-kes itu dengan berhati-hati kerana pada satu ketika apabila kita bergerak di sepanjang cerun, kita akan memukul siling. Untuk mengelakkannya, kita perlu melakukan lebih banyak lagi cek jika aksara bergerak mendatar.

Untuk pemeriksaan menegak, kami telah memindahkan objek dari jubin, tetapi secara umum kami tidak akan menggunakan fungsi tersebut di sana. Oleh kerana kita sentiasa menyemak piksel yang berada di luar batas objek, kita tidak akan benar-benar bertindih penghalang. Untuk pemeriksaan mendatar, ia agak berbeza, kerana ini adalah tempat di mana kita akan mengendalikan bergerak di sepanjang cerun, jadi secara semula jadi pelarasan ketinggian akan berlaku di sini.

Untuk membuat tindak balas perlanggaran yang sesuai untuk kes-kes yang digambarkan di atas, akan lebih mudah untuk memeriksa sama ada kita boleh memasuki ruang secara mendatar dan jika itu mungkin, semak sama ada objek tidak bertindih dengan mana-mana piksel padat jika perlu bergerak secara menegak kerana bergerak di sepanjang cerun. Jika kita gagal mencari ruang, kita tahu bahawa tidak mustahil untuk bergerak ke arah arah yang diperiksa, dan kita boleh menetapkan bendera dinding mendatar.

Mari kita berpindah ke fungsi CollidesWithTileRight, ke bahagian di mana kita mengendalikan cerun.

Kami mendapat offset dengan cara yang sama kita mendapatkannya untuk cek menegak, tetapi offset yang kita peduli adalah yang lebih besar.

Sekarang, mari kita lihat jika watak kita harus merawat jubin yang diperiksa sebagai tembok. Kami melakukan ini jika kedua-dua lingkaran offset lebih besar atau sama dengan cSlopeWallHeight malar kami atau untuk keluar daripada perlanggaran kita perlu mengimbangi watak naik atau turun semasa kita telah bertembung dengan jubin dalam arah yang sama, yang bermaksud bahawa kita objek diperas di antara jubin atas dan bawah.

Sekiranya itu bukan kes dan offset lebih besar daripada 0, maka kita mencecah cerun. Satu masalah di sini ialah kita tidak tahu sama ada kita memukul dinding pada jubin lain yang belum kita periksa, jadi buat sekarang kita hanya akan menyimpan jenis lompang dan jenis pelanggaran dalam kes kita perlu menggunakannya kemudian.

Sekarang, bukannya melihat jika kelebihan cerun lebih besar dari sifar, mari kita bandingkan dengan cerun yang lain, jika kita telah menemui cerun bertembung dalam lelaran sebelumnya.

Mengendalikan Perengkuh Antara Jubin

Selepas kita selesai mengepung semua jubin yang menarik, mari kita lihat apakah kita perlu menggerakkan objek itu. Mari kita mengendalikan kes di mana cerun mengimbangi menjadi tidak sifar.

Kita perlu mengendalikan dua kes di sini, dan kita perlu melakukan perkara-perkara yang sedikit berbeza bergantung sama ada kita perlu mengimbangi objek kita naik atau turun.

Pertama, kita perlu menyemak sama ada kita boleh masuk ke dalam ruang selepas mengimbangi objek tersebut. Sekiranya itu berlaku, maka kami akan mengendalikan salah satu kes yang digambarkan di atas. Di mana watak itu cuba bergerak ke kanan, offset itu adalah positif, tetapi jika kita mengimbangi objek maka ia akan ditolak ke dinding teratas, jadi sebaliknya kita akan menandakan bahawa ia bertembung dengan dinding di sebelah kanan untuk menyekat pergerakan ke arah itu.

Jika kita masuk ke dalam ruang, kita akan menandakan bahawa kita bertembung dengan jubin bawah dan mengimbangi kedudukan objek dengan sewajarnya.

Kami mengendalikan kes di mana objek perlu diimbangi dengan cara yang sama.

Objek Bergerak dalam Semak Perlanggaran

Sekarang fungsi ini akan mengimbangi objek ke atas atau ke bawah seperti yang diperlukan jika kita mahu melangkah ke jubin ke kanan, tetapi bagaimana jika kita mahu menggunakan fungsi ini sebagai cek, dan kita tidak mahu memindahkan watak dengan memanggilnya? Untuk menyelesaikan masalah ini, mari tambahkan pembolehubah tambahan yang dinamakan 'bergerak' untuk menandakan sama ada fungsi itu boleh menggerakkan objek atau tidak.

Dan gerakkan objek hanya jika bendera baru ini ditetapkan kepada benar.

Mengendalikan Slope Sticking

Kini mari kita mengendalikan melekat pada cerun. Ia cukup mudah, tetapi kita perlu mengendalikan semua kes sudut dengan betul, supaya watak itu akan berpegang pada cerun tanpa sebarang cegukan di sepanjang jalan.

Sebelum kita mengendalikan kes-kes penjuru, kita dapat dengan mudah mengendalikan cerun melekat dalam jubin tunggal dalam pemeriksaan perlanggaran menegak. Ia akan cukup jika kita menambah syarat berikut dalam fungsi CollidesWithTileBottom.

Keadaan ini menjadikannya supaya jika jarak antara kedudukan objek dan tanah terdekat adalah antara 0 dan cSlopeWallHeight, maka watak itu akan ditolak juga, sebagai tambahan kepada keadaan asal. Malangnya ini hanya berfungsi dalam jubin tunggal; ilustrasi berikut menunjukkan masalah yang perlu kita selesaikan.

Slope with three squares marked on it

Kes sudut yang kita bicarakan adalah ini: watak bergerak ke bawah dan ke kiri dari jubin nombor satu ke jubin nombor dua. Nombor jubin dua kosong, jadi kita perlu menyemak jubin di bawahnya dan lihat jika mengimbangi dari aksara ke jubin nombor 3 adalah sesuai untuk terus berjalan di sepanjang cerun di sana.

Mengendalikan Kes Sudut

Ia akan menjadi lebih mudah untuk mengendalikan kes-kes penjuru ini dalam pemeriksaan perlanggaran mendatar, jadi mari kembali ke fungsi CollidesWithTileRight. Mari kita pergi ke hujung fungsi dan mengendalikan kes-kes yang menyusahkan di sini.

Mula-mula, untuk mengendalikan cerun melekat, bendera mSticksToSlope perlu ditetapkan, objek mestilah berada di atas bingkai sebelumnya dan bendera bergerak perlu dihidupkan.

Sekarang kita perlu mencari jubin yang mana kita perlu melekat. Oleh kerana fungsi ini memeriksa perlanggaran di tepi kanan objek, kami akan menangani cerun melekat untuk sudut kiri bawah aksara.

Sekarang kita perlu mencari jalan untuk membandingkan ketinggian objek yang kini ada pada yang ia mahu melangkah ke atas. Sekiranya ketinggian seterusnya adalah lebih rendah daripada semasa, tetapi masih lebih tinggi daripada pemalar cSlopeWallHeight kami, kami akan menolak objek kami ke tanah.

Dapatkan Ketinggian Cerun

Mari kita kembali ke kelas Slope kita untuk membuat fungsi yang akan memulihkan ketinggian cerun pada kedudukan tertentu.

Parameter untuk fungsi adalah nilai x pada cerun dan jenis cerun. Sekiranya cerun kosong kita boleh kembali dengan cepat 0, dan jika ia penuh maka kita kembali saiz jubin.

Kita boleh dengan mudah mendapatkan ketinggian cerun dengan menggunakan offset kami. Sekiranya jubin tidak diubah dengan cara apa pun, kita hanya dapat mengimbangi objek yang satu piksel lebar pada kedudukan x, dan ketinggiannya sama dengan saiz jubin.

Mari kita mengendalikan ini untuk mengubah yang berbeza. Sekiranya cerun dibalik pada paksi X, kita hanya perlu mencerminkan argumen x.

Sekiranya cerun dibalikkan pada paksi Y, kita perlu mengembalikan collidingTop bukannya collidingBottom offset. Oleh kerana collidingTop dalam kes ini akan menjadi negatif, kami juga perlu membalikkan tanda untuknya.

Akhir sekali, jika jubin diputar sebanyak 90 darjah, kita perlu kembali berbelok ke kiri atau bertabrakan. Selain itu, untuk mendapatkan cached offset yang betul, kita perlu menukar kedudukan dan saiz x dan y.

Itulah fungsi akhir.

Kembali ke Kasut Corner

Mari kita beralih ke fungsi CollidesWithTileRight, di mana kita selesai menentukan jenis cerun untuk jubin watak bergerak antara.

Untuk menggunakan fungsi yang kami buat, kita perlu menentukan kedudukan di mana kita ingin mendapatkan ketinggian jubin.

Sekarang mari kita kirakan ketinggian antara dua mata.

Sekiranya offset adalah antara 0 dan cSlopeWallHeight berterusan, maka kita akan menolak objek ke bawah, tetapi terlebih dahulu kita perlu menyemak sama ada kita sebenarnya boleh menolak objek itu. Ini adalah rutin yang sama yang kami lakukan lebih awal.

Semua dalam semua, fungsi itu sepatutnya kelihatan seperti ini.

Sekarang kita perlu melakukan segala-galanya secara analog untuk fungsi CollidesWithTileLeft. Versi terakhirnya harus mengambil bentuk berikut.

Itu sahaja. Kod ini harus dapat mengendalikan semua jalan ceramah yang tidak diterjemahkan.

Animation of character moving on slope

Mengendalikan Jenis Terjemahan

Sebelum kita mula mengendalikan ubin diterjemahkan, mari kita buat beberapa fungsi yang akan kembali sama ada TileCollisionType tertentu diterjemahkan dengan cara tertentu. Enum jenis perlanggaran kami disusun dengan cara ini:

Kita boleh menggunakan pola ini untuk memberitahu hanya dengan nilai enum bagaimana jenis perlanggaran tertentu diterjemahkan. Mari kita mulakan dengan mengenalpasti flip pada paksi X.

Pertama, mari dapatkan id cerun. Kami akan melakukan itu dengan mengira offset dari jubin cerun yang ditentukan pertama kepada yang kami mahu mengenal pasti.

Kami mempunyai lapan jenis penterjemahan, jadi sekarang semua yang kita perlukan ialah mendapatkan baki membahagikan typeId sebanyak 8.

Oleh itu sekarang terjemahan mempunyai nombor yang ditetapkan untuk mereka.

Flip pada paksi X terdapat dalam jenis yang sama dengan 1, 3, 5, dan 7, jadi jika ia sama dengan salah satu daripada itu maka fungsi itu harus dikembalikan benar, jika tidak kembali palsu.

Dengan cara yang sama, mari kita buat fungsi yang memberitahu sama ada jenis dibalik pada paksi Y.

Dan akhirnya, jika jenis perlanggaran diputar.

Itulah yang kita perlukan.

Mengubah Offset

Mari kita kembali ke kelas Lereng dan menjadikan fungsi GetOffset kami menyokong ubin yang diterjemahkan.

Seperti biasa, kerana kami tidak mempunyai data cache untuk cerun yang diterjemahkan, kami akan menerjemahkan kedudukan dan saiz objek supaya hasilnya sama seperti jika jubin telah diterjemahkan. Mari kita mulakan dengan flip pada paksi X. Apa yang perlu kita lakukan di sini adalah flip objek di sepanjang pusat jubin.

Begitu juga untuk flip pada paksi Y.

Sekarang sekiranya kita membalikkan jubin pada paksi y, offset yang kami terima sebenarnya telah ditukar. Marilah menterjemahkannya supaya mereka benar-benar bekerja dengan cara yang sama seperti offset jubin yang tidak diterjemahkan, yang bermaksud naik dan turun turun!

Sekarang mari kita mengendalikan putaran 90 darjah.

Di sini segala-galanya perlu diputar dengan 90 darjah, jadi bukannya meletakkan posX dan sizeX kami di tepi kiri dan kanan objek, kami akan meletakkan mereka di bahagian atas dan bawah.

Kini kita perlu melakukan perkara yang sama dengan apa yang telah kita lakukan sebelum ini jika jubin itu dibalik paksi Y, tetapi kali ini kita perlu melakukannya untuk kedua-dua putaran 90 darjah dan flip Y.

Inilah dia. Memandangkan kedudukan atas dan bawah terakhir kami diselaraskan untuk masuk akal di ruang dunia, penyesuaian sempadan jubin kami masih berfungsi dengan baik.

Itu sahaja-kini kita boleh menggunakan cerun yang diterjemahkan juga.

Animation of character moving on slope

Pada animasi di atas, terdapat cerun 45, 22, 15 dan 11 darjah. Terima kasih kepada putaran 90 darjah, kami juga boleh mendapatkan cerun 79, 75 dan 68 darjah tanpa menentukan jubin cerun tambahan. Anda juga dapat melihat bahawa cerun 79 derajat terlalu curam untuk bergerak lancar dengan nilai cSlopeWallHeight.

Mengendalikan Platform Satu Arah

Dalam semua kerumitan ini, kami telah melanggar sokongan kami untuk platform sehala. Kita perlu memperbaikinya, dan memanjangkan fungsi ke cerun juga. Platform sehala adalah penting atau sering lebih penting daripada jubin pepejal, jadi kita tidak mampu untuk merindui mereka.

Tambah Jenis Satu Arah

Perkara pertama yang perlu kita lakukan ialah menambah jenis perlanggaran baru untuk platform sehala. Kami akan menambahkan mereka melepasi jenis perlanggaran tanpa satu arah dan juga menandakan di mana mereka bermula, sehingga kemudian kami mempunyai masa yang mudah memberitahu sama ada jenis perlanggaran tertentu adalah satu arah atau tidak.

Sekarang semua platform sehala adalah antara enjin OneWayStart dan OneWayEnd, sehingga kami dapat dengan mudah membuat fungsi yang akan mengembalikan maklumat ini.

Varian cerun sehala harus menunjuk kepada data yang sama yang dilakukan oleh platform bukan satu hala, jadi jangan risau untuk memperluaskan keperluan ingatan di sini.

Tutup Data Tambahan

Sekarang mari kita tambahkan pembolehubah yang akan membolehkan kita membuat objek mengabaikan platform sehala. Satu akan menjadi bendera objek, yang pada dasarnya adalah untuk menetapkan perbalahan tetap platform sehala-ini berguna untuk raksasa terbang dan objek lain yang tidak mempunyai keperluan untuk menggunakan platform, dan bendera lain untuk sementara melumpuhkan perlanggaran dengan platform sehala, hanya kerana jatuh melalui mereka.

Pembolehubah pertama akan berada di dalam kelas MovingObject.

Yang kedua adalah di dalam struktur PositionState.

Kami juga akan menambah pembolehubah lain di sini yang akan memegang koordinat Y platform yang kami mahu lompat.

Untuk membuat platform sehala berfungsi, kami hanya akan mengabaikan satu lapisan platform mendatar. Ketika kita memasuki lapisan lain, itu adalah kedudukan Y karakter kita telah berubah dalam koordinat peta, maka kita menetapkan karakter untuk bertabrakan dengan platform sekali lagi.

Ubah Cek Ujian

Mari kita pergi ke fungsi CollidesWithTileBottom kami. Pertama sekali, ketika kita melewatinya melalui jubin, mari kita periksa apakah platform itu satu arah, dan jika ya, sama ada kita harus mempertimbangkan bertembung dengan jubin ini atau tidak.

Kita harus bertembung dengan platform sehala hanya jika jarak ke bahagian atas platform kurang daripada cSlopeWallHeightConstant, jadi kita sebenarnya boleh berada di atasnya. Mari tambahkan ini kepada keadaan yang telah ditetapkan, dan kita juga perlu memberikan nilai yang tepat kepada state.onOneWay dan state.oneWayY.

Untuk fungsi CollidesWithTileTop, kami hanya mengabaikan platform sehala.

Untuk pemeriksaan perlanggaran mendatar, akan ada kerja yang lebih sedikit. Mula-mula, mari buat dua boolean tambahan di awal, yang akan berfungsi sebagai maklumat mengenai sama ada jubin yang sedang diproses adalah satu arah, dan sama ada jubin dari lelaran sebelumnya telah menjadi platform sehala.

Sekarang kita berminat untuk melewati platform sehala jika kita bergerak bersama-sama. Kita tidak boleh benar-benar bertembung dengan platform sehala dari kanan atau kiri, tetapi jika watak bergerak di sepanjang cerun yang juga merupakan platform sehala, maka ia perlu dikendalikan dengan cara yang sama seperti cerun biasa.

Sekarang pastikan kita tidak bertembung dengan cerun seolah-olah dinding itu.

Dan jika itu bukan kes dan mengimbangi cukup kecil untuk memanjatnya, maka ingat bahawa kami bergerak sepanjang platform sehala sekarang.

Sekarang apa yang tersisa di sini adalah untuk memastikan bahawa setiap kali kita mengubah kedudukan kedudukan kita juga perlu mengemas kini pemboleh ubah onOneWay.

Melompat ke bawah

Kita perlu berhenti mengabaikan platform sehala sekali kita menukar kedudukan Y dalam koordinat peta. Kami akan menubuhkan keadaan kami selepas pergerakan pada paksi Y dalam fungsi Pindah. Kita perlu menambahnya pada akhir kes kedua.

Dan juga pada akhir kes ketiga.

Yang perlu dilakukan. Sekarang satu-satunya perkara yang perlu kita lakukan untuk watak untuk turun dari platform sehala ialah untuk menetapkan tmpIgnoresOneWay kepada benar.

Mari lihat bagaimana ini kelihatan dalam tindakan.

New animation of character moving on slope

Ringkasan

Whew, itu banyak kerja, tetapi ia berbaloi. Hasilnya sangat fleksibel dan mantap. Kita boleh menentukan apa jenis cerun terima kasih kepada pengendalian bitmaps perlanggaran, menterjemahkan jubin, dan mengubahnya menjadi platform sehala.

Pelaksanaan ini masih belum dioptimumkan, dan saya yakin saya telah melewatkan banyak peluang untuk yang diserahkan oleh kaedah integrasi satu pixel baru kami. Saya juga yakin bahawa banyak pemeriksaan perlanggaran tambahan boleh dilangkau, jadi jika anda memperbaiki pelaksanaan ini, beritahu saya di bahagian komen!

Terima kasih kerana melekat dengan saya sejauh ini, dan saya harap tutorial ini digunakan untuk anda!

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