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

Dasar Physics Platformer 2D, Bagian 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

Indonesian (Bahasa Indonesia) translation by Aditia Dwiperdana (you can also view the original English article)

Platform Satu Arah

Karena kita baru menyelesaikan pemeriksaan tabrakan dengan tanah, sekalian saja kita tambahkan platform satu arah. Mereka hanya akan mempengaruhi pemeriksaan tabrakan dengan tanah saja. Perbedaan platform satu arah dengan blok solid adalah bahwa platform satu arah hanya menghentikan objek jika jatuh dari atas. Sebagai tambahan, kita juga perlu membolehkan karakter untuk melompat turun dari platform tersebut.

Pertama, saat kita ingin melompat turun dari platform satu arah, pada dasarnya kita mengabaikan tabrakan dengan tanah. Cara mudah untuk melakukan itu adalah dengan membuat offset, setelah melewati offset tersebut, karakter atau objek tidak lagi bertabrakan dengan platform.

Contohnya, jika karakter sudah berada di bawah platform sebanyak dua piksel, seharusnya tidak dideteksi sebagai tabrakan. Dengan begitu, jika kita ingin turun dari platform, kita hanya perlu menggeser karakter dua piksel ke bawah. Mari buat konstanta offset tersebut.

Sekarang kita tambahkan variabel yang akan memberi tahu kita apakah sebuah objek berada pada platform satu arah.

Lalu kita modifikasi definisi fungsi HasGround untuk menyimpan referensi ke variabel boolean yang akan diisi jika objek mendarat pada platform satu arah.

Sekarang, setelah kita periksa apakah petak yang kita injak adalah rintangan atau bukan, kita perlu periksa apakah itu adalah sebuah platform satu arah.

Seperti yang dijelaskan sebelumnya, kita juga perlu memastikan tabrakan diabaikan jika kita sudah jatuh melewati cOneWayPlatformThreshold di bawah platform.

Tentu saja, kita tidak bisa hanya membandingkan perbedaan antara bagian atas petak dan sensor, karena mudah untuk membayangkan jika kita sedang jatuh, kita akan melewati batas dua piksel dari bagian atas platform. Untuk platform satu arah menghentikan objek, kita ingin jarak antara bagian atas petak dan sensor lebih kecil atau sama dengan cOneWayPlatformThreshold ditambah offset dari posisi frame ini dibandingkan dengan posisi frame sebelumnya.

Akhirnya, ada satu hal lagi yang perlu dipertimbangkan. Ketika kita menemukan platform satu arah, kita tidak bisa benar-benar keluar dari loop, karena ada situasi di mana sebagian karakter ada di atas platform dan sebagian di atas blok solid.

Kita sebaiknya tidak menganggap posisi tersebut seperti 'platform satu arah', karena kita tidak bisa benar-benar turun dari situ, blok solid itu menghentikan kita. Karena itulah kita perlu terus mencari blok solid, dan jika kita menemukan satu sebelum kita mengembalikan hasil fungsi, kita perlu mengatur onOneWayPlatform menjadi false.

Sekarang, jika kita memeriksa semua petak yang perlu kita periksa secara horizontal dan menemukan platform satu arah tapi tidak ada blok solid, maka kita bisa yakin kalau kita berada pada platform satu arah dan kita bisa melompat turun.

Sekarang tambahkan kelas karakter cara untuk melompat turun dari platform. Di kondisi berdiri dan berlari, kita perlu tambahkan kode berikut.

Kita lihat bagaimana fungsi itu bekerja.

Semuanya bekerja seperti seharusnya.

Menangani Tabrakan dengan Langit-langit

Kita perlu buat fungsi yang serupa dengan HasGround untuk masing-masing sisi AABB, kita mulai dengan langit-langit. Perbedaannya adalah sebagai berikut:

  • Garis sensor berada di atas AABB, bukan di bawahnya.
  • Kita periksa petak langit-langit dari bawah ke atas karena kita bergerak ke atas
  • Tidak perlu menangani platform satu arah

Berikut adalah fungsi yang sudah dimodifikasi.

Menangani Tabrakan untuk Tembok Kiri

Sama seperti cara menangani tabrakan terhadap langit-langit dan tanah, kita juga perlu memeriksa apakah objek bertabrakan dengan tembok di kanan atau kiri. Kita mulai dari tembok sebelah kiri. Caranya kurang lebih sama, tapi berikut beberapa perbedaannya:

  • Garis sensor ada di sebelah kiri AABB
  • Loop for dalam perlu mengiterasi petak secara vertikel, karena sensor sekarang berupa garis vertikal.
  • Loop luar perlu mengiterasi petak secara horizontal untuk melihat apakah kita melewati tembok saat bergerak dengan kecepatan horizontal yang tinggi.

Menangani Tabrakan dengan Tembok di Kanan

Akhirnya, kita buat fungsi CollidesWithRightWall, seperti yang bisa kamu bayangkan, akan melakukan hal yang serupa dengan CollidesWithLeftWall, tapi kita menggunakan sensor di sebelah kanan karakter, bukan kiri.

Perbedaan lainnya adalah kita akan memeriksa petak dari kiri ke kanan, karena gerakan karakter akan seperti itu. 

Menggerakkan Objek Keluar dari Tabrakan

Semua fungsi deteksi tabrakan sudah selesai, sekarang kita gunakan mereka untuk melengkapi respon tabrakan terhadap tilemap. Sebelum itu, kita perlu menentukan urutan pemeriksaan tabrakan. Kita pertimbangkan beberapa situasi berikut.

Di kedua situasi tersebut, kita bisa lihat karakter berakhir tumpang tindih dengan petak, tapi kita perlu menentukan bagaimana kita menyelesaikan tumpang tindih tersebut.

Situasi di kiri cukup sederhana, kita bisa lihat bahwa kita jatuh lurus ke bawah, dan karena itu kita harus mendarat di atas blok.

Situasi di kanan lebih rumit, karena sebenarnya kita bisa mendarat di pojok petak, dan mendorong karakter ke atas sama masuk akalnya dengan mendorongnya ke kanan. Mari pilih untuk memprioritaskan gerakan horizontal. Tidak terlalu masalah arah mana yang kita lakukan terlebih dahulu, kedua pilihan tersebut terlihat benar pada prakteknya.

Mari berpindah ke fungsi UpdatePhysics dan tambahkan variabel yang akan menyimpan hasil dari pemeriksaan tabrakan.

Kita mulai dengan melihat apakah kita perlu menggeser objek ke kanan. Kondisinya adalah sebagai berikut:

  • kecepatan horizontal lebih kecil atau sama dengan nol
  • kita menabrak tembok kiri
  • di frame sebelumnya kita tidak tumpang tindih dengan petak pada sumbu horizontal, situasi yang mirip dengan situasi sisi kanan pada gambar di atas

Kondisi terakhir adalah yang paling penting, karena jika tidak terpenuhi kita akan berhadapan dengan situasi yang serupa dengan sisi kiri dari gambar di atas, di mana kita seharusnya tidak menggerakkan karakter ke kanan.

Jika kondisinya benar, kita perlu menyamakan sisi kiri AABB kita dengan sisi kanan dari petak, pastikan kita berhenti bergerak ke kiri, dan tandai bahwa ada tembok di sisi kiri kita.

Jika salah satu kondisi selain yang terakhir bernilai false, kita perlu mengatur mPushesLeftWall menjadi false. Karena kondisi terakhir bernilai salah tidak berarti karakter tidak mendorong tembok, tapi sebaliknya, itu memberi tahu kita bahwa karakter sudah bertabrakan dengan tembok di frame sebelumnya. Karena ini, lebih baik mengubah mPushesLeftWall menjadi false hanya jika salah satu dari dua kondisi bernilai false.

Sekarang kita periksa tabrakan dengan tembok di kanan.

Seperti yang bisa kamu lihat, kita menggunakan formula yang sama dengan pemeriksaan tabrakan dengan tembok kiri, tapi berupa hasil pencerminannya.

Kita sudah memiliki kode untuk memeriksa tabrakan dengan tanah, jadi setelah itu kita perlu memeriksa tabrakan dengan langit-langit. Tidak ada yang nbaru di sini, kita pun tidak perlu membuat pemeriksaan tambahan kecuali kecepatan vertikal perlu lebih besar atau sama dengan nol, artinya kita benar-benar bertabrakan dengan petak di atas kita.

Membulatkan Pojokan Petak

Sebelum kita menguji apakah respon tabrakan berfungsi dengan benar, ada satu hal penting untuk dilakukan, yaitu untuk membulatkan nilai pojok yang kita perhitungkan dalam pemeriksaan tabrakan. Kita perlu melakukannya agar pemeriksaan kita tidak dirusak oleh kesalahan perhitungan bilangan real, yang mungkin muncul dari posisi aneh di peta, skala karakter, atau sekedar ukuran AABB yang aneh.

Pertama, untuk kemudahan kita, kita buat sebuah fungsi untuk mengubah vektor berisi bilangan real, menjadi vektor berisi bilangan yang sudah dibulatkan.

Sekarang kita gunakan fungsi ini untuk setiap pemeriksaan tabrakan. Pertama, kita perbaiki fungsi HasCeiling.

Berikutnya OnGround.

PushesRightWall.

Dan akhirnya, PushesLeftWall.

Modifikasi-modifikasi tersebut harusnya sudah menyelesaikan masalah kita.

Memeriksa Hasilnya

Modifikasinya sudah cukup. Sekarang kita periksa bagaimana hasil respon tabrakan yang sudah kita buat.

Ringkasan

Sekian untuk bagian ini! Kita sudah membuat fungsi-fungsi untuk deteksi tabrakan dengan tilemap, yang seharusnya sudah cukup bisa diandalkan. Kita tahu kondisi setiap objek saat ini: apakah ada di atas tanah, menyentuh petak di kanan atau kiri, atau menyundul langit-langit. Kita juga mengimplementasi platform satu arah, yang sangat penting di setiap game platformer.

Pada bagian berikutnya, kita akan tambahkan mekanik untuk menangkap pinggiran platform, yang akan menambah pergerakan karakter lebih jauh.

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.