Saya membuat game Tower Defense di Flash tanpa jalur yang telah ditentukan.
Meskipun kisi saya adalah 40x40 (kecil?), A * berjuang ketika menghitung ulang setiap waktu. Jadi saya membuat modifikasi sendiri untuk memudahkan perhitungan ulang dan jumlah sel yang disentuh turun menjadi sekitar 900 (ketika memodifikasi di dekat root). Itu masih membeku untuk waktu yang sangat singkat, tetapi dapat terdeteksi, ketika menara baru ditempatkan.
Apakah ini masalah implementasi, atau 40x40 terlalu banyak?
Edit:
Struktur kode saya:
- Semua data disimpan dalam array sel 2d.
- Setiap sel berisi induknya dalam arah jalur (1-8 searah jarum jam) dan larik dikodekan bitwise dari anak-anaknya di jalur (setiap bit mewakili anak).
- Pencarian dilakukan oleh A * dengan perkiraan jarak euclidian.
Jawaban:
Saya tidak bisa berkomentar, tetapi profil pertama di Flex, yang lainnya adalah dugaan.
sumber
Saya berasumsi bahwa TD adalah 'Tower Defense'
Saya pikir A * agak berlebihan untuk ini.
Di awal permainan, banjir memenuhi area permainan dari titik keluar untuk membuat peta pergerakan:
dan pergerakan selalu menuju kotak dengan nilai yang lebih rendah.
Ketika pemain menempatkan menara, perbarui masing-masing dari delapan kotak yang berdekatan: untuk setiap kotak, tetapkan nilai gerakannya menjadi satu lebih dari nilai berdekatan terendah. Jika nilainya berubah, ulangi proses yang berpusat pada kotak yang diperbarui. Kemudian, untuk memeriksa bahwa rute ke pintu keluar tidak diblokir, pastikan semua kotak berdekatan dengan kuadrat dengan nilai yang lebih rendah.
Saat pemain memindahkan menara, atur nilai gerakan ke satu lebih dari kotak terdekat yang berdekatan dan ulangi proses di atas.
Pendekatan yang lebih sederhana adalah dengan mengisi ulang banjir.
sumber
Aneh, saya pikir saya membalas ini, tetapi jawabannya sepertinya hilang. Buat algoritma pencarian Anda sedemikian rupa sehingga dapat diperbarui dalam beberapa langkah, sehingga ketika Anda menempatkan menara dan memainkan animasi, Anda dapat melakukan sedikit setiap frame dan Anda akan memiliki tempat antara setengah detik dan satu detik untuk memperbarui Anda A * tanpa jeda yang nyata. Ini latensi - Jika Anda tidak dapat mempercepatnya, temukan cara untuk menyembunyikannya. Bermain animasi sambil menempatkan menara adalah hal yang wajar untuk sebuah game dan merupakan tempat yang bagus untuk menyembunyikannya.
sumber
Sebagai permulaan Anda bisa mengubah array Anda menjadi vektor - seharusnya memberi Anda beberapa peningkatan kecepatan. Poskan kode dan kami mungkin dapat menyarankan lebih banyak optimisasi.
sumber
Saya kira perlambatan Anda adalah karena Anda menghitung jalur untuk semua karakter secara bersamaan. Menghitung jalur untuk satu karakter adalah cepat tetapi jika ada dua lusin karakter dalam adegan maka itu dapat menghalangi.
Alih-alih, Anda harus menyebar beban beberapa frame. Singkirkan pembaruan AI Anda sehingga karakter yang berbeda memperbarui jalurnya pada bingkai yang berbeda. Akan sangat terlihat jika karakter tidak bereaksi sampai sedetik kemudian, tetapi hanya satu frame tidak akan menyebabkan reaksi buruk.
sumber