Saya memiliki permainan yang menghasilkan peta level acak di awal level. Saya ingin menerapkan beberapa cara untuk menyimpan dan memuat level.
Saya berpikir mungkin XML akan menjadi pilihan yang baik untuk menyimpan semua variabel, maka akan mudah bagi saya untuk membangun sesuatu yang dapat mem-parsing XML itu dan menghasilkan tingkat yang sama persis.
Tetapi XML mungkin berlebihan untuk kebutuhan saya. Saya ingat kembali pada hari itu dengan konsol Sega tua yang tidak memiliki kemampuan untuk menyelamatkan gim Anda (saya pikir gim Worms juga melakukannya), bahwa mereka akan memberi Anda banyak karakter yang dapat Anda tulis. Jika Anda menekan string itu nanti, itu akan memuat level yang tepat.
Apakah "string level" menjadi pilihan yang baik? Apakah itu akan menjadi semacam konversi "base60"? Bagaimana saya menerapkan ini?
sumber
Apa pun format yang Anda gunakan untuk menyimpan permainan, demi kebaikan masukkan nomor versi. Anda akan dapat memiliki banyak kompilasi yang kompatibel dengan bercabang pada nomor versi, atau Anda akan dapat dengan aman mengenali simpanan yang terlalu lama untuk memuat.
Anda akan menyesal jika tidak melakukannya.
sumber
JSON baik, tetapi YAML lebih baik. :) http://www.yaml.org/ dan http://code.google.com/p/yaml-cpp/ untuk salah satu implementasi yang lebih baik untuk digunakan.
YAML adalah superset dari JSON yang menambahkan dukungan untuk beberapa fitur bagus, terutama:
sumber
Jika Anda ingin membuat serial semua data dalam game, saya akan merekomendasikan JSON sebagai format file Anda, itu sebabnya lebih mudah menggunakan XML dan dukungannya sangat bagus di banyak bahasa.
Saya telah menggunakan perpustakaan ini untuk C ++ dan berfungsi dengan sangat baik.
http://jsoncpp.sourceforge.net/
sumber
XML adalah pilihan yang baik jika Anda tidak dibatasi oleh ukuran dan didukung secara native (misalnya dalam. NET dan Flash) tetapi jika Anda menginginkan format yang ramping, Anda dapat membuat format dan parser Anda sendiri dengan mudah. Saya biasanya menggunakan 1 karakter misalnya. koma untuk memisahkan setiap objek. Untuk mendekode string, lakukan split pada koma. Sekarang setiap objek membutuhkan properti yang berbeda sehingga pisahkan dengan karakter yang berbeda, misalnya titik koma, dan gunakan karakter lain untuk memisahkan nama properti dari properti, misalnya. Usus besar. Semua dengan demikian dapat diterjemahkan dengan mudah tanpa regex hanya dengan menggunakan string.split. Berikut ini sebuah contoh:
Anda dapat menghemat lebih banyak ruang dengan mempertahankan nama properti hingga 1 karakter, mis. h untuk kesehatan. Misalnya.
Bandingkan dengan alternatif JSON:
Selain itu, jika Anda ingin menurunkan ukuran angka, Anda dapat menyandikannya menggunakan set karakter UTF16 yang dapat dicetak. Utas ini mengilhami saya untuk mengajukan pertanyaan tentang Stack Overflow tentang berapa banyak data yang dapat Anda masukkan ke dalam satu karakter di layar . Jawabannya tampaknya ada di suatu tempat lebih dari 40.000 nilai untuk bilangan bulat, jika Anda tidak keberatan memiliki kepingan, kanji, dan bidak catur: ♔♕♖♗♘♙♚♛♜♝♞♟
Untuk mendapatkan pengurangan ukuran lebih lanjut, Anda dapat menggunakan urutan baca / tulis untuk menentukan nilai mana, jadi dua karakter pertama mewakili id, dua berikutnya adalah posisi x, dua berikutnya y, lalu sudut, lalu kesehatan , dll. Jadi:
dapat menyimpan semua informasi yang sama dengan contoh lainnya.
Grid ubin dapat disimpan hanya sebagai string dengan setiap karakter mewakili jenis ubin yang berbeda misalnya:
di mana saya bisa berarti lava, 9 berarti rumput dll
sumber
Jika Anda melakukan pengkodean dalam .Net maka XML sangat mudah digunakan, karena Anda dapat membuat serial / deserialize kelas level Anda menjadi / keluar dari XML hanya dengan beberapa baris, dan kemudian semuanya dalam kelas yang dikelola dengan baik.
TheMap akan menjadi variabel tipe Peta yang Anda masukkan semua data Anda.
Dengan asumsi Anda memiliki kelas Peta yang sudah dibangun, ini akan menyimpan peta Anda ke XML:
Ini kemudian akan memuat XML itu kembali ke kelas peta Anda, untuk digunakan lagi dalam kode.
Dari titik ini, file XML Anda sekarang dimuat ke dalam kelas Anda agar mudah digunakan.
Adapun masalah "Level String" Anda, apa yang dinyatakan sebelumnya akan bekerja dengan baik, Anda bisa menggunakan nomor Seed sebagai "Level String".
Jika tidak, Anda hanya dapat melakukan pra-menghasilkan berbagai peta yang Anda inginkan, dan menyimpan semuanya dengan "Level String" dan kemudian menggunakannya untuk menarik peta yang tepat.
sumber
Saya akan menggunakan perangkat sederhana
struct
atau serupa (tergantung pada bahasa Anda) untuk menyimpan semua status permainan di tempat sentral. Jika Anda menginginkan perlindungan setter / getter, Anda dapat membungkus struct dalam aclass
.Jika Anda merasa sanggup melakukannya, gunakan bitfields atau lakukan manipulasi bit sendiri menggunakan operator bitwise.
Ketahuilah bahwa dalam beberapa bahasa, aturan untuk bantalan dan pengemasan struct mungkin sedikit rumit - tetapi mungkin juga tidak terlalu menjadi masalah bagi kasus Anda jika Anda memiliki satu atau dua byte bantalan.
Anda mungkin juga dapat menggunakan
#pragma
(seperti#pragma pack(1)
) atau__attribute__
untuk mengemas secara dekat struct, menghilangkan bantalan. Ini mungkin atau mungkin tidak berfungsi tergantung pada kompiler dan arsitektur target Anda.Perhatikan bahwa penggunaan bitfields dan paket pragma atau atribut dapat mengurangi portabilitas. Di seluruh arsitektur perangkat keras, endianness bidang struct (urutan byte) juga dapat berubah. Jadi, Anda mungkin ingin menghindari ini jika Anda mencoba untuk portabilitas.
(Untuk misalnya Pac-Man, struct ini mungkin secara naif mengandung peta id atau peta seed, posisi Pac-Man x dan y, empat posisi ghost x dan y, dan bitfield besar untuk ada atau tidaknya 32-64 pelet, apa pun maksimumnya.)
Setelah Anda memiliki struct Anda, meneruskannya ke sesuatu seperti fungsi xxencode :
Menulis fungsi ini agak rawan kesalahan; Anda perlu menggeser dan menggabungkan byte yang diperlukan untuk mendapatkan misalnya 6 bit sekaligus, kemudian menerjemahkannya ke dalam karakter yang sesuai. Saya pribadi mencoba memburu kode orang lain, kecuali saya melakukan ini untuk "bersenang-senang" (dan saya mungkin ingin test suite untuk itu).
Jangan pernah meremehkan kekuatan sekolah lama
struct
di tempat yang tepat. Kami telah menggunakannya satu ton untuk game GBA dan DS di sini.sumber
XML baik untuk dokumen terstruktur sewenang-wenang (elemen dapat muncul di berbagai tingkatan pohon) atau embedding format asing (seperti menempatkan svg di halaman xhtml). Jika Anda tidak memiliki persyaratan itu, ini adalah format yang benar-benar tidak efisien, dan sesuatu yang lebih sederhana seperti csv atau json lebih disukai.
sumber