2D 等距深度排序实体(仅)公式不起作用

问题描述 投票:0回答:1

(C#/MonoGame)

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 中包含的,而是我自己的一组类。

c# 2d game-development monogame isometric
1个回答
0
投票

问题是我只考虑了树干而不是整个宽度进行排序。 现在效果很好。我这样发布这篇文章,我认为我真的很有用,因为我无法在互联网上找到很多有关该主题的信息。

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)

© www.soinside.com 2019 - 2024. All rights reserved.