【问题标题】:Loading Tile Maps From Text Files In Slick2D从 Slick2D 中的文本文件加载平铺地图
【发布时间】:2014-03-19 07:27:15
【问题描述】:

我正在使用 Slick2D 库在 Java 中制作一个相当简单的 2D 游戏引擎,并尝试从文本文件加载关卡(平铺地图)。我希望能够加载多个不同的图块集,因此不想将每个数字分配给这样的图块:

    1 1 1 1 1
    1 0 0 0 1
    1 0 0 0 1
    1 0 0 0 1
    1 1 1 1 1

    (Where 1 is a wall and 0 is a floor)

相反,我希望能够在 tilemap 中使用 x 和 y 坐标来表示该图块在图块集上的横向和下方的图块数量,如下所示:

    0,0 0,0 0,0
    0,0 1,0 0,0
    0,0 0,0 0,0

    (0,0 is the tile in the upper left hand corner of the tileset, 1,0 is the second tile in the tileset)

我遇到的主要问题是读取文本文件并将逗号前面的整数存储为 Pos1(X 值),并将逗号后面但在空格前面的所有内容存储为 Pos2(Y 值) .

我该怎么做呢?我会使用常规文件阅读器、缓冲阅读器还是扫描仪?

另外,顺便说一下,我知道 Slick2D 内置了读取平铺地图 (.tmx) 文件的功能,但由于我的游戏引擎将内置平铺地图编辑器,我想使用常规文本文件.

【问题讨论】:

    标签: java lwjgl tile slick2d game-development


    【解决方案1】:

    如果您需要您的文件采用该格式,以便您可以在文本编辑器中打开它们,那么我将使用 BufferedReader 读取文件,然后将每一行作为字符串读取并首先在每个空格处拆分该行然后在每个逗号处,然后解析字符串以返回您的号码。

    try(BufferedReader in = new BufferedReader(new FileReader("file"))){
        String line;
        while((line=in.readLine())!=null){
            String[] values = line.split(" ");
            for(String v:values){
                String[] coords = v.split(",");
                int x = Integer.parseInt(coords[0]);
                int y = Integer.parseInt(coords[1]);
    }
    

    但是,更简单的方法可能是直接从地图编辑器中编写 int 值,而不是将它们转换为字符串。如果你这样做,那么你会节省空间,你需要做的就是读取数据:

    try(DataInputStream in= new DataInputStream(new BufferedInputStream(new FileInputStream(new File("file"))))){
        int numValues=in.readInt();
        for(int i=0;i<numValues;i++){
            int x = in.readInt();
            int y = in.readInt();
        }
    }
    

    在您的地图编辑器中保存地图,您只需将瓦片的数量写入文件,然后将每个瓦片的 x 和 y 坐标与 writeInt() 和 DataOutputStream 一起写入。

    您可能还想将地图的宽度和高度写入文件,以便在它们不恒定或地图上图块的坐标不恒定时可以重建它。

    【讨论】:

    • 非常感谢,但是如果坐标超过一位怎么办,比如 16x16 的图块集?您给出的第一个示例将 12,14 读作 1,2 1,4
    • 第二个没有逗号,因此无法将两位数坐标写入文本文件。
    • 如果文本文件中有 12,14 13,15 作为一行,我的第一个示例最初将在空格处拆分字符串并将 12,14 和 13,15 作为单独的字符串存储在String[] 值,然后它将在逗号处拆分每个字符串并解析返回的前两个字符串,这将导致 12 和 14 在循环的第一次迭代中存储为 x 和 y。至于第二个示例,readInt()writeInt() 都将接受两位整数,或您给它们的任何其他整数。它们一次不仅处理一个数字,而且处理整个数字。
    • writeInt() 会将任何整数存储为 4 个字节,readInt() 将从文件中读取 4 个字节以创建一个整数。整数的位数无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2019-02-19
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多