【问题标题】:Render multiple heights in an isometric tile based map在基于等距平铺的地图中渲染多个高度
【发布时间】:2017-06-03 11:33:41
【问题描述】:

大家晚上好。

我对等轴测图块世界有点混乱,我对在上面渲染元素有一些疑问。 当我构建一个单一的高度图时,我先渲染它,然后在顶部添加不同的元素,最后一个的位移看起来是正确的。

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 是实体列表。

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

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

有人知道我可以尝试的另一种方法吗?

先谢谢你。

【问题讨论】:

    标签: java render isometric


    【解决方案1】:

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

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

    《暗黑破坏神》的程序员 David Brevik 在他的 GDC 演讲《暗黑破坏神:经典游戏死后》中提到了使用此选项。这是他的第一个“出了什么问题”的例子!

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

    事实证明,这是等距游戏中的经典障碍。

    【讨论】:

    • 感谢您的建议,感谢您提供视频链接,我发现它很有趣,并为我提供了一种关于渲染地砖顺序的新方法。感谢您抽出宝贵时间回复我^-^
    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 2017-12-31
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多