我的游戏对象以什么顺序出现在列表中?
本文关键字:列表 游戏 对象 以什么 顺序 我的 | 更新日期: 2023-09-27 18:09:58
我有一个包含游戏对象的列表,我有一些代码将它们绘制到屏幕
for (int i = Gameobject.gameobjects.Count -1; i >= 0 ; i--)
{
if (Gameobject.gameobjects[i] is GameItem ||
Gameobject.gameobjects[i] is MenuItem ||
Gameobject.gameobjects[i] is Rock ||
Gameobject.gameobjects[i] is ChaseSprite||
Gameobject.gameobjects[i] is MenuBar||
Gameobject.gameobjects[i] is MenuBarItem)
{
Gameobject.gameobjects[i].Draw(spriteBatch);
#if Debug
drawBorder(Gameobject.gameobjects[i].BoundingBox, 2, Color.Red);
spriteBatch.DrawString(spritefont,Rock.rockpieces.Count.ToString() , new Vector2(200, 200), Color.Pink);
#endif
}
}
问题在于,它似乎没有以任何特定的顺序绘制对象,在我的情况下,菜单项是在菜单栏下绘制的,所以当游戏运行时,菜单项不会显示。现在我知道菜单项正在被绘制,因为我将菜单栏设置为50%透明,当你将鼠标放在它上面时,你可以清楚地看到菜单项。这对我来说是一个巨大的问题,因为我构建游戏的方式。
对于这种情况,使用的集合类型可能会影响对象的顺序。如果gameobjects
是List
,它们应该按照您使用gameobjects.Add
的顺序排列。
您在if..is..||
测试列表中指定的项目顺序仅指定了它们被测试的顺序—它无法对它们进行排序,因为您只是说和如果,而不是强迫一个项目等待另一个项目。
解决这个问题的一种方法是应用LINQ,通过多个循环或通过OrderBy调用。
如果在调用过程中编辑集合,请确保通过ToArray或ToList将查询结果复制到Array或List中foreach(var gameObj in Gameobject.gameobjects
.OrderBy(SortGameObject)
.ToArray()) // This will force iteration and cache the result, so changes to the orignal collection don't throw an exception
{
gameObj.Draw(spriteBatch);
#if Debug
drawBorder(gameObj.BoundingBox, 2, Color.Red);
spriteBatch.DrawString(spritefont,Rock.rockpieces.Count.ToString() , new Vector2(200, 200), Color.Pink);
#endif
}
private static int SortGameObject(Gameobject target)
{
if (target is GameItem) return 0;
else if (target is MenuItem) return 1;
else if(target is Rock) return 2;
else if(target is ChaseSprit) return 3;
else if(target is MenuBar) return 4;
else if(target is MenuBarItem) return 5;
else return int.MaxValue; // This forces any draws on unrecognized objects to go on top
// - to put unrecognized objects on the bottom, use -1 instead
}
这可能更容易解决,因为所有这些都继承自父类型,然后有一个DrawOrder参数,这可以减少查询
foreach(var gameObj in Gameobject.gameobjects.OrderBy(g => g.DrawOrder))
... // Draw calls as above