1

我正在做一个天文学项目,制作其中一个重力模拟器程序。我有一个Uni类,它代表一个充满天体的宇宙(Body类的实例)。

这个Uni类能够更新自己,添加新的实体,并通过它们的id. 它完全基于数学,应该单独工作。

围绕它,我计划构建一个程序,该程序使用 PyGame 选择性地实时显示模拟,并使用 MatPlotLib 分析结果。但是,我对如何保持计算(Uni)和渲染(Renderer)解耦有点困惑!

我是这样设想的:

主程序:

  1. 导入 PyGame,对其进行初始化,然后创建一个screen.
  2. 实例化一个 Universe,用 body 填充它(实际上由 a 完成FileManager,它读取一个 uni 的 JSON 规范)。
  3. 创建一个Renderer
  4. 进入一个while run:循环:

    1. uni.update(dt)
    2. #Listen to PyGame events, respond
    3. r.render(screen, uni, ui) #The UI class has a list of UI elements.

但是,渲染器需要保留一个持久的 PyGame 表面和需要绘制的图像列表,这就是问题所在。Uni和实例都不必Body知道 PyGame,因此它们不能自己保留这些。

另一方面,渲染器只存在于它的render方法中,它不能只是根据需要创建和销毁 PyGame 表面(我猜这会很重性能)。


一种可能的解决方案是让渲染器有一个 PyGame 对象的字典,所有对象都由 body id 标识。然后,它将对其进行迭代,删除所有已消失的实体,并在每一帧添加任何新实体。

这是正确的方法吗?

4

1 回答 1

1

为什么不将Bodys 本身添加到 pygame 对象字典而不是 ID,而不是 body ID?毕竟,Python 变量只是一个标签,所以渲染器不需要知道变量代表什么。它可能会节省您查找 ID 的时间。

viewport一个相关的选项是向您的 Universe添加一个或多个对象。因为无论查看机制的实现如何,您通常都不想显示整个 Universe,因此视口将是 Universe 的适当属性。使用该视口将有几种方法(创建和调整大小除外)。首先是在视口中获取所有Bodys 的方法(它可以只返回一个您将保留在视口对象中的列表)。第二个方法来获取一个包含两个列表的元组;其中一个Body出现在视口中,第二个是Body自上次更新以来离开视口的 s 列表。视口还应该有一个由 Universe 的更新方法调用的更新方法。

于 2012-10-27T12:16:16.117 回答