使用文本文件(2D Java Engine)标准库

时间:2017-05-08 00:44:56

标签: java 2d game-engine

所以我可以使用文本文件使用图块加载2D地图,这很棒。但是,我遇到这个方法的一个问题是我无法将对象/角色添加到我的地图中,因为该文件是2D网格。 (游戏类似于像塞尔达和口袋妖怪这样的游戏。)我尝试过创建一个物体图层,这样我就可以重叠图像,但它似乎对我不起作用。举一个我想要的例子,让树木之类的物体变得坚固,并在背景草的顶部。    如果你想向我提出一些想法,我也在寻找更好的方法来创建这些基于图块的地图。

**注意:我是关于Java的初学者/中级人员。

这是我调用Map的GameState类的构造函数。

public GameState(Game game) {
    super(game);
    player = new Player(game, 0, 0, 64, 64);
    map = new Map(game, "res/saves/save1.txt");
}

这是Map类(可以工作),它也调用了对象(第2层)。

private int width, height;
public static int spawnX, spawnY;
private int[][] mapTiles;
MapObjects mapObjects;
Game game;

public Map(Game game, String path) {
    this.game = game;
    mapObjects = new MapObjects(game, "res/saves/save1_obj.txt", width, height);
    loadMap(path);
}

private void loadMap(String path) {
    String file = Utils.loadFileAsString(path);
    //Token is which number it is out of the total
    String[] tokens = file.split("\\s+");
    //Sets what is what
    width = Utils.parseInt(tokens[0]);
    height = Utils.parseInt(tokens[1]);
    spawnX = Utils.parseInt(tokens[2]);
    spawnY = Utils.parseInt(tokens[3]);

    mapTiles = new int[width][height];
    for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {
            // (x+y*width) : calculates the nth token (+4) : The 4 prior tokens before the graph
            mapTiles[x][y] = Utils.parseInt(tokens[(x + y *width) + 4]);
        }
    }

}

public void render(Graphics g) {
    for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {
            //Only renders what is seen.
            getMapTile(x, y).render(g, (int)(x*Tile.TILE_WIDTH-game.getCamera().getxOffset()), (int)(y*Tile.TILE_HEIGHT-game.getCamera().getyOffset()));
        }
    }
}

public void tick() {

}

//Gets the specific tile at specific coordinates.
private Tile getMapTile(int x, int y) {
    Tile t = Tile.tiles[mapTiles[x][y]];
    if(t == null) {
        return Tile.grassTile;
    }
    return t;
}

最后,对象层不起作用。它不会产生错误,只是重叠的对象不可见。我已确保在地图图层之前加载对象图层,但这似乎不是问题。

private int width, height;
private int[][] objTiles;
Game game;

public MapObjects(Game game, String path, int width, int height) {
    this.game = game;
    loadObjects(path, width, height);
}

public void loadObjects(String path, int width, int height) {
    this.width = width;
    this.height = height;

    String file = Utils.loadFileAsString(path);
    String[] tokens = file.split("\\s+");

    objTiles = new int[width][height];
    for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {
            objTiles[x][y] = Utils.parseInt(tokens[(x + y *width)]);
        }
    }
}

public void render(Graphics g) {
    for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {
            //Only renders what is seen.
            getObjTile(x, y).render(g, (int)(x*Tile.TILE_WIDTH-game.getCamera().getxOffset()), (int)(y*Tile.TILE_HEIGHT-game.getCamera().getyOffset()));
        }
    }
}

public void tick() {

}

//Gets the specific object tile at specific coordinates.
private Tile getObjTile(int x, int y) {
    Tile t = Tile.tiles[objTiles[x][y]];
    if(t == null) {
        return Tile.nothingTile;
    }
    return t;
}

1 个答案:

答案 0 :(得分:0)

我们可能需要您提供更多信息。

您是否使用不同的“容器/组件”来绘制地图图块而不是对象?因为如果先渲染对象,那么渲染地图后它们就会消失。你应该首先绘制地图,然后像这样做对象:

public Map(Game game, String path) {
    this.game = game;
    //swapped the order of the lines below so the map loads first:
    loadMap(path);
    mapObjects = new MapObjects(game, "res/saves/save1_obj.txt", width, height);
}

根据你所说的,这也不起作用,但是如果你使用相同的组件绘制你的地图和对象,那么一个总是会覆盖另一个,并且总会丢失一些东西。要解决此问题,您需要折叠两个单独的窗格,一个用于地图,一个透明的窗格位于地图顶部,可用于渲染对象。

以图为例:

Root Panes Example

您基本上需要添加一个新的透明“内容平面”,类似于上面显示的玻璃窗格。