2D Tampilan peta top-down

8

Saya bertanya-tanya bagaimana cara kerjanya.

Apakah Anda memuat peta lengkap saat permainan dimulai, atau apakah Anda memuat bagian peta saat runtime?

Dan bagaimana Anda menyimpan peta? Apakah itu dalam format XML atau biner?

Terima kasih!

Kevin
sumber

Jawaban:

23

Saya setuju dengan eBusiness. Itu tergantung pada ukuran dan bagaimana Anda ingin mengeditnya.

Perkirakan ukuran byte peta Anda dalam representasi yang cukup kompak. Tentukan juga bagian peta mana yang dapat berubah saat game dimainkan. Bagian-bagian yang tidak berubah dapat dimuat dan tidak harus disimpan. Jika perkiraan ukurannya kecil, simpan saja semuanya dalam memori. Ini tidak sebanding dengan kompleksitas tambahan memuat bagian-bagian peta dan melacak apa yang telah Anda muat atau tidak, kecuali jika datanya sangat besar sehingga diperlukan.

Misalnya jika Anda menulis Civilization II , ukuran peta Anda mungkin 100x100 petak.

  1. Setiap ubin adalah salah satu dari 12 jenis, sehingga Anda dapat menyimpannya dalam 4 bit. Itu berarti peta utama adalah 100 x 100 x 0,5 byte = 5.000 byte untuk menyimpan tipe ubin. Peta utama tidak pernah berubah.
  2. Anda juga dapat meningkatkan ubin peta dengan jalan, irigasi, dll., Dan ada hingga 7 peningkatan. Itu berarti 2 ^ 7 nilai yang berbeda, mengambil 7 bit, tapi kami mungkin hanya akan menggunakan 1 byte untuk itu. Itu memberi kita 100 x 100 x 1 byte = 10.000 byte untuk menyimpan perbaikan.
  3. Kabut perang memberi tahu kami petak peta mana yang telah Anda lihat, jadi Anda perlu 1 bit per pemain. Jika Anda membatasi hingga 8 pemain, itu byte lain per petak peta, atau 10.000 byte untuk kabut perang.
  4. Akhirnya, ada semua kota dan unit. Anda dapat memperkirakan bahwa setiap pemain memiliki hingga 20 kota dan 100 unit, dan masing-masing ini mungkin membutuhkan 100 byte data (tebakan liar), jadi itu 12.000 byte (lebih banyak lagi jika Anda menggunakan XML).

Itu di bawah 30k untuk representasi biner kompak objek peta II Civ, sehingga Anda dapat menyimpan semuanya dalam memori, bahkan jika Anda menggunakan format verbose yang jauh lebih besar. Saya mendapatkan angka-angka di atas dari seseorang yang melakukan rekayasa terbalik pada struktur peta Civ II .

Daggerfall , yang dianggap oleh beberapa orang memiliki peta yang sangat besar, tampaknya 5000x2500 dan sekitar 25 megabita, tetapi juga memiliki sejumlah besar NPC (750.000 adalah apa yang saya baca tetapi tampaknya sangat tinggi). Pada komputer desktop / laptop saat ini, ini juga dapat masuk ke dalam memori, tetapi pada perangkat seluler atau browser yang mungkin agak terlalu besar. Ada wiki yang menjelaskan format peta Daggerfall .

Anda dapat mengurangi ukuran dengan mengidentifikasi dan memperhitungkan redundansi . Misalnya, alih-alih menyimpan masing-masing 100.000 pohon atau pedang identik dalam format XML, simpan satu pohon dan satu pedang dan 100.000 referensi untuknya. Dalam format biner referensi itu mungkin hanya 1 atau 2 byte, dan dalam format yang lebih verbose referensi masih bisa cukup kecil.

Lakukan hal paling sederhana yang bekerja untuk gim Anda. Jika peta ini kecil, tidak masalah jika Anda menggunakan format yang ringkas atau bertele-tele. Jika format ringkas akan masuk ke dalam memori tetapi format verbose tidak, Anda harus memutuskan apakah kerja ekstra format biner lebih atau kurang dari kerja ekstra memuat bagian peta. Itu akan tergantung pada gimnya. Dalam gim yang mirip Civ di mana Anda membutuhkan semua data untuk mensimulasikan putaran, format biner mungkin merupakan pilihan yang lebih baik. Dalam gim yang mirip Daggerfall di mana Anda tidak perlu memuat area kecuali yang dekat dengan pemain, memuat sebagian peta mungkin merupakan pilihan yang lebih baik. Jika peta itu benar besar yang bahkan format ringkasnya tidak akan muat dalam memori, maka tanyakan pada diri Anda apakah itu benar-benar layak semua pekerjaan ekstra untuk menghadapinya, dan jika demikian, desain format biner yang Anda dapat memuat sebagian.

Untuk proyek (hobi) saya saat ini, peta dan semua objek di dalamnya masuk ke dalam 50 MB, jadi menyimpannya dalam memori akan baik-baik saja. Namun, saya ingin itu berjalan di browser, dan 50 MB lebih dari yang saya ingin transfer melalui jaringan, jadi saya menyimpan semuanya di dalam memori di server dan kemudian memuat hanya bagian dunia di klien. Ubin peta saya adalah 1 byte per ubin, 2048x2048 ubin (4 MB). Objek (pohon, kursi, orc, dll.) Dikodekan JSON untuk kesederhanaan. Di klien saya hanya memuat area peta (termasuk objek mereka) yang berada di dekat pemain.

amitp
sumber
1
Terima kasih atas jawaban yang bagus, ini sangat berarti bagi saya! (PS semoga sukses dengan proyek Anda :)
Kevin
4

Berapa banyak memuat tergantung setidaknya pada seberapa besar peta, jika data cukup masuk dalam memori maka benar-benar tidak ada alasan untuk repot dengan pembebanan progresif.

Hal yang paling penting dari XML adalah mengambil banyak penyimpanan / memori / ruang jaringan / lalu lintas tambahan. Jika Anda berpikir menggunakan XML itu menyenangkan, pastikan untuk melakukannya hanya untuk jumlah data yang relatif kecil.

Saat Anda mendesain format data, Anda harus memikirkan bagaimana Anda ingin mengedit data ini. Anda dapat menggunakan editor teks sederhana untuk menulis data Anda sebagai file teks biasa, Anda dapat menggunakan file-file ini secara langsung atau Anda dapat mengonversinya menjadi format biner untuk menghemat ruang. Anda dapat menggunakan editor gambar untuk menjadikan level Anda sebagai bitmap, sekali lagi, Anda mungkin ingin mengonversi ke file yang lebih kecil.

Atau Anda bisa membuat editor sendiri, dalam hal ini ada sedikit alasan untuk tidak menggunakan format biner yang ringkas.

aaaaaaaaaaaa
sumber
1

Tidak ada satu jawaban untuk pertanyaan ini. Ini semua secara inheren terserah Anda.

Anda tetap dapat menyimpan peta yang Anda suka dan menampilkan / merendernya kapan saja.

Bryan Harrington
sumber
Saya akan menambahkan satu hal lagi, alasan kinerja mungkin membuat Anda memuat potongan peta dari waktu ke waktu, tetapi saya pikir untuk sebagian besar permainan praktis itu benar-benar tidak masalah kecuali Anda mengembangkan pada perangkat seluler.
Bryan Harrington
2
Ini mungkin benar, tetapi mungkin menyenangkan untuk memberikan beberapa cara umum ini dilakukan.
Bebek Komunis
Sementara saya mengerti, saya dulu berada di posisi itu "Bagaimana saya melakukan 'ini'". Saya belajar dengan cara yang sulit dalam kursus grafik yang saya ambil, kami perlu menerapkan A * dengan mesh Navigasi. Saya menghabiskan waktu berjam-jam untuk meneliti, membaca, dan mencoba mencari cara untuk melakukannya. Pada akhirnya, itu tidak pernah selesai. Pelajaran apa yang saya pelajari? Seharusnya saya melakukannya dengan cara yang saya mengerti bagaimana melakukannya sebelum saya membuat otak saya berbelit-belit.
Bryan Harrington