存储游戏数据的最佳方式是什么?(图片、地图等)

6
我正在开发一个基本的2D游戏(其实是一个游戏引擎),目前正在为我的数据开发文件格式。当然,为了让这个游戏能运行,我将需要缓存。我认为把所有游戏数据都放在一个文件中并不专业(当然不是必须的,只要文件以某种缓存格式存在即可)。
这就是为什么我来这里询问的原因。我考虑使用zip文件,但感觉这并不是最好的方法。我也考虑过创建另一个二进制写入器,并为每个文件添加头部(文件类型,“位置”)和封闭标记,这样很容易解释。但我觉得那样太低效了。
所以,请问你有什么想法吗?
请注意:这个游戏引擎只是为了学习目的而开发的。
简而言之,我需要一种高效的方法来存储像图片这样的数据以用于我正在制作的游戏。

你想要同时写入缓存,还是只是询问如何打包所有静态内容? - Dilum Ranatunga
许多游戏将图像和声音存储为基本图像和声音文件。如果你真的想这样做,那么在游戏完成后再添加,否则它会减慢开发速度,因为你必须编译代码和资产。 - thedaian
@Dilum Ranatunga - 我希望能够写入缓存,或者至少能够添加新内容。 - Fellixombc
3个回答

8

您可以将任何对象存储为.dat文件

public class MyGame implements Serializable 
{ 
    private static void saveGame(ObjectType YourObject, String filePath) throws IOException 
    { 
        ObjectOutputStream outputStream = null; 
        try 
        { 
            outputStream = new ObjectOutputStream(new FileOutputStream(filePath)); 
            outputStream.writeObject(YourObject); 
        } 
        catch(FileNotFoundException ex) 
        { 
            ex.printStackTrace(); 
        } 
        catch(IOException ex) 
        { 
            ex.printStackTrace(); 
        } 
        finally 
        { 
            try 
            { 
                if(outputStream != null) 
                { 
                    outputStream.flush(); 
                    outputStream.close(); 
                } 
            } 
            catch(IOException ex) 
            { 
                ex.printStackTrace(); 
            } 
        } 
    } 

    public static ObjectType loadGame(String filePath) throws IOException 
    { 
        try 
        { 
            FileInputStream fileIn = new FileInputStream(filePath); 
            ObjectInputStream in = new ObjectInputStream(fileIn); 
            return (ObjectType) in.readObject(); 
        } 
        catch(FileNotFoundException ex) 
        { 
            ex.printStackTrace(); 
        } 
        catch(IOException ex) 
        { 
            ex.printStackTrace(); 
        } 
    } 
}

啊,是的,我用这个来写和读我的地图文件。这是我考虑的其中一个想法,但是我该如何存储和管理图像文件呢? - Fellixombc
@Fellixombc 将图像按原样存储(Jpg、gif、bmp等)。 - Eng.Fouad
哦,我不知道你可以这样做。谢谢。 - Fellixombc

2

我认为zip并不是错误的方式,它是一种相当好的方式。只需将所有内容放入jar文件中即可。您甚至可以使用类加载器来加载它。


+1:Jar比Zip更好,使用getResourceAsInputStream()从类加载器获取任何资源意味着您可以在开发过程中将文件放在目录中,稍后放在jar中而无需更改代码。 - Peter Lawrey
你不能向被类加载器锁定的JAR文件写入内容。因此,这种解决方案作为可写缓存将失败。 - Dilum Ranatunga
这听起来相当有趣,而且会是一个很好的学习经验,谢谢! - Fellixombc

1
出于实际考虑,我建议使用多个文件,但将它们全部放在temp的子目录中。
但如果你的学习练习与此主题有关,这是我的建议:
首先,避免使用任何类似ZIP的格式,在删除、更新、添加、跳转方面都会受到严重惩罚。即使是JAR的索引文件,它们也只适用于压缩。
因此,你可以了解一下文件系统。本质上,你正在编写一个文件系统,其中“磁盘”只是一个二进制文件。这应该给你一个高层次的分配表等的概念。为了实现这样的设计,你需要对底层文件进行读/写访问;查看java.io.RandomAccessFile
最后,如果你愿意使用Java7,你可以尝试使用新的filesystem SPIs

非常感谢!我将继续查看RandomAccessFile并看看我能做什么。是的,我正在尝试学习新的做事方式,并更深入地探索Java! - Fellixombc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接