所以我可以使用文本文件使用图块加载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;
}
答案 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);
}
根据你所说的,这也不起作用,但是如果你使用相同的组件绘制你的地图和对象,那么一个总是会覆盖另一个,并且总会丢失一些东西。要解决此问题,您需要折叠两个单独的窗格,一个用于地图,一个透明的窗格位于地图顶部,可用于渲染对象。
以图为例:
您基本上需要添加一个新的透明“内容平面”,类似于上面显示的玻璃窗格。