Bagaimana cara menangani deteksi tabrakan isometrik?


14

Saya ingin membuat platformer run-jump style isometrik. Pemain harus dapat melompat di atas platform di atas lantai, mengenai sisi benda dll.

Saya akan menggunakan mesin game 2D jadi saya tidak ingin meniru tabrakan 3D penuh untuk dimensi yang tidak saya gunakan.

Saya berpikir objek dalam permainan harus ditempatkan menggunakan: X, Y, lebar, tinggi, dan Z untuk kedalaman.

Dengan menggunakan nilai-nilai itu, bagaimana saya harus mendeteksi tabrakan?


Saya tahu ini adalah pertanyaan umum tetapi, saya ingin jawaban yang lebih terperinci atau tautan ke sumber belajar yang baik.
jdeseno

Jawaban:


19

2 pilihan:

  • Anda bisa memperlakukannya sebagai game 3D dengan kamera ortografi tetap. Kemudian Anda dapat menggunakan sumber daya / buku / tutorial / perpustakaan game 3D standar. Bahkan jika itu diberikan dalam 2D ​​dengan sprite, matematika untuk pergerakan dll akan tetap 3D di belakang layar. Ini akan memberi Anda hasil yang paling akurat.

  • Anda bisa memperlakukannya sebagai game 2D top-down, dengan properti tinggi tambahan. Misalnya, bayangkan kisi 2D di mana setiap ubin memiliki nilai ketinggian. Saat berpindah dari satu ubin ke ubin lain, Anda hanya membiarkan karakter lewat ke ubin tertentu jika kaki karakter berada di atas atau sama dengan ketinggian ubin itu, tetapi jika mereka melompat dan gravitasi membawa mereka turun di atas ubin, Anda biarkan mereka tetap di sana. Dengan sedikit kerja Anda bisa membuatnya sehingga Anda bisa berjalan di bawah jembatan dll.


4

Ada banyak cara untuk menyederhanakan ini. Misalnya, jika Anda tidak mengizinkan lapisan (misalnya, jembatan yang bisa Anda lewati dan lewati, Anda bisa melakukan semua pendeteksian tabrakan dalam dimensi X / Y, tempat Anda memfilter set tabrakan ke ketinggian + kedalaman apa pun) atau lebih tinggi.


2

Jika gim ini didasarkan pada kisi persegi, maka kisi ini mendefinisikan sumbu X / Y Anda. Dan Z dapat digunakan untuk ketinggian.

Tumbukan kemudian semudah atau semudah gim berbasis 2D lainnya.

Maka Anda hanya perlu mengkonversi dari grid kembali ke koordinat layar isometrik untuk rendering. Ini cukup mudah - tetapi Anda mungkin perlu berpikir tentang menghitung nilai 'kedalaman', untuk tujuan penyortiran (rendering adegan isometrik dari belakang ke depan)


Menggunakan Z untuk ketinggian bertentangan dengan insting, tetapi itu adalah hal yang benar untuk dilakukan pada game 2D top-down. maka Anda dapat menggunakan kembali kode antara permainan sisi-ke-atas dan atas-bawah.
Iain

2

Googling sekitar saya menemukan demo ini: http://planetskill.com/iso/

WASD untuk bergerak. Bilah spasi untuk melompat

Ini hanya mengimplementasikan tabrakan dengan sumbu atas / bawah tetapi menambahkan tabrakan lainnya harus mudah:

Jika posisi naik / turun dari langkah berikutnya lebih tinggi dari maks Anda, jangan bergerak. Ini juga memungkinkan Anda menerapkan lompatan dengan cara yang mudah.

Kode contoh di sini: http://gist.github.com/478997


2

Semua yang di atas. Isometrik hanyalah grid 2d yang dicukur jadi perlakukan itu sebagai tilemap 2d dan pikirkan cara untuk menyandikan kedalaman. Bagaimana Anda melakukannya dalam permainan 2d biasa (bisa pergi di belakang atau di depan blok ketika 'melompat'? Anda akan menyimpan kedalaman per ubin (buffer kedalaman-> z buffer) atau Anda akan menggunakan beberapa layer , atau, jika Anda ingin lebih keren, Anda akan menerapkan panggilan balik per jenis huruf (atau pemetaan) dan akan dapat melakukan apa pun yang Anda inginkan, memeriksa kedalaman, memeriksa peralatan, memutar warp player, meminta pemain perlahan-lahan naik, memformat HD.


Jawaban yang bagus Kaj - ini adalah inti dari masalah ini, saya terkejut tidak ada orang lain yang mengangkatnya. Ini selalu menjadi hal yang membingungkan pemula tentang isometri, dalam hal fisika.
Insinyur

1

Yah Anda bisa memiliki layer tabrakan terpisah di atas level Anda yang tidak terlihat dan menggunakannya untuk memeriksa tabrakan .. Anda juga dapat menggunakan ini untuk beberapa layer selama Anda tahu di lapisan mana pemainnya;)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.