Bagaimana cara menentukan urutan pengundian dalam game flash tampilan isometrik?


12

Ini untuk flash game, dengan tampilan isometrik. Saya perlu tahu cara mengurutkan objek sehingga tidak perlu memeriksa z-buffer saat menggambar. Ini mungkin tampak mudah tetapi ada batasan lain, sebuah adegan dapat memiliki 10.000 objek sehingga algoritma harus dijalankan dalam waktu kurang dari O (n ^ 2). Semua objek adalah kotak persegi panjang, dan ada 3-4 objek bergerak dalam adegan. Apa cara terbaik untuk melakukan ini?

MEMPERBARUI

di setiap ubin hanya ada objek (maksudku benda tidak bisa menumpuk di atas satu sama lain). dan kami mengakses kedua Obyek dan Objek memiliki posisi sendiri.

UPDATE2

lihat angka-angka ini:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

pertama satu objek biru pertama harus digambar kemudian hijau lalu merah. sedangkan yang kedua Anda harus menggambarnya dalam urutan terbalik. Anda perlu menggambar objek merah pertama dan kemudian hijau dan akhirnya biru. seperti yang Anda lihat tidak ada perbedaan posisi benda biru dan merah, keduanya memiliki jarak yang berbeda dari kamera dan sebagainya. tetapi karena posisi relatif mereka ke kotak hijau, Anda perlu mengubah urutan pengundian antara dua gambar. itulah yang membuat masalah ini berantakan.

Catatan: karena semua objek adalah prisma segi empat, secara matematis dapat dibuktikan bahwa setidaknya ada satu urutan undian untuk memenuhi kebutuhan masalah.


2
Anda harus memposting informasi lebih lanjut. Bisakah benda menumpuk (3d)? Objek memiliki posisi atau peta memiliki objek? dll
kaoD


@Tetrad ya, tapi ada sedikit perbedaan tentang objek yang kita masukkan ke dalam adegan.
Ali1S232

@Gajet (setelah pembaruan Anda) objek hanya bisa 1 * X dan X * 1 atau juga X * Y? Bisakah Anda membaginya menjadi beberapa sub-objek? (Seperti hijau menjadi 4 objek sub-hijau) Apakah orientasi objek tetap?
kaoD

Juga: berapa banyak ubin yang berdekatan yang ketinggian objek Anda tidak jelas?
kaoD

Jawaban:


8

Ini sebenarnya sangat sederhana jika objek Anda cocok dengan ubin isometrik Anda. Lihatlah gambar ini:

Urutan gambar isometrik

Pertama-tama Anda harus menggambar objek pada posisi merah, lalu objek dengan warna biru, lalu hijau, lalu kuning, lalu magenta, dan seterusnya ... Seharusnya sudah cukup jelas bagaimana menerapkan ini jika papan Anda memiliki objek di dalamnya alih-alih objek memiliki posisi sebagai atribut. Jika itu bukan kasus Anda, Anda harus menyimpan struktur data terpisah, memperbaruinya setiap kali objek bergerak (yang seharusnya juga cukup mudah.)

Ini memiliki masalah baru: Anda dapat dengan mudah melihat bagaimana sekarang kompleksitasnya adalah O (N) di mana N adalah ukuran papan Anda ( N=W*H). Untuk mengatasi masalah ini, buat saja struktur data linier baru di mana setiap indeks dalam struktur Anda cocok dengan kedalaman yang diberikan, perbarui setiap kali objek mengubah kedalaman.

Kasus di mana suatu objek tidak cocok dengan satu ubin sedikit lebih sulit, jadi saya akan mempostingnya jika Anda membutuhkannya segera setelah Anda memperbarui pertanyaan Anda.


Algoritma itu juga yang pertama muncul di benak saya, tetapi lihat pembaruan saya, itu sebabnya Anda tidak dapat menggunakannya tanpa perubahan.
Ali1S232

1
@Gajet dan itulah yang harus Anda posting di pertanyaan Anda di tempat pertama: P
kaoD

3
Ini adalah cara untuk pergi, membagi bagian-bagian besar di 'ubin' +1
Valmond

2

Saya tidak memiliki pengetahuan khusus tentang hal ini, tetapi inilah pemikiran.

Mulailah dengan menandai setiap sel sebagai "tidak ditarik". (Atau, ekuivalen, gunakan array untuk mewakili lokasi hal "yang ditarik" terdekat pada setiap "garis paling jauh" sel, atau set, dll. Kemudian, untuk setiap sel (saya mungkin akan menjelajahinya dalam urutan yang dijelaskan oleh kaoD): periksa apakah sel itu telah ditarik; jika belum ditarik dan berisi objek, periksa apakah setiap sel yang akan dikaburkan oleh objek itu telah ditarik, dan jika tidak gambar itu secara rekursif; gambar objek yang terkandung oleh sel itu jika perlu; dan tandai sel itu dan semua sel yang ditempati oleh objeknya sebagai "digambar".

Saya berasumsi bahwa Anda dapat dengan cepat memetakan sel ke objek di dalamnya, jika ada. Saya percaya ini adalah O (n) kali, meskipun itu bisa berakhir membangun tumpukan besar (yang Anda mungkin ingin berubah menjadi daftar tertaut jika Anda khawatir kehabisan ruang tumpukan).

Jika Anda benar-benar membutuhkan daftar, Anda dapat menambahkan daftar bukan menggambar. Saya menduga bahwa memulai dengan daftar yang sebagian besar disortir tidak membantu.


Saya percaya algoritma ini dapat dilihat sebagai bentuk semacam topologi yang disesuaikan dengan masalah; Aku baru saja akan menunjuk secara samar ke arah itu. Jenis topologi adalah solusi untuk sebagian besar masalah pemesanan / ketergantungan.
Kevin Reid

1

Saya akan menggunakan algoritma pelukis dengan jarak taksi dari sel terjauh dari kamera, menggambar yang terdekat dengan kamera terlebih dahulu dan kemudian bergerak ke luar.

Sunting: Ini tidak berfungsi kecuali Anda dapat menggambar konten masing-masing sel secara terpisah.


ini mungkin bekerja, tetapi saya tidak tahu bagaimana itu berbeda dari algoritma byte56 atau kaoD yang disarankan. bagi saya sepertinya masih memiliki masalah yang sama seperti yang dijelaskan dalam edit kedua saya.
Ali1S232

1

Apa yang membuat Anda percaya bahwa “dapat dibuktikan secara matematis bahwa setidaknya ada satu urutan undian untuk memenuhi kebutuhan masalah”? Ini adalah contoh tandingan sepele di mana Anda tidak bisa bergantung pada objek penyortiran z:

masukkan deskripsi gambar di sini


Hanya ingin tahu ... bisakah Anda menguraikan contoh tandingan? Itu bukan kotak.
kaoD

Perhatikan bahwa hanya ada satu objek di setiap ubin, dan objek dapat menempati satu atau lebih ubin, tetapi mereka selalu memiliki proyeksi persegi panjang di pesawat. dua syarat ini cukup untuk membuktikan pernyataan itu.
Ali1S232

Oke, dengan batasan-batasan itu dan fakta bahwa kisi-kisi itu datar ada solusinya. Saya akan mempostingnya nanti.
sam hocevar
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.