0

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

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

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

我的想法(和问题)是:

  1. 最好的解决方案是以某种方式使实体与列表链接,因此当我更新它在列表中更新的唯一实体对象时。不幸的是,我不知道该怎么做,这可能是最好的答案。

  2. 我还想到的是先编辑我创建的实体,然后使用find在列表中查找并更新。问题是我不确定 find 方法是如何搜索的。如果任何更改都可以使方法认为它是一个全新的不同对象怎么办?(find 是如何找到的?)

  3. 我所做的是在将实体添加到列表的那一刻将 ID 添加到实体,这样我可以在编辑后将它们放回原处。问题是我也有 remove 方法,我不确定它是否会更改索引,因为如果会,那么我每次删除实体时都必须重新更新 ID。我觉得效率很低。那么 List<>.Remove 会改变索引吗?(我猜会的)

这些实际上是 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.
        }
    ...
   }
}

我将如何访问它:

List<Entity> bots = WorldManager.GetEntitiesByName("bot");
bots[1].Location = new Vector2(x,y);
WorldManager.UpdateEntities(bots);

我不使用那段代码,这只是我想法的一个简单示例。

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

提前致谢。

4

2 回答 2

1

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

想象一下,你有一个 2D 世界,里面有很多树,它们大多是静态的。现在你有 5k 他们坐在你的实体列表中什么都不做,而不是把它们放在那里,你应该把它们放在你 Map 类的某个地方的列表中,这样它们更容易访问(你不必须遍历整个列表才能找到它们)并且设计也变得更加简洁。这样您就不必编写整个类的通用处理程序代码,最终这些代码仍然不适合您可以放入 World 中的每个可能的对象。

所以我这边的 3 个提示是: - 仅在引擎中放入非游戏特定代码(图形、声音、输入) - 从引擎中仅调用游戏中的 2 个方法,例如 updateGame() 和 renderGame()剩下的事 - 最后但并非最不重要的一点是:将游戏的组件与其他组件分开,只让它们在真正需要的地方进行交互。

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

如果您想要一个如何完成此操作的示例(尽管我不保证它是完美的),您可以在这里查看我的小型引擎。它是 Java,没有很好的评论,但它应该让您对如何构建引擎有一个基本的了解。如果您想查看我使用引擎构建的游戏,请查看下载部分。

于 2010-01-16T15:33:00.747 回答
0

好吧,我已经得到了关于我最重要的解决方案的答案!从我的另一个问题中得到它,并认为我也应该在这里放置解决方案。

答案是只要我将它添加到列表中,它就已经链接了,因为 Entity 是一个类,它的对象是“引用类型”,所以当我将它们分配给其他对象时,或者在这种情况下为列表时,它们'链接到它。我对该对象所做的任何更改都会在另一侧自动更新!

(如果我错了,请有人纠正我。我会在我将我的框架/引擎进行测试后立即检查这一点,并让你知道这是“最”的解决方案。)

于 2010-01-16T22:10:38.593 回答