Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数组。排序工作。。。有时_C#_Sorting - Fatal编程技术网

C# 数组。排序工作。。。有时

C# 数组。排序工作。。。有时,c#,sorting,C#,Sorting,我正在用香草C#开发一个游戏,但是,当我尝试对我试图渲染的对象进行排序时遇到了一个问题 图形引擎根据对象的Z和Y位置渲染对象。因此,在渲染对象之前,我尝试对它们进行排序 但是,当对象渲染时,它们显示如下: (这是4个等距图块,都在同一Y轴上,前面的两个有8 Z,后面的0 Z) 当它们应该这样显示时,因为它们都在同一个Y,但不同的Z: 同样值得一提的是,它们并不总是像图1所示,而是有时会像图1所示,在其他帧中,比如后面和前面,等等 以下是用于渲染的代码: private voi

我正在用香草C#开发一个游戏,但是,当我尝试对我试图渲染的对象进行排序时遇到了一个问题

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

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

(这是4个等距图块,都在同一Y轴上,前面的两个有8 Z,后面的0 Z)

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

同样值得一提的是,它们并不总是像图1所示,而是有时会像图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);
    }
}
公共类RenderObject:IComparable
{
公众形象;
公共int x;
公共智力;
公共INTZ;
公共渲染对象(图像img、int x、int y、int z)
{
this.img=img;
这个.x=x;
这个。y=y;
这个。z=z;
}
公共int比较(渲染对象其他)
{
//如果y相等,则进行Z排序。[从高到低]
如果(y==其他.y)
{
返回z.CompareTo(其他z);
}
//默认为y排序。[从高到低]
将其他.y.比较返回到(y);
}
}

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

问题是当
Y
S相同时,您的
比较忽略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);
}
您可以通过首先运行
y
比较来进一步简化此代码:

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

不必在int上调用CompareTo,只需使用<>==etcWhat you expected from
z.CompareTo(other.z)行?忘记返回哎呀!!马上修好@伊凡斯托夫仍然在做同样的事情……请使用一个简单的
for
,而不是
foreach
;)@AlexINF在调试器中的
foreach
处放置一个断点,并检查
todrawnow
的内容。它应该按照您的代码指定的正确顺序,即由
Y
订购,领带由
Z
断开。当我打断它时,顺序似乎很好。。。它甚至不会改变。@如果您先按
Y
排序,然后按
Z
排序,但在渲染时矩形将放置在
Y+Z
位置。你不应该改为在
Y+Z
上排序吗?不,因为Y的优先级比Z高。Y是高度,所以如果一个块有y8,它应该在其他块的上方渲染,当Z是前轴时,因此如果一个块有z8,它应该只在它后面的块的前面。除此之外,它会产生相同的输出,因为图片中的块都有y0,所以Y与此无关。
public int CompareTo(RenderObject other)
{
    int res = other.y.CompareTo(y);
    return res != 0 ? res : z.CompareTo(other.z);
}