Bagaimana saya bisa mendeteksi pemain yang dihancurkan di platformer 2D?

19

Saya sedang memeriksa tabrakan untuk karakter platformer seperti yang ditunjukkan pada # 1. Titik-titik merah adalah piksel yang diperiksa dan garis abu-abu menunjukkan sumbu yang berkaitan dengannya. Saya suka hasil yang saya dapatkan dari memeriksa tabrakan dengan cara ini (dibandingkan, katakanlah, kotak pembatas). Semuanya bekerja persis seperti yang saya suka kecuali untuk satu masalah: deteksi crush.

Dalam gambar-gambar berikut, kotak biru muda mewakili tanah, kotak oranye adalah objek, dan panah menunjukkan arah gerakan.

Solusi sederhana untuk mendeteksi ketika pemain dihancurkan adalah untuk melihat apakah titik tabrakan di sisi yang berlawanan keduanya memicu. Jika ya, pemain dihancurkan. Di # 2, Anda dapat melihat skenario naksir normal. Pemain di-ground dan titik tabrakan atas berpotongan dengan objek yang jatuh. Ini memicu naksir.

# 3, 4, dan 5 menyajikan skenario bermasalah. Di # 3, pemain bergerak ke arah objek, yang bergerak ke atas. Titik tabrakan sisi kanan mengenai benda, menyebabkan tabrakan dan menghentikan pemain.

Sekarang, jika objek terus bergerak ke atas dan pemain terus bergerak ke kanan (seperti yang ditunjukkan pada # 4), objek membersihkan titik tumbukan sisi kanan pemain dan pemain bergerak ke kanan. Tapi sekarang, setelah melakukannya, objek memotong titik tumbukan atas yang menyebabkan naksir vertikal yang tidak diinginkan.

Skenario serupa ditunjukkan pada # 5. Dua objek terpisah cukup jauh untuk titik tumbukan bawah untuk membersihkan, memungkinkan pemain untuk jatuh, tetapi tidak sampai sejauh untuk memungkinkan titik tumbukan samping untuk membersihkan, menyebabkan himpitan horizontal yang tidak diinginkan.

Saya telah memeras otak saya pada solusi, tetapi tidak ada yang saya hasilkan telah bekerja dengan sangat baik, jadi saya bertanya-tanya apakah ada orang di luar sana yang memiliki ide atau wawasan tentang bagaimana menyelesaikan masalah ini.

masukkan deskripsi gambar di sini

Untuk menjernihkan kebingungan, titik tumbukan merah akan berada dalam sprite dan garis abu-abu hanya digunakan untuk menunjukkan sumbu yang relevan untuk setiap titik tumbukan. Misalnya, jika sprite karakter adalah kotak hijau sederhana, titik-titik tumbukan akan terlihat seperti ini:

masukkan deskripsi gambar di sini

IanLarson
sumber

Jawaban:

34

Saya pikir Anda harus mempertimbangkan pergerakan kotak . Artinya, hancurkan saja jika kotak bergerak ke arah pemain.

Ini mirip dengan masalah lain di platformer, di mana gerakan itu penting. Misalnya untuk platform yang bisa Anda lewati dan lewati dari bawah, jangan periksa tabrakan jika pemain bergerak ke atas.

Jadi satu blok dapat menghancurkan pemain dari atas hanya jika blok bergerak ke bawah; dari bawah hanya jika blok bergerak ke atas; dari kiri hanya jika bloknya bergerak ke kanan, dan seterusnya.

congusbongus
sumber
13
+1 Mempertimbangkan bahwa blok tersebut bertindak di sini, bukan pemain. Jadi, jika Anda memeriksa apakah kotak itu menghancurkan pemain alih-alih memeriksa apakah pemain sedang dihancurkan, masalah seharusnya lebih mudah dipecahkan
Niels
Bagaimana dengan ketika blok tidak bergerak? Saya menyadari sekarang saya menempatkan panah pada blok di # 5, tetapi itu dimaksudkan untuk menjadi dua blok stasioner.
IanLarson
Jika Anda memutuskan bahwa balok stasioner tidak boleh dihancurkan, pastikan saja bahwa pemain tidak macet dan dapat bergerak keluar.
congusbongus
Argh, aku benci dihancurkan oleh dua objek yang benar-benar bergerak menjauh satu sama lain, hanya karena aku membuatnya pixel-dan-frame-sempurna dan pengembang malas.
badak
9

Minta poin "crush test" berada di dalam kotak abu-abu yang ditunjukkan pada gambar Anda # 1 - yaitu, bunuh pemain hanya jika Anda mendeteksi hit pada salah satu piksel di sana.

Peter adalah
sumber
1
Apakah maksud Anda menambahkan titik naksir "di dalam" batas-batas titik tabrakan? Masalah yang saya lihat dengan itu adalah bahwa resolusi tabrakan akan terjadi di setiap sumbu ketika salah satu titik tabrakan itu "dipicu" sebelum objek bahkan memiliki kesempatan untuk mencapai titik periksa naksir bagian dalam.
IanLarson
6

Sebagai seseorang yang tumbuh dengan platformer 80-an, komentar pertama saya adalah bahwa titik kontak harus tepat pada sprite, bukan di mana pun di luar itu. Ada beberapa pengalaman yang lebih membuat frustrasi daripada mati ketika senjata / penghancur / musuh jelas berjarak beberapa piksel dari karakter Anda - dan pengalaman seperti itulah yang menghentikan orang bermain.

Dengan pemikiran itu, gagasan memiliki titik-titik terpisah untuk tabrakan horizontal dan vertikal tidak bisa terbang. Jadi kasing Anda 3 dan 5 tidak ada.

Adapun deteksi tabrakan, seperti yang telah dikatakan sebelumnya, Anda perlu mempertimbangkan arah gerakan, dan Anda memiliki dua sumbu gerakan untuk dipertimbangkan. Jika penghancur jatuh, pemain seharusnya tidak bisa berjalan ke depan - itu harus bertindak seperti dinding. Jadi dengan titik deteksi horizontal dan vertikal di tempat yang sama, Anda tidak bisa mendapatkan case 4, bahkan sebelum Anda menambahkan arah gerakan ke dalam campuran.

Crusher yang bergerak ke atas menambah kompleksitas ekstra. Jika begitu cepat sehingga pemain tidak memiliki kesempatan untuk melarikan diri, maka OK. Tetapi jika lebih lambat, pemain akan berharap untuk dapat melompati platform naik dan melompat dari sisi lain. Pemain sprite naik ke atas pada crusher, dan deteksi crush terjadi di langit - langit .

Graham
sumber
3
Poin minor - Anda tidak tahu seperti apa bentuk sprite-nya. Yang kami tahu, persis seperti yang ditunjukkan pada gambar di atas, jadi case 3 dan 5 mungkin sepenuhnya valid.
Alex
1
Alex benar. Saya mengedit untuk menjelaskan. Saya setuju bahwa tidak ada yang lebih buruk daripada kotak tumbukan tidak konstan. Saya pikir saya mengerti maksud Anda tentang tidak menggunakan titik terpisah untuk sumbu yang berbeda. Jika saya melakukannya, itu akan mengubah contoh di atas dari memiliki delapan poin menjadi empat, satu di setiap sudut, benar? Saya sebenarnya telah melakukan beberapa pengujian dengan itu dalam pikiran (dengan hasil yang kurang diinginkan), tetapi saya sangat ragu untuk melakukan itu, karena memiliki sudut "terpisah" mencapai perilaku yang saya cari hampir sempurna. Ini benar-benar satu-satunya skenario masalah yang pernah saya alami.
IanLarson
0

Anda bisa membuat objek "lebih keras" daripada tanah, yang berarti bahwa, dengan asumsi tabrakan, pemain akan didorong "ke" tanah, sebagai lawan didorong "ke" objek bergerak.

Ini mengasumsikan pemain tidak dapat mendorong diri "ke" benda atau tanah.

Zamfi
sumber
0

Jika Anda dapat mendeteksi objek yang tumpang tindih tanpa harus menunggu untuk ditampilkan, pendekatan sederhana adalah memproses gerakan untuk pemain dan objek lain secara mandiri, satu piksel pada satu waktu, dengan pemeriksaan tabrakan yang terpisah sesudahnya. Jika pemain bergerak bebas dan akan bertabrakan dengan objeknya sebagai hasil dari gerakan tersebut, mundurlah. Jika tabrakan terjadi dengan suatu objek sebagai hasil dari gerakan objek, periksa apakah pemain dapat bergerak ke arah yang sama dengan objek itu. Jika demikian, pindahkan pemain. Jika tidak, tangani situasi "himpitan" dengan tepat (merusak atau membunuh pemain dan / atau memindahkan benda bertabrakan ke belakang, tergantung pada kontak).

BTW, jika hanya sejumlah kombinasi bentuk yang dapat bertabrakan, mungkin berguna untuk menghitung pra-bitmap "deteksi tabrakan" sehingga jika sebuah piksel diatur dalam sprite pertama pada offset (x1, y1) dan pada yang kedua pada offset (x2, y2) detik, piksel pada offset (x1-x2, y1-y2) akan diatur dalam peta tabrakan. Peta tabrakan yang telah dihitung sebelumnya akan memungkinkan untuk mendeteksi tabrakan antara kedua sprite dengan memeriksa keadaan satu piksel dalam peta tabrakan.

supercat
sumber
0

Dibutuhkan dua objek untuk menghancurkan pemain. Deteksi naksir Anda harus memeriksa apakah pemain berada di antara dua objek, jarak di antara keduanya sama dengan ukuran pemain, dan jarak yang menurun.

Akumulasi
sumber
0

Saya menemukan selanjutnya bekerja sejauh ini. Itu tidak memerlukan info "eksternal" tentang gerakan crusher dan menyelesaikan masalah positif palsu. Ketika positif palsu terdeteksi, itu diperlakukan sebagai tabrakan (dan inilah sebenarnya):

Idenya adalah: mengapa memeriksa apakah crusher bergerak ketika kita benar-benar peduli jika karakter bergerak. Keduanya dapat menjawab jika naksir positif palsu yang disebabkan oleh gerakan karakter sendiri atau naksir benar oleh gerakan objek crusher.

Jika karakter bergerak dan dihancurkan (tabrakan di sisi yang berlawanan untuk frame yang masuk) kemudian periksa lagi untuk naksir pada frame / koordinat iterasi terakhir:

  1. Jika tidak dikonfirmasi lagi maka itu disebabkan oleh pergerakan karakternya sendiri dan karakter tersebut harus dikembalikan ke frame terakhir / koordinat iterasi seperti tabrakan

  2. Jika naksir dikonfirmasi untuk kedua kalinya maka lanjutkan dengan naksir.

Nikaas
sumber