Saya baru saja menyelesaikan game RPG dasar yang ditulis dalam C ++ SFML, saya telah berusaha keras untuk game ini dan saya ingin mendistribusikannya, namun saya mengalami masalah kecil.
Masalahnya adalah, saya memiliki lebih dari 200 gambar dan file peta (mereka file .txt yang menyimpan kode peta) semua dalam folder yang sama dengan yang dapat dieksekusi, ketika saya melihat di folder, itu membuat saya ingin menangis sedikit melihat begitu banyak sumber daya, saya belum pernah melihat permainan yang menunjukkan semua sumber daya secara langsung, sebaliknya saya percaya mereka mengemas sumber daya dalam file tertentu.
Nah, itulah yang saya coba capai: Saya berharap untuk mengemas semua gambar dalam 1 file (Mungkin file .txt juga) kemudian bisa membaca dari file itu atau dengan mudah menambahkannya.
sumber
Jawaban:
Pemrogram game mengandalkan salah satu dari dua metode utama penyimpanan data:
Kelemahan dari solusi pertama adalah masalah ruang disk yang terbuang, serta masalah instalasi yang lebih lambat.
Solusi kedua menyediakan perangkapnya sendiri, pertama adalah Anda harus menulis semua gambar Anda sendiri / suara / dll. memuat rutin yang menggunakan API khusus untuk mengakses data yang diarsipkan. Kelemahan lebih lanjut adalah bahwa Anda harus menulis utilitas arsip Anda sendiri untuk membangun arsip di tempat pertama.
Kecuali Anda akan selalu memuat semua file dari arsip, TAR / GZ mungkin bukan ide yang sangat bagus, karena Anda tidak dapat mengekstraksi file tertentu sesuai kebutuhan. Inilah alasan mengapa banyak game menggunakan arsip ZIP, yang memungkinkan Anda untuk mengekstrak file individual sebagaimana diperlukan (contoh yang baik adalah Quake 3, yang file PK3 tidak lain adalah file ZIP dengan ekstensi yang berbeda).
Sunting: "Sembunyikan" struktur folder gim dan "Simpan" hanya yang dapat dieksekusi
EDIT: Gamedev Tuts Plus memiliki sumber daya yang bagus
EDIT: libarchive
Salah satu solusi potensial libarchive, yang merupakan perpustakaan pengarsipan yang akan menangani mengekstraksi file dari arsip seperti file ZIP. Bahkan memungkinkan Anda untuk menetapkan file yang diekstraksi ke pointer FILE standar, yang akan membuat berinteraksi dengan perpustakaan lain yang berpotensi lebih mudah.
EDIT: ZIP Memformat file dengan ekstensi alternatif
Di sini, saya suka @ Joachim Sauer's Comment
sumber
.tar
, misalnya). Ini berkaitan dengan cara data disimpan secara fisik di disk.Solusi lain yang sering digunakan untuk "menyembunyikan" file game adalah struktur folder. Simpan hanya file executable Anda dan mungkin readme di direktori utama dan pindahkan file game ke dalam "folder" data folder. Saya pikir itu tidak biasa. Banyak game yang saya tahu menyimpan konten mereka sedemikian rupa.
sumber
Saya sangat suka PhysFS untuk ini. Ini memungkinkan Anda untuk mengakses folder atau arsip zip dengan kode yang sama. Ini bekerja dengan baik untuk semua tahap seumur hidup Game.
memperbarui:
Saya menggunakan tutorial yang disertakan dengan sumber dan dokumentasi doxygen untuk mempelajari PhysFS. API ini sebenarnya cukup sederhana, Anda akan menghabiskan lebih banyak waktu mempelajari cara memuat gambar ke SFML melalui buffer memori alih-alih dengan path file.
sumber
Saya sarankan menggunakan file ZIP. Ini adalah format yang ada di mana-mana dan Anda akan menemukan pustaka siap pakai yang memungkinkan Anda memuat file dari dalam file ZIP. Pencarian Google cepat bahkan mengungkapkan pemuat zip untuk sfml .
sumber
Nah, Anda bisa curang seperti yang mereka sebutkan :) Anda dapat membuat sprite-sheet dari citra, tidak perlu lagi meng-zipnya saat ini kecuali menghemat banyak ruang. Setelah Anda membuat lembar-sprite atau beberapa lembar-sprite dari gambar, Anda bisa mengganti nama ekstensi mereka. Sebagian besar Gamer tidak akan repot untuk memeriksa dan mengapa tidak menyerahkan opsi itu ke Artis yang mungkin ingin mengubah gim Anda di masa mendatang? Dengan cara itu mereka juga dapat membuat sprite-sheet, ganti ekstensi itu dan mulai bergulir.
Dengan file teks, saya dengan rendah hati menyarankan Anda mengubah data itu menjadi bentuk biner. Saya cukup yakin Anda akan menemukan cara sederhana untuk melakukannya .. Misalnya, jika Anda hanya menggunakan AZ, az dan 0-9, Anda dapat menggunakan 6 bit untuk mewakili setiap karakter, yang agak akan melindungi materi berhak cipta Anda, itu juga akan mencegah orang lain mengedit peta .. Anda selalu dapat menambahkan konverter peta jika Anda mau. Zip benar-benar masuk akal untuk teks.
sumber
Ini bukan hanya tentang jumlah sumber daya atau ruang disk.
Dengan banyak file tekstur yang berbeda, saat Anda menggunakan SFML, yang merender dengan OpenGL, setiap kali Anda akan merender tekstur, OpenGL perlu mengikat tekstur berikutnya ke kartu video (periksa glBindTexture ()), dan itu adalah tugas yang sangat mahal.
Dengan mengingat hal itu, Anda dapat menyadari mengapa gim biasanya menempatkan sejumlah sprite dalam tekstur yang sama, yang disebut spritesheets, sesuai dengan menu / level / peta gim Anda.
Hasilnya adalah keuntungan besar dalam kinerja, karena Anda merender banyak sprite dengan panggilan tekstur ikatan yang sama.
sumber
Saya pribadi akan menuju rute file biner kustom untuk ini. Ini adalah sesuatu yang saya lakukan sendiri sepanjang waktu sekarang, tidak sesulit kedengarannya, dan juga memberikan tingkat kebingungan bagi Anda file sumber daya game. Saya menulis artikel pengantar kecil Gamedev tentang ini belum lama ini jika Anda tertarik:
http://gamedev.tutsplus.com/tutorials/implementation/create-custom-binary-file-formats-for-your-games-data/
Sprite-sheet adalah subjek yang sepenuhnya berbeda tetapi itu adalah norma untuk kebanyakan game :)
sumber
Metode lain yang dapat Anda gunakan:
Versi gratis XnView menyediakan fitur yang disebut "
Strip of Images
" (SHIFT + A), yang memungkinkan Anda membuatsprite-collections
.Ini meminimalkan akses file dan sangat penting untuk aplikasi / game web untuk meminimalkan jumlah
HTTP-roundtrips
.Akses ke gambar individual kemudian diberikan melalui peta koordinat (misalnya definisi-css).
sumber
Pertama, Anda harus menulis semua gambar Anda sendiri / suara / dll. memuat rutin yang menggunakan API khusus untuk mengakses data yang diarsipkan. Kelemahan lebih lanjut adalah bahwa Anda harus menulis utilitas arsip Anda sendiri untuk membangun arsip di tempat pertama. Kecuali Anda akan selalu memuat semua file dari arsip, TAR / GZ mungkin bukan ide yang sangat bagus, karena Anda tidak dapat mengekstrak file tertentu sesuai kebutuhan. Inilah alasan mengapa banyak game menggunakan arsip ZIP, yang memungkinkan Anda untuk mengekstrak file individual sebagaimana diperlukan (contoh yang baik adalah Quake 3, yang file PK3 tidak lain adalah file ZIP dengan ekstensi yang berbeda). http://zpp-library.sourceforge.net/
sumber