Array.Sort有效...有时候

时间:2017-09-02 10:12:14

标签: c# sorting

我正在用香草C#开发游戏,然而,当我尝试对我想要渲染的对象进行排序时遇到了问题。

图形引擎根据Z和Y位置渲染对象。所以在我渲染对象之前,我会尝试对它们进行排序。

但是,当对象渲染时,它们显示如下:

nope

(那些是4个等距块,全部在同一个Y,前面的两个有8个Z,后面有0个Z)

当他们应该这样展示时,因为他们都在同一个Y,但不同的Z:

yes

还值得一提的是,他们并不总是像图片1中那样展示,而是有时候就像那样,在其他框架中,在后面和其他框架中等等。

这是用于渲染的代码:

        private void render()
    {
        while (true)
        {
            RenderObject[] todrawnow = todraw.ToArray();
            Array.Sort(todrawnow);
            foreach (RenderObject img in todrawnow)
            {
                if (img!=null)
                    drawHandle.DrawImageUnscaledAndClipped(img.img, new Rectangle(img.x, img.y+img.z, 32, 48));
            }
        }
    }

RenderObject类:

    public class RenderObject : IComparable<RenderObject>
{
    public Image img;
    public int x;
    public int y;
    public int z;

    public RenderObject(Image img, int x, int y, int z)
    {
        this.img = img;
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public int CompareTo(RenderObject other)
    {
        // Z sort if y is equal. [High to low]
        if (y == other.y)
        {
            return z.CompareTo(other.z);
        }
        // Default to y sort. [High to low]
        return other.y.CompareTo(y);
    }
}

P.S:Y是高度,Z是前轴,它们不一样。

1 个答案:

答案 0 :(得分:2)

问题是当CompareTo s相同时,y会忽略Z比较的结果:

public int CompareTo(RenderObject other)
{
    // Z sort if y is equal. [High to low]
    if (y == other.y)
    {
        z.CompareTo(other.z); // <<== This line has no effect on sorting
    }
    // Default to y sort. [High to low]
    return other.y.CompareTo(y);
}

您应该在return前面添加z - 订单比较:

if (y == other.y)
{
    return z.CompareTo(other.z);
}

您可以先运行y比较来进一步简化此代码:

public int CompareTo(RenderObject other)
{
    int res = other.y.CompareTo(y);
    return res != 0 ? res : z.CompareTo(other.z);
}