C# 将对象链接到列表以便以后手动编辑(游戏引擎/框架-实体管理部分)

C# 将对象链接到列表以便以后手动编辑(游戏引擎/框架-实体管理部分),c#,entities,game-engine,C#,Entities,Game Engine,首先你好,这是我第一次来这里。我是一名年轻的程序员(15岁),这是我第二次尝试制作一款游戏(实际上是整个可重用的游戏引擎和框架,不知道如何调用它,也许是GDK?),同时让它更有组织性 重要提示:我使用的是XNA框架,所以游戏引擎不是纯低级的DirectX管理!我正在尝试用预定义的类来扩展XNA,这些类将很容易插入到任何游戏中并在以后进行管理 我一直在寻找一种方法,将一个实体放入WorldManager的列表中,稍后检索该实体进行直接更改,然后将其放回列表中(因此它与Update方法一起使用) 我

首先你好,这是我第一次来这里。我是一名年轻的程序员(15岁),这是我第二次尝试制作一款游戏(实际上是整个可重用的游戏引擎和框架,不知道如何调用它,也许是GDK?),同时让它更有组织性

重要提示:我使用的是XNA框架,所以游戏引擎不是纯低级的DirectX管理!我正在尝试用预定义的类来扩展XNA,这些类将很容易插入到任何游戏中并在以后进行管理

我一直在寻找一种方法,将一个实体放入WorldManager的列表中,稍后检索该实体进行直接更改,然后将其放回列表中(因此它与Update方法一起使用)

我的想法(和问题)是:

  • 最好的解决方案是以某种方式使实体与列表相链接,这样当我更新单独的实体对象时,它也会在列表中更新。不幸的是,我不知道怎么做,这可能是最好的答案

  • 我还想先编辑我创建的实体,然后使用find在列表中查找并更新它。问题是我不确定find方法是如何搜索的。若任何改变都能使方法认为它是一个全新的不同对象呢?(find实际上是如何找到的?)

  • 我所做的是在实体添加到列表中时将它们添加到实体中,这样我可以在编辑后将它们放回原位。问题是我也有remove方法,我不确定它是否会更改索引,因为如果会,那么每次删除实体时我都必须重新更新ID。我觉得这样做效率很低。列表也是如此。删除并更改索引?(我想会的)

  • 这实际上是一个3个问题,我希望能回答其中的任何一个问题,当然最重要的问题的答案会更受欢迎

    一段代码,以了解这一切是如何工作的:

    public class WorldManager
    {
        List<Entity> Entities = new List<Entity>();
        List<Entity> ToAdd_Entities = new List<Entity>();
        List<Entity> ToRemove_Entities = new List<Entity>();
    ...
        public void Update()
        {
            for(int count = 0; count < ToAdd_Entities.Count; count++)
            {
                Entities.Add(ToAdd_Entities[count]);
                int index = Entities.IndexOf(ToAdd_Entities[count]);
                Entities[index].ID = index;
    
                ToAdd_Entities.Remove(ToAdd_Entities[count]);
            }
    
            for (int count = 0; count < ToRemove_Entities.Count; count++)
            {
                Entities.Remove(ToRemove_Entities[count]);
                ToAdd_Entities.Remove(ToAdd_Entities[count]);
    
                //index update is required here too, I just didn't implement it yet.
            }
        ...
       }
    }
    
    公共类WorldManager
    {
    列表实体=新列表();
    列表添加实体=新列表();
    List ToRemove_Entities=新建列表();
    ...
    公共无效更新()
    {
    对于(int count=0;count
    我将如何访问它:

    List<Entity> bots = WorldManager.GetEntitiesByName("bot");
    bots[1].Location = new Vector2(x,y);
    WorldManager.UpdateEntities(bots);
    
    List bots=WorldManager.GetEntitiesByName(“bot”);
    机器人[1]。位置=新矢量2(x,y);
    WorldManager.UpdateEntities(机器人程序);
    
    我不使用那段代码,那只是我想法的一个简单例子

    请原谅我的英语令人困惑(如果你觉得困惑的话),我是塞尔维亚人


    提前感谢。

    我建议不要使用“每个对象都在一个大列表中”的方法。而是关注引擎中的输入、图形和其他基本内容,然后将其余内容留给特定于游戏的类

    假设你有一个2D世界,里面有很多树,它们大部分都是静态的。现在您的实体列表中有5千个实体,它们什么都不做,而不是放在那里,您应该将它们放在Map类中的某个列表中,这样它们更容易访问(您不必遍历整个列表来找到它们),并且设计也变得更干净。通过这种方式,您不必编写整个类的通用处理程序代码,而这些代码最终仍然不适合您可能扔进您的世界中的每个对象

    因此,我这边的3条建议是: -仅将非游戏特定代码放入引擎(图形、声音、输入) -从引擎中只调用游戏中的两个方法,例如updateGame()和renderGame(),然后再调用其余的方法 -最后但并非最不重要的一点是:将游戏的组件与其他组件分开,只让它们在真正需要的地方进行交互

    同样重要的是,构建一些游戏,然后查看它们真正共享的代码,并从这些代码中形成引擎


    如果你想要一个例子来说明如何做到这一点(尽管我不能保证它是完美的),你可以看看我的小引擎。它是Java,不是很好,但它应该给你一个如何构造引擎的基本概念。如果你想看我用这个引擎制作的游戏,请看下载部分。

    好吧,我已经找到了关于我最顶级解决方案的答案!是从我的另一个问题上得到的,我想我也应该把答案放在这里

    答案是,只要我将其添加到列表中,它就已经链接,因为实体是一个类,它的对象是“引用类型”,所以当我将它们指定给其他对象或列表时,它们就链接到它。我对该对象所做的任何更改都会在另一侧自动更新


    (如果我错了,请有人纠正我。我将在测试我的框架/引擎后立即检查此问题,并让您知道这是“解决方案”)

    在您编写七个游戏之前,您还没有足够的知识来编写可重用的游戏引擎。首先专注于编写一个游戏:)你是对的,但我并不是一个人在工作(事实上我很难),但我要为另一个游戏重新编写所有代码,这对我来说太难了!我还写了那七个游戏,不幸的是没有一个游戏完成,因为设计有缺陷。关键是要做一个真正的框架!很抱歉我写错了。这是一种很好的想法,但我错了,我想告诉大家我正在制作整个框架。事实上,我的问题需要直截了当的答案。为什么?因为我的游戏实际上是简单的自上而下的2D游戏,所以不会有任何