Gerakan RPG Top Down dengan Koreksi?

27

Saya berharap kita semua memainkan Zelda: A Link to the Past, tolong perbaiki saya jika saya salah, tapi saya ingin meniru gerakan karakter 2D top-down dengan sentuhan koreksi. Ini sudah dilakukan di gim lain, tapi saya merasa referensi ini akan menjadi yang paling mudah untuk dihubungkan. Lebih khusus lagi jenis gerakan dan koreksi yang saya bicarakan adalah:

  • Gerakan melayang tidak terbatas pada gerakan berbasis ubin seperti Pokemon dan permainan lain di mana satu ketukan bantalan gerakan menggerakkan Anda satu kotak ke arah kardinal itu. Gerakan mengambang ini harus dapat mencapai gerakan diagonal.
  • Jika Anda berjalan ke Barat dan sampai ke dinding yang diagonal dengan gaya Timur Laut / Barat Daya, Anda dikoreksi menjadi gerakan Barat Daya bahkan jika Anda terus memegang kiri (Barat) pada pengontrol. Ini harus bekerja untuk kedua diagonal mengoreksi di kedua arah.
  • Jika Anda beberapa piksel off dari berjalan tepat ke pintu atau lorong, Anda dikoreksi menjadi berjalan melalui lorong atau menyusuri lorong, yaitu menabrak sudut menyebabkan Anda didorong ke lorong / pintu.

Saya sudah mencari cara yang efisien untuk mencapai ini dan tidak beruntung. Untuk lebih jelasnya saya berbicara tentang gerakan karakter manusia, bukan gerakan NPC. Apakah sumber daya mereka tersedia pada gerakan semacam ini? Persamaan atau algoritma dijelaskan pada wiki atau sesuatu?

Saya menggunakan Kerangka XNA, apakah ada sesuatu di dalamnya untuk membantu dengan ini?

Corey Ogburn
sumber

Jawaban:

23

Nah, poin pertama adalah mudah. Anda cukup menyimpan dan memanipulasi posisi karakter di koordinat dunia atau piksel alih-alih koordinat berbasis ubin. Jika Anda memiliki masalah dengan ini, itu mungkin karena pilihan representasi yang membingungkan untuk dunia Anda dan ruang ubin, jadi mungkin Anda harus memposting rincian lebih lanjut tentang itu / mengajukan pertanyaan terpisah, spesifik.

Untuk poin kedua, pendekatan yang paling langsung adalah dengan mengambil vektor gerakan pemain (dinormalisasi) dan menambahkannya ke vektor normal dinding, lalu melakukan renormalisasi. Tanda komponen vektor yang dihasilkan akan menunjukkan bagaimana dinding terkait dengan gerakan pemain sementara vektor itu sendiri menunjukkan ke arah mana pemain sekarang dapat bergerak.

Untuk poin ketiga, dengan asumsi Anda memiliki persegi panjang tabrakan untuk dinding dan pemain, Anda harus dapat menentukan berapa banyak kontak persegi panjang tabrakan pemain dengan persegi panjang tabrakan dinding. Jika, misalnya, pemain bergerak ke kanan dan mengenai dinding vertikal, Anda membandingkan luas sumbu Y dari persegi panjang tabrakan - jika jika tingkat pemain melebihi batas dinding dengan beberapa ambang, katakanlah 75% dari Y pemain sejauh sumbu, maka Anda "menipu" pemain ke arah pintu.

Saya telah membuat cukup banyak asumsi di sini tentang bagaimana model objek Anda terlihat dalam kode Anda dan teknik apa yang Anda pilih - sebagian besar karena keumuman pertanyaan Anda. Saya sudah mencoba menyarankan pendekatan yang sederhana (walaupun mungkin tidak optimal) untuk alasan yang sama. Jika Anda dapat memberikan informasi yang lebih spesifik, baik dalam pertanyaan ini atau yang baru, saya dapat mencoba memberikan lebih banyak detail atau ide yang lebih baik.

Josh
sumber
Ya, melayang karakter di sekitar itu tidak masalah. Hanya memastikan orang melihat bahwa itu adalah persyaratan. Anda memang memberi saya jawaban kunci: Ubin memiliki vektor! Aku tidak percaya aku tidak memikirkan itu. Terima kasih.
Corey Ogburn
Di zelda , hanya ada satu sudut yang bisa mereka pakai, jadi tidak perlu menghitung vektor normal, itu hanya kasus khusus dalam kode.
BlueRaja - Danny Pflughoeft
Saya tidak mengerti bagaimana Anda memberikan ubin vektor. Seperti apa kelihatannya?
test
Genteng mungkin sudah memiliki data seperti grafiknya, baik bisa dilewati atau tidak, dll. Ini hanyalah bidang lain. Sebagai contoh: struct Tile {vector2 normal; ...} Nilai normal harus datang dengan data yang mendefinisikan ubin
Josh
@JoshPetrie Mencabut ini. Bukankah ubin yang dapat bertabrakan dengan berbagai arah perlu memiliki banyak vektor? Saya tidak yakin saya mengerti bagaimana ubin bisa memiliki satu vektor.
tes
4

Sebagai jawaban yang mungkin untuk titik kedua adalah memproyeksikan vektor gerakan pemain di sepanjang vektor dinding menggunakan produk titik (ab * dinormalisasi (b)). Anda kemudian mendapatkan vektor yang memberi tahu Anda seberapa jauh untuk memindahkan pemain ke arah dinding, dan jika Anda memindahkan pemain dengan vektor itu, Anda mendapatkan 'slide' di sepanjang dinding. Bekerja dengan baik untuk saya dalam proyek game sebelumnya.

James
sumber
3

Jawaban yang bagus untuk Josh, tetapi saya akan menambahkan beberapa saran: - Untuk info lebih lanjut tentang meluncur di dinding, lihat pertanyaan saya - dari jawaban ini saya berhasil membuatnya bekerja dengan sangat baik. - Jika saya tidak salah, saat berjalan layar Link akan mudah untuk menyelaraskan ke seluruh kotak persegi horisontal terdekat. Dengan cara ini ketika Anda sampai ke pintu Anda lebih mungkin untuk berbaris dengan benar (mungkin salah). - Agar mudah melewati pintu, pastikan kotak tumbukan karakter Anda jauh lebih kecil dari lebar pintu.

Iain
sumber
Atau mungkin kotak tabrakan menjadi lingkaran?
Oskar Duveborn
2

Untuk koreksi memasuki pintu, Anda bisa membuat objek tabrakan untuk pintu sedikit lebih besar dari gambar pintu. Ini akan menghasilkan efek yang sama yang diusulkan oleh Josh, tetapi tanpa harus menghitung kedekatan dengan persegi panjang tabrakan dinding.

RavensKrag
sumber