代码之家  ›  专栏  ›  技术社区  ›  Relequestual

在Java中加载和保存基于瓦片的游戏。XML还是TXT?

  •  3
  • Relequestual  · 技术社区  · 16 年前

    一段时间以来,我一直在制作一款基于二维瓷砖的SIM游戏,而且进展顺利!多亏了这个网站和它的好心人(你!),我刚刚完成了游戏的寻路部分,太棒了!谢谢您!…不管怎样,对这个问题。

    目前,测试级别是硬编码的。很明显我需要重新工作。我的想法是让我的游戏类中的所有变量以各种方式保存到一个文本文件中。我还可以将每个级别的详细信息写入一个要为级别加载的文件中。我的问题是,我应该只使用文本文件还是使用XML?我理解XML基本上是什么,但是我真的不知道如何与Java结合使用它,或者为什么它比纯文本文件更好。 我有一点谷歌,还有关于XML和Java的整本书!我不知道我需要知道如何使用XML来完成这项工作,但我需要知道的比我多。

    提前感谢您的帮助。

    编辑: 我将在这里尝试一些想法,直到找到最有效的一个,然后选择它作为答案。

    编辑:选择XStream。简单易行!

    12 回复  |  直到 15 年前
        1
  •  1
  •   Brian Agnew    16 年前

    如果你在一个对象中有游戏状态(例如散列图,或者你自己设计的对象),那么你可以用普通的 XStream ,然后再次使用xstream将其读取回新对象。

    有一个 two minute tutorial 演示如何序列化/反序列化。它可以毫不费力地处理大多数对象——您不需要实现或指定任何特定的接口。也不需要JAXP、SAX、DOM等。

        2
  •  4
  •   Laurence Gonsalves    16 年前

    对于一个基于2d图块的游戏,XML可能是多余的。XML很好地存储分层数据和/或标记的文本,但听起来您只需要一种编码二维平铺设置网格的方法,这对于简单的旧文本文件来说要容易得多。

    只需让每一行都是一行瓷砖,然后决定每个瓷砖需要多少字符(可能一个或两个字符就可以了)。然后决定如何用文本文件中的字符来表示二维世界中的对象。

    SokoBean (这是我10年前写的一个游戏,所以我用的不是我所说的最好的作品,而是任何东西) text files like this one . 除了比XML更容易解析之外,还可以使用普通的旧文本编辑器作为级别编辑器。

        3
  •  2
  •   Steve B.    16 年前

    您使用文件是为了内部目的。简短的回答是,只要文件格式符合您的目的,就可以了。您确实希望尽可能地确保格式清晰、尽可能简单和可扩展。这里最重要的一点是提取数据读写到代码中负责读写文件格式的一个点。

    常见的格式很常见,因为它们简单且受良好支持—您不需要编写特殊的代码来解析文件(属性文件,基本上只是一个键值对列表和XML文件—将XML文件视为编写任意深度嵌套字典的一种方式)。

        4
  •  2
  •   Brimstedt    16 年前

    当然,这取决于您的需要,但是XML格式给您带来了很多好处,我可能会自己在这样的项目中选择XML。

    • 它可以自动 由制造工具检查/验证 当然是正确的 你制定的规则。
    • 现有的用于Java的LIBS 分析、读取和更新XML文档。
    • 这种格式很容易为将来的程序版本扩展,但仍易于保持向后兼容性。
    • 如果您的文件是XML格式,而不是经过特殊调整的文本格式,那么其他人很容易阅读和理解您的文件。
        5
  •  2
  •   patros    16 年前

    如果这纯粹是一个基于图块的游戏,那么一个纯文本文件可能就是解决问题的方法。

    您可能需要固定宽度的整数,每行后用换行符分隔空格。易于阅读,并且易于解析,无需XML库。

    编辑:

    一个重要的建议:

    无论你决定做什么,都要把它封装起来!创建一个读卡器接口,它接受通用输入流并返回(或填充)网格结构是什么。拥有一个采用网格结构和通用输出流并将数据转储到该输出流的编写器接口。如果您改变了主意,想如何实现文件,或者想添加网络播放等,您将在以后感谢自己。

        6
  •  2
  •   Eli    16 年前

    就您自己的东西而言,尤其是游戏而言,XML被高估了。如果您在一家大公司工作,其他人需要查看您的文件的文本,XML 可以 有道理,但即使在这种情况下,你可能会写一个级别编辑器,可以为你做一切。

    我建议您使用一个简单的文本文件,或者使用 java.io.ObjectOutputStream 和J ava.io.ObjectInputStream 直接将数据写入数据文件(如果您有很多信息或对象)或 java.util.Properties 写数据(如果只需要写原语)。

    上面提到的很多人都提到XML是好的,因为它有“自动序列化”,但我真的不认为在Java中工作时值得一提,因为上面列出的两种方法都是自动的,但在更高级的层次上。

    另外,不要忘记使用XML标记表示二维图块映射是非常无意义的,而在字符文件中一行一行地编写它们是相当容易读写的。

    前)

    WWWWWWWWWW  
    WSWWWWW EW  
    W W K WW W  
    W W   WW W  
    W WW WWWDW  
    W  X     W  
    WWWWWWWWWW  
    

    你可以做类似上面的事情,在哪里 W 是一堵墙, S 是开始, E 是出口, K 是关键, D 是门, X 是一个怪物。即使是文本文件,所有内容的确切位置以及如何设置级别也非常明显。

    我在许多专业游戏项目中使用了文本文件。事实上,我只在为某人完成承包工作时才使用XML,因为XML看起来“更专业”,即使在大多数情况下使用它是不必要的,而且只是浪费空间,这会使事情变得过于复杂。

    另一个例子:

    SpawnFrequency 0.1 20.5
    HealthPoints 5
    Stats 12 500 30 10 11  
    

    你可以想象会发生什么。然后,当您将文件读入Java时,简单地使用 BufferedReader.readLine() 获取每个参数,然后 String.split() 获取该参数的所有值的数组。然后,比较拆分数组中第一个值的大型switch语句或if/else分组将确定实际读取的参数。当您到达这一点时,您已经接近了XML的有用性,但对于这种使用,它仍然可能过于膨胀。然而,XML可以帮助解释这些神秘的值可能是什么:

    以上XML格式:

    或者像这样:

    `<GuyStuff>`  
        `<SpawnFrequencyMinimum>0.1</SpawnFrequencyMinimum>`  
        `<SpawnFrequencyMaximum>20.5</SpawnFrequencyMaximum>`  
        `<Health>5</Health>`  
        `<Strength>12</Strength>`  
        `<Agility>500</Agility>`  
        `<Stamina>30</Stamina>`  
        `<TechnoWizardry>10</TechnoWizardry>`  
        `<JavaSkillz>11</JavaSkillz>`  
    `</GuyStuff>`  
    

    但是当你开始变得如此复杂的时候,你也可以开始使用 java.io.Serializable 因为这很容易。

    编辑 下面是一个可序列化的示例。

    public class MySaveData implements java.io.Serializable //Serializable doesn't need any methods implemented, it simply says, "hey Java, my object can be written to a file."
    {
        float data1;
        int data2;
        Object data3;
        //BufferedImage data4; //Note that in order for an object to serialize, it can't contain any data members that are not Serializable, so this would be illegal.
    }
    
    import java.io.*;
    public class DataReader
    {
        public void saveData(File loc, MySaveData obj1, MySaveData obj2, MySaveData obj3)
        {
            try
            {
                //You can use any type of OutputStream to create an OOS, so you can for
                //example use one when you're connected with Sockets or something similar.
                ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(loc));
    
                //Writing objects is tremendously easy, and so are primitives.
                //Note that the order you write them in is the same order you will read them.
                os.writeObject(obj1);
                os.writeObject(obj2);
                os.writeObject(obj3);
                os.writeDouble(someValueINeededToWrite);
                os.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
        public void loadData(File loc, PlaceToPutData place)
        {
            try
            {
                //ObjectInputStream follows the same rules as OOS mentioned above.
                ObjectInputStream is = new ObjectInputStream(new FileInputStream(loc));
    
                //Remember to read your data back the same order you wrote it.
                place.obj1 = is.readObject();
                place.obj2 = is.readObject();
                //If you don't want one of the objects for some reason and want
                //to get something after it, you can just read the next one but not use it.
                readObject();
                place.value = is.readDouble();
                is.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    

    通常,您的文件如下所示: new java.io.File("/Documents/MyGame/MyDataFile.whateverIFeelLikeAsLongAsItsConsistent") .

        7
  •  0
  •   Mercer Traieste    16 年前

    这取决于需要保存多少数据,以及需要如何检索数据。

    XML可以很容易地用多个库翻译成Java POJO,因此这是一个优势。此外,你会发现它很容易学习和使用,只是尝试一些教程。

    但是,如果需要保存大量数据,可以考虑使用嵌入式数据库或单独的SQL服务器,具体取决于您的应用程序。

        8
  •  0
  •   eeeeaaii    16 年前

    如果您是唯一要修改文件的人,请使用您想要的任何格式。但是,如果您希望用户、测试人员或其他人修改它,请使用XML。XML的一大优点是它是一种标准格式,许多人(甚至很多非程序员)都知道如何编写代码。

        9
  •  0
  •   Robert Rossney    16 年前

    我只考虑在我需要XML生态系统的某个部分时使用XML:验证、转换、自动序列化/反序列化等。但是我知道所有这些东西是什么,并且我知道如何使用它们来达到相当好的效果。

    如果你不知道——从这个问题的要旨来看,我猜你也不知道——那么真正的问题是,“我应该学习所有这些东西,以便将信息保存在XML文档中吗?”答案是“你几乎肯定不应该”。

        10
  •  0
  •   Jon Onstott    16 年前

    您可以考虑使用类似javadb的嵌入式数据库,该数据库位于: http://developers.sun.com/javadb/

    嵌入它只需要2.5MB,您可能会发现以结构化、可靠的方式保存各种数据的能力非常有用。

    有类似hibernate的ORM框架,您可以使用它来处理数据,但对于您的应用程序来说,这可能是多余的。您可以使用直接向前的JDBC。

    祝你好运,玩得开心。

        11
  •  0
  •   RCIX    16 年前

    作弊是个问题吗?如果是这样,那么无论输出是什么,我都会加密。如果不是这样,那么只输出纯文本。

    就格式而言,我将使用XML。你可以做一些像

    <Map>
        <Tile x="1" y="1" value="2"></Tile>
        <Tile x="1" y="2" value="1"></Tile>
        <Tile x="1" y="3" value="7"></Tile>
        ...
    </Map>
    

    这将提供一个很好的可读格式,可以存储相当多的数据。

        12
  •  0
  •   Martijn Courteaux    15 年前

    我使用一个类(实现java. Io.SerialCalaby)来存储游戏统计信息。 然后我使用ObjectOutputsteam将该类写入一个文件。 要加载该类,可以使用Objectinputstream。

    马蒂恩