我的游戏对象以什么顺序出现在列表中?

本文关键字:列表 游戏 对象 以什么 顺序 我的 | 更新日期: 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%透明,当你将鼠标放在它上面时,你可以清楚地看到菜单项。这对我来说是一个巨大的问题,因为我构建游戏的方式。

我的游戏对象以什么顺序出现在列表中?

对于这种情况,使用的集合类型可能会影响对象的顺序。如果gameobjectsList,它们应该按照您使用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