我正在用香草C#开发游戏,然而,当我尝试对我想要渲染的对象进行排序时遇到了问题。
图形引擎根据Z和Y位置渲染对象。所以在我渲染对象之前,我会尝试对它们进行排序。
但是,当对象渲染时,它们显示如下:
(那些是4个等距块,全部在同一个Y,前面的两个有8个Z,后面有0个Z)
当他们应该这样展示时,因为他们都在同一个Y,但不同的Z:
还值得一提的是,他们并不总是像图片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是前轴,它们不一样。
答案 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);
}