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