Saya membuat game strategi 2 dimensi, berbasis giliran menggunakan c ++ dan SFML-2.0. Gerakan berbasis jarak daripada berbasis grid, dengan beberapa potongan berbentuk segitiga berbeda yang, pada gilirannya, masing-masing dapat berputar di tempat atau bergerak maju.
Gerakan akan bekerja sedemikian rupa sehingga pemain memilih lokasi untuk potongan untuk bergerak, yang menghasilkan jalur potensial untuk potongan untuk mengambil. Setelah pemain mengonfirmasi keputusannya, karya tersebut akan bergerak di sepanjang jalan itu ke lokasi yang diinginkan. Jalur dibatasi oleh dua faktor: jarak, seberapa jauh sebuah karya dapat berjalan, memperhitungkan setiap belokan (jadi jika ada kurva, itu akan menjadi panjang di sepanjang kurva, dan tidak langsung dari titik ke titik); dan sudut kemudi, seberapa jauh potongan dapat berputar di titik (dan hingga setiap) saat bergerak (misalnya, dari -30 hingga 30 derajat).
Pertanyaan saya adalah, bagaimana saya harus menentukan kisaran lokasi potensial yang bisa dipilih pemain untuk dipindahkan?
Saya tidak sepenuhnya yakin persamaan dan / atau algoritma apa yang digunakan di sini. Rencana awal saya sangat rumit, sampai pada titik di mana hampir tidak mungkin untuk dilaksanakan, apalagi menjelaskan, dan saya pada titik ini benar-benar kehilangan dengan proyek terhenti.
Bagaimana saya bisa menentukan rentang unit yang bisa bergerak, dengan mempertimbangkan radius beloknya?
Misalnya, pada gambar di bawah ini. Garis merah, biru dan hijau semuanya akan memiliki panjang yang sama. Lingkaran ungu menunjukkan rentang gerakan yang dapat dipindahkan unit. (Bentuknya mungkin tidak akurat dan garis-garisnya mungkin sebenarnya tidak sama, tetapi Anda tahu)
sumber
Jawaban:
Hasilkan bidang aliran atau jarak, menggunakan Dijsktra.
Pada dasarnya, isi kotak menggunakan algoritma Dijkstra tanpa tujuan (mungkin nama yang berbeda untuk itu; tidak tahu itu). Ambil saja setiap simpul terbuka, hitung tetangga yang dapat dijangkau, dorong mereka pada daftar terbuka, atur pada daftar tertutup, perbarui jalur "berikutnya" simpul induk sesuai keperluan, dll. Saat menentukan biaya untuk mencapai simpul baru, pertimbangkan batasan belok.
Hasilnya sekarang adalah bahwa Anda memiliki jaringan semua node Anda tentang cara untuk kembali ke awal. Node yang tidak dapat dijangkau tidak akan tersentuh oleh langkah pertama. Node yang dapat dijangkau akan dikomputasi dengan elemen "node berikutnya di sepanjang jalur terbaik ke induk" sehingga Anda dapat menyorot semua node dan kemudian juga menggunakan informasi ini untuk menampilkan atau mengeksekusi jalur pergerakan saat pengguna melayang atau mengklik area yang disorot.
sumber
Solusi brute force adalah:
Jadi, dimulai dengan lingkaran biru, Anda akan memproses jalur Anda, berakhir dengan lingkaran ungu. Kemudian Anda dapat menggunakan titik-titik tersebut dengan titik tengah pada unit untuk membuat segitiga merah yang diperlukan untuk menampilkan bentuk. (Hanya membuat gambar itu membuat saya menyadari bahwa bentuk itu tidak benar, tetapi akan menarik untuk melihat apa yang sebenarnya benar)
sumber
Saya akan memperluas solusi Sean dalam jawaban yang terpisah, karena itu mewakili pendekatan yang berbeda dari apa yang saya usulkan pada awalnya.
Solusi ini mungkin merupakan metode yang paling mudah diakses. Ini membutuhkan partisi lingkungan Anda menjadi node. Ya, ini memperkenalkan kembali pendekatan berbasis grid, tetapi dapat dibuat relatif baik, atau digunakan untuk pencarian jalur luas dengan posisi yang lebih halus ditangani dalam node. Semakin kasar struktur node, semakin cepat pathfinding.
Masalah besar di sini adalah bahwa Anda benar-benar berurusan dengan menghadap ke kapal, begitu banyak solusi merintis jalan tradisional tidak dapat digunakan tanpa modifikasi. Ini biasanya path-agnostik, karena mereka tidak peduli bagaimana Anda sampai ke simpul Anda berada. Itu berfungsi dengan baik ketika akselerasi, deselerasi, dan belok instan dan gratis. Sayangnya bagi Anda berbelok tidak gratis. Namun, karena benar-benar ada satu informasi tambahan yang hilang dalam penyederhanaan ini, kita dapat menyandikannya sebagai variabel lain. Dalam fisika, ini akan dikenal sebagai ruang-fase.
Dengan asumsi 2 dimensi untuk saat ini, Anda dapat memperkirakan 3:
Biasanya, Anda akan memerlukan satu simpul untuk setiap posisi koordinat yang diijinkan dan terpisah. Sebagai contoh:
Dll. Anda akan membangun sebuah nodegraf dari titik-titik yang berdekatan dan menghubungkannya dengan jarak spasial. Kemudian Anda akan menggunakan algoritma Dijkstra, membunuh node yang melebihi nilai pergerakan yang diizinkan untuk belokan, sampai tidak ada node hidup yang belum dijelajahi yang masih terhubung ke node yang dieksplorasi. Setiap node melacak jarak terkecil yang diperlukan untuk mencapainya.
Untuk memperluas metode ini agar dapat digunakan dengan Rotasi, bayangkan nodegraf yang sama ini dalam 3 dimensi. Arah Z sesuai dengan rotasi / menghadap, dan bersifat siklis, artinya jika Anda terus bepergian ke arah + Z Anda kembali ke tempat Anda memulai. Sekarang, node yang sesuai dengan posisi yang berdekatan hanya terhubung melintasi menghadap yang sesuai dengan arah itu. Anda mengulangi node yang terhubung ke node yang sudah dieksplorasi seperti biasa. Saya akan merekomendasikan membatasi ke N, NE, E, SE, S, SW, W, NW dalam skema ini.
Solusi ini dapat memberi tahu Anda semua wilayah ruang yang dapat diakses, serta jalur terbaik untuk sampai ke sana, berapa rotasi yang Anda miliki saat tiba di sana, dan semua orientasi yang bisa Anda miliki ketika tiba di sana.
Kemudian, ketika benar-benar mengeksekusi pathing, Anda bebas untuk menginterpolasi / kubik spline jalan Anda agar terlihat lebih otentik.
sumber
Kedengarannya seperti Anda mungkin perlu terlebih dahulu memutuskan bagaimana tepatnya Anda ingin mengaktifkan on-the-go untuk bekerja. Opsi seperti:
Jika mereka bergerak di dalam kerucut, pertama-tama memutar, kemudian mulai bergerak. Ini adalah solusi yang lebih mudah untuk diterapkan dan dilalui. Ini juga kurang menarik sehingga saya tidak ingin menggunakannya.
Terus berputar sambil bergerak, hingga total 45 derajat. Yang ini jauh lebih rumit, dan mudah-mudahan yang Anda kejar. Berintegrasi secara numerik pada jalur menggunakan stempel waktu tetap mungkin merupakan cara termudah untuk mendekati yang ini. Kerucut Anda akan dibatasi oleh putaran maksimum (+ X derajat setiap langkah) dan minimum (-X derajat setiap langkah).
Cara terbaik untuk melewati ruang angkasa dengan persyaratan kedua ini sangat tergantung pada lingkungan tempat mereka akan bergerak. Jika ada banyak kendala yang harus Anda lalui, maka segala sesuatunya menjadi sangat rumit dan sangat mahal. Namun, jika tidak ada, maka Anda dapat memuat-depan rotasi (dan bahkan meruncing) untuk berakhir di lokasi yang diinginkan.
Saya merasa bahwa saya mungkin hanya membahas sebagian topik yang Anda tanyakan, jadi silakan menambahkan lebih banyak di komentar dan saya dapat memperluas diskusi.
sumber