在基于等距图块的地图中渲染多个高度

时间:2017-06-03 11:33:42

标签: java render isometric

大家晚上好。

我一直在用等距瓷砖世界搞砸了一些东西,我对在它上面渲染元素有些怀疑。 当我构建一个单一的高度图时,我首先渲染它,然后在顶部添加不同的元素,并且最后一个的位移似乎正确。

public void render(Graphics2D g2d) {
    for(int i = 0; i < tileGrid.length; i++) {
        Point isop = NeoMath.getInstance().cartToIso(i % yAmmount, i / yAmmount, GlobalDataStorage.tileWidth, GlobalDataStorage.tileHeight);
        TileManager.getInstance().getTileByID(tileGrid[i]).render(g2d, isop.x, isop.y);
    }

    for(Entity entity : entityList) {
        entity.render(g2d);
    }
}

(实体的位置是在更新内部计算的。)

有了这个我没有问题,因为一切都在同一高度上呈现,当我尝试添加其他楼层时问题就出现了。 让我们说我希望它有三个高度。我有一个列表列表而不是单个数组,并呈现它们上的每个元素:

    public void render(Graphics2D g2d) {
        int flag = 0;
        for(int i = 0; i < tileGrid.size(); i++) {
            Point isop = NeoMath.getInstance().cartToIso(i % yAmmount, i / yAmmount, GlobalDataStorage.tileWidth, GlobalDataStorage.tileHeight);
            for(int k = 0; k < tileGrid.get(i).size(); k++) {
    TileManager.getInstance().getTileByID(tileGrid.get(i).get(k)).render(g2d, isop.x, isop.y - (GlobalDataStorage.tileZ * k));
            }
        while(flag < currentList.size() && 
          currentList.get(flag).getPosition().equals(new Point(i % yAmmount, i / 
          yAmmount))) {
            currentList.get(flag).render(g2d);
            flag++;
            }
        }
    }

其中currentList是实体列表。

有了这个,我遇到的问题是,当实体移动到一个新位置时,它们会被瓦片重叠,因为它们在实体之后呈现,并且实体的位置在达到命运之前不会改变。我可以在渲染之前将位置更改为新位置,但这意味着在另一个轴中,前一个平铺在实体之后渲染,由于重叠而使其消失一秒。

当我尝试绘制选择矩形时,这也会变得混乱,因为它被卡在渲染的瓷砖后面。我不希望它们与整个地图重叠,因此在完成所有渲染之后也无法绘制它们。

有人知道我可以尝试的其他方法吗?

事先谢谢你。

1 个答案:

答案 0 :(得分:0)

在第一遍中绘制整个地板层。然后在第二遍中绘制所有墙壁和物体以及移动实体。

  

我可以在渲染之前将位置更改为新位置,

暗黑破坏神的程序员David Brevik在他的GDC演讲中提到使用此选项暗黑破坏神:经典游戏Postmortem。这是他的第一个&#34; What Went Wrong&#34;例如!

参考:https://www.youtube.com/watch?v=VscdPA6sUkc&t=20m17s

原来这是等距游戏中的一个经典障碍。