2010-01-16 33 views
0

首先你好,这是我第一次来这里。我是年轻的编码器(15),这是我第二次尝试制作一款游戏(实际上是整个可重用游戏引擎和框架,不知道如何称呼它,也许是GDK?),而这次使它更有组织性。将对象链接到列表以供以后手动编辑(游戏引擎/框架 - 实体管理部分)

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

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

我的想法(和问题)是:

  1. 最佳可能的解决方案以某种方式使与列表链接的实体,所以我更新列表更新过孤独的实体对象。不幸的是我不知道该怎么做,这可能是最好的答案。

  2. 我还想过的是编辑我创建的实体,然后使用find在列表中查找并更新。问题是我不确定find方法如何搜索。如果有任何改变会使方法认为它是一个全新的不同物体呢? (如何找到实际发现?)

  3. 我所做的是在添加到实体时将实体添加到列表中,以便在编辑后将它们放回原位。问题是我也有删除方法,我不确定它是否会更改索引,因为如果它会那么我每次删除实体时都必须重新更新ID。我发现效率很低。那么列表<> .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); 

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

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

在此先感谢。

+0

你之前”已经写了七场比赛,你真的不知道写一个可重用的游戏引擎。专注于先编写一个游戏:) – Andomar 2010-01-16 13:02:58

+0

你是对的,但我并不是真的一个人工作(实际上我很难),但是为了另一个游戏再次编写所有的代码对我来说太过分了!我还写了那七场比赛,不幸的是这些比赛都没有完成,因为有缺陷的设计。关键是要制造一个框架!抱歉,我写错了。 – Johnny 2010-01-16 18:01:23

回答

0

嗯,我已经得到了我最高解决方案的答案!从我的另一个问题得到它,并认为我也应该在这里提出解决方案。

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

(有人纠正我,如果我错了,我会尽快,我把我的框架/引擎测试检查了这一点,并让你知道是这个“的”解决方案。)

0

我建议不要与“每个对象都在一个大单子” - 方法。而是专注于引擎中的输入,图形和其他基本内容,然后将剩下的留给游戏特定的类。

想象一下,你已经拥有了一个拥有大量树木的2D世界,它们大多都是静态的。现在你已经有5K人坐在你的实体列表中,完全不做任何事情,而不是把它们放在那里,你应该把它们放在你的Map类的某个List中,这样它们更容易访问(你不需要必须通过整个列表才能找到它们),设计也变得更加清洁。通过这种方式,您不必编写一整类通用处理程序代码,最终仍然不适合您可能投入到您的世界的所有可能的对象。

所以从我身边的3个秘诀是: - 将唯一的非游戏特定代码的引擎(图形,声音输入) - 从发动机只调用游戏中的2种方法,例如像updateGame()和renderGame()然后处理其余的问题 - 最后但并非最不重要的一点是:让游戏组件与其他组件保持分离,只让它们在真正需要的地方进行交互。

同样重要的是,建立一些游戏,然后看看他们真正分享哪些代码,并从这些代码组成你的引擎。

如果你想要一个这样做的例子(虽然我不保证它是完美的),你可以看看我的小型引擎here。这是Java并没有很好评论,但它应该给你一个关于如何构建引擎的基本想法。如果你想看看我使用引擎构建的游戏,请查看下载部分。

+0

这是很好的思维方式,但我错了我想告诉我正在制作整个框架。我其实需要直接回答我的问题。为什么?因为我的游戏实际上就是简单的自上而下的2D游戏,所以它不会在维护一个列表中的所有实体时遇到任何问题。该列表像“事件处理程序”一样工作,它在每个实体上调用全局更新。 – Johnny 2010-01-16 18:04:59

+0

我仔细看了一下你的引擎,弄清了它是如何工作的,但是当我更彻底地阅读它时我会得到它。这仍然不是我正在寻找的答案,但我会为您的努力甚至是举例而投票,但不幸的是我没有足够的代表。 我最近读了一些关于基于组件的实体管理的内容,如果你能找到我这样的框架的例子,我将不胜感激。 – Johnny 2010-01-16 18:46:02