i => (int) (Math.Floor((((x + grid.view.camera.x - grid.view.viewport.x) - tile_width_half) / tile_width_half + (y + grid.view.camera.y - grid.view.viewport.y) / tile_height_half) / 2));
j => (int)(Math.Floor(((y + grid.view.camera.y - grid.view.viewport.y) / tile_height_half - (((x + grid.view.camera.x - grid.view.viewport.x) - tile_width_half) / tile_width_half)) / 2));
public static int i(Grid grid, int layer, float x, float y)
{ return i(grid, x, y + (layer * ((grid.info.tile.width * grid.view.viewport.scale) / 2))); }
//use the i above
public static int j(Grid grid, int layer, float x, float y)
{ return j(grid, x, y + (layer * ((grid.info.tile.height * grid.view.viewport.scale) / 4))); }
//same
这是我获取实体的 I 和 J 的公式(地板是第 0 层)。
public static float distance_entity(Grid grid, Entity entity, int L, int I, int J, int depth = 1000)
{
sorti = i(grid, L, I, J);
sortj = j(grid, L, I, J);
sortx = x(grid, sorti, sortj);
sorty = y(grid, sorti, sortj);
return (float) (sortx + sorty + 0.001 * depth);
}
这是我获取距离的方法。不幸的是它只适用于某些 实体(屏幕截图上的树),当我切换场景时, 顺序似乎略有不同并且工作较少。如果我换的话 有几次它会得到您在第一个屏幕截图中看到的当前顺序。那里 错误比显示的要多。
不知道场景bug是否与距离计算不正确有关。等着瞧。 (我只是将实体作为参数,以防我需要它) 问题是我的树只有一块瓷砖。其余的只是顶部的图像块传输。
有可能有这样正确的距离吗?
奇怪的是,通常排序错误的图块是我的图块数组中的基础图块。
这就是我绘制实体的方式:
X = entity.data.x;
Y = entity.data.y;
for (int j = 0; j < entity.data.height; j++)
{
for (int i = 0; i < entity.data.width; i++)
{
I2 = Isometry.i(this, X + view.viewport.x - view.camera.x + (i * (info.tile.width * view.viewport.scale)), Y + view.viewport.y - view.camera.y + (j * (info.tile.height * view.viewport.scale))) - 3;
J2 = Isometry.j(this, X + view.viewport.x - view.camera.x + (i * (info.tile.width * view.viewport.scale)), Y + view.viewport.y - view.camera.y + (j * (info.tile.height * view.viewport.scale))) - 2;
X2 = Isometry.x(this, I2, J2);
Y2 = Isometry.y(this, I2, J2);
if (view.viewport.is_visible(X2, Y2))
Assets.blit(entity.info.asset,X2 + view.viewport.x - view.camera.x, Y2 + view.viewport.y - view.camera.y, entity.data.start_tile_i + i, entity.data.start_tile_j + j, info.tile.width, info.tile.height, view.viewport.scale);
}
}
注意 X 和 Y,来
我尝试添加实体的真实高度,但没有产生任何奇迹..
在互联网上,关于使用常规图块而不是立方体进行等距深度排序的内容并不多。 我也从一个使用立方体的网站上得到了这个公式。
而且英语不是我的母语,有时我可能只是没有输入正确的世界来获得结果,而我的国家的开发场景有点死气沉沉。信息不多。
另外:视口和相机不是 MonoGame 中包含的,而是我自己的一组类。
问题是我只考虑了树干而不是整个宽度进行排序。 现在效果很好。我这样发布这篇文章,我认为我真的很有用,因为我无法在互联网上找到很多有关该主题的信息。
public static int distance(Entity entity)
{
sortx = x(entity.position.I, entity.position.J);
sorty = y(entity.position.I, entity.position.J);
return (int) (sortx + sorty * entity.width() + entity.position.depth);
}
(树木深度为 500)