我正在用Java开发一个简单的游戏(想想Rogue 1980),并且在draw()方法中有一个图块渲染系统。我正在从图块的 2d 数组过渡到 3d 数组,这样即使玩家图块走过,我也可以让图块持续存在
绘制方法如下:
`公共无效绘制(图形g){ Font font = new Font("TimesRoman", Font.BOLD,tileSize); g.setFont(字体);
// Grid Lines
g.setColor(Color.gray);
for (int i = 0; i < boardWidth / tileSize; i++) {
g.drawLine(i * tileSize, 0, i * tileSize, boardHeight);
g.drawLine(0, i * tileSize, boardWidth, i * tileSize);
}
//Debug output
//System.out.println("Player coordinates: X=" + player.getX() + ", Y=" + player.getY());
// Draw Entities Tiles
g.setColor(Color.white);
for (int i = 0; i < boardWidth / tileSize; i++) {
for (int j = 0; j < boardHeight / tileSize; j++) {
for (int k = 0; k < 1; k++) {
Tile t = tiles[i][j][k];
if (t != null) { //No null exception errors
switch (t.getType()) {
case NULL:
break;
case DECO:
g.setColor(Color.CYAN);
break;
case ENTITY:
g.setColor(Color.blue);
break;
case PLAYER:
g.setColor(Color.green);
break;
case WALL:
g.setColor(Color.lightGray);
break;
case ENEMY:
g.setColor(Color.red);
break;
case LOOTABLE:
g.setColor(Color.yellow);
break;
default:
g.setColor(Color.white);
break;
}
g.drawString(String.valueOf(t.getChar()), t.getX() * tileSize, t.getY() * tileSize);
}
}
}
}
}`
我已将默认图块(墙壁、地板装饰、硬币)添加到 z 级别 0,并将玩家添加到 z 级别 1。目标是仅渲染网格位置中最高的 z 级别图块
问题中的代码有这一行:
Tile t = tiles[i][j][k];
。我假设 k
是对应于 z 级别的变量。
我还假设 “最高 z 级别” 表示最高 z 级别的 资格 图块。否则,渲染的所有图块都将来自相同的 z 级别。
因此,您可以创建一个方法来获取最高的非空图块。
public Tile getTileZ (int x, int y) {
for (int z = zMax; z >= 0; z--) {
if ( tiles [x][y][z].qualifies() ) { return tiles [x][y][z]; }
}
return tiles [x][y][0];
}
在此版本中,
getTileZ
是实例方法,tiles
是实例变量。您可以创建方法 static
并传递 tiles
作为参数。
我不知道如何判定一块瓷砖是否合格。所以,我想象
Tile
类有一个实例方法 public boolean qualifies ()
。
因此,
Tile t = tiles[i][j][k];
行被替换为如下行:Tile t = getTileZ (i, j);
。