在基于等距图块的地图中渲染多个高度
Render multiple heights in an isometric tile based map
大家晚上好
我一直在搞乱等距平铺世界,我对渲染其上的元素有一些疑问。
当我建立一个单一的高度贴图时,我先渲染它,然后在上面添加不同的元素,最后的位移看起来是正确的。
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 是实体列表。
我遇到的问题是,当实体移动到新位置时,它们会被图块重叠,因为这些图块是在实体之后呈现的,并且实体的位置在到达新位置之前不会改变命运。我可以在渲染之前将位置更改为新位置,但这意味着在另一个轴上,前一个图块在实体之后渲染,由于重叠而消失了一秒钟。
当我尝试绘制选择矩形时,这也很混乱,因为它卡在正在渲染的图块后面。我不希望它们覆盖整个地图,所以在所有渲染完成后也无法绘制它们。
有人知道我可以尝试的另一种方法吗?
先谢谢你。
在第一遍中绘制整个地板图层。然后在第二遍中绘制所有墙壁和物体以及移动实体。
I could change the position to the new one before rendering,
暗黑破坏神的程序员 David Brevik 在他的 GDC 演讲中提到使用此选项暗黑破坏神:经典游戏事后分析。这是他的第一个 "What Went Wrong" 例子!
参考:https://www.youtube.com/watch?v=VscdPA6sUkc&t=20m17s
原来这是等距游戏中的经典关卡。
大家晚上好
我一直在搞乱等距平铺世界,我对渲染其上的元素有一些疑问。 当我建立一个单一的高度贴图时,我先渲染它,然后在上面添加不同的元素,最后的位移看起来是正确的。
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 是实体列表。
我遇到的问题是,当实体移动到新位置时,它们会被图块重叠,因为这些图块是在实体之后呈现的,并且实体的位置在到达新位置之前不会改变命运。我可以在渲染之前将位置更改为新位置,但这意味着在另一个轴上,前一个图块在实体之后渲染,由于重叠而消失了一秒钟。
当我尝试绘制选择矩形时,这也很混乱,因为它卡在正在渲染的图块后面。我不希望它们覆盖整个地图,所以在所有渲染完成后也无法绘制它们。
有人知道我可以尝试的另一种方法吗?
先谢谢你。
在第一遍中绘制整个地板图层。然后在第二遍中绘制所有墙壁和物体以及移动实体。
I could change the position to the new one before rendering,
暗黑破坏神的程序员 David Brevik 在他的 GDC 演讲中提到使用此选项暗黑破坏神:经典游戏事后分析。这是他的第一个 "What Went Wrong" 例子!
参考:https://www.youtube.com/watch?v=VscdPA6sUkc&t=20m17s
原来这是等距游戏中的经典关卡。