将多个块保存/加载到一个文件中?

时间:2016-07-17 05:37:59

标签: c# monogame file-storage

所以我正在开发的一个项目是一个基于体素的游戏,它将拥有大型的3D阵列块,问题在于保存它们,我似乎无法弄清楚如何保存多个块。数组到一个文件中,只在需要时从文件中加载所需的块。关于如何做到这一点的任何想法?理想情况下,我可以制作多个较小的文件,但这可能会很不方便。

1 个答案:

答案 0 :(得分:0)

您可以在文件开头使用标题来告诉程序文件中块的位置

类似

Chunk1=256,Chunk2=512

等等。

或者您可以使用BinaryFormatter存储块

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Helpr
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] Chunks = new int[10 * 10]; //Created this dummy chunk array to show that it works
            for(int x = 0; x < 10; ++x)     
            {
                for(int y = 0; y < 10; ++y)
                {
                    Chunks[x + (10 * y)] = x * y;       //Set the data
                }
            }

            SaveChunks(Chunks, "Chunks.world"); //Save the chunks with a file name to refer too later

            for(int i = 0; i < 100; ++i)
            {
                Console.WriteLine(Chunks[i] + " "); //Write the data to the console so we can compare
            }

            Console.WriteLine(" ");

            Chunks = (int[])LoadChunks("Chunks.world"); //Load the file back into the chunk

            for (int i = 0; i < 100; ++i)
            {
                Console.WriteLine(Chunks[i] + " "); //Log to see if it has worked
            }

            Console.ReadKey();                      //Pause so you can even read it!
        }

        public static void SaveChunks(object Chunks, string filePath)
        {
            BinaryFormatter bf = new BinaryFormatter();                             //Create a BinaryFormatter to change the chunks into a binary string
            FileStream fs = new FileStream(filePath, FileMode.Create);              //Create a filestream to create a new file to store the string

            try
            {
                bf.Serialize(fs, Chunks);                                           //Serialize the data into a file
            }
            catch (Exception e)                                                     //if an error occurs Post it!
            {
                Console.WriteLine("Failed to create Chunk file! " + e);
            }
            finally
            {
                fs.Close();                                                         //Then close the filestream to prevent memory leaks
            }
        }

        public static object LoadChunks(string filePath)
        {
            BinaryFormatter bf = new BinaryFormatter();                             //Create a BinaryFormatter to convert the binary string to an object
            FileStream fs = new FileStream(filePath, FileMode.Open);                //Create a filestream to create a new file to provide the string

            try
            {
                return bf.Deserialize(fs);                                          //Deserialize the data into an object
            }
            catch (Exception e)                                                     //Catch any errors if they occur
            {
                Console.WriteLine("Chunk load failed! " + e);
                return null;
            }
            finally
            {
                fs.Close();                                                         //Then close the filestream to prevent memory leaks
            }
        }
    }
}

关键加载和保存部分在这里

public static void SaveChunks(object Chunks, string filePath)
        {
            BinaryFormatter bf = new BinaryFormatter();                             //Create a BinaryFormatter to change the chunks into a binary string
            FileStream fs = new FileStream(filePath, FileMode.Create);              //Create a filestream to create a new file to store the string

            try
            {
                bf.Serialize(fs, Chunks);                                           //Serialize the data into a file
            }
            catch (Exception e)                                                     //if an error occurs Post it!
            {
                Console.WriteLine("Failed to create Chunk file! " + e);
            }
            finally
            {
                fs.Close();                                                         //Then close the filestream to prevent memory leaks
            }
        }

        public static object LoadChunks(string filePath)
        {
            BinaryFormatter bf = new BinaryFormatter();                             //Create a BinaryFormatter to convert the binary string to an object
            FileStream fs = new FileStream(filePath, FileMode.Open);                //Create a filestream to create a new file to provide the string

            try
            {
                return bf.Deserialize(fs);                                          //Deserialize the data into an object
            }
            catch (Exception e)                                                     //Catch any errors if they occur
            {
                Console.WriteLine("Chunk load failed! " + e);
                return null;
            }
            finally
            {
                fs.Close();                                                         //Then close the filestream to prevent memory leaks
            }
        }

希望这有帮助!