我正在做一个天文学项目,制作其中一个重力模拟器程序。我有一个Uni
类,它代表一个充满天体的宇宙(Body
类的实例)。
这个Uni
类能够更新自己,添加新的实体,并通过它们的id
. 它完全基于数学,应该单独工作。
围绕它,我计划构建一个程序,该程序使用 PyGame 选择性地实时显示模拟,并使用 MatPlotLib 分析结果。但是,我对如何保持计算(Uni
)和渲染(Renderer
)解耦有点困惑!
我是这样设想的:
主程序:
- 导入 PyGame,对其进行初始化,然后创建一个
screen
. - 实例化一个 Universe,用 body 填充它(实际上由 a 完成
FileManager
,它读取一个 uni 的 JSON 规范)。 - 创建一个
Renderer
进入一个
while run:
循环:uni.update(dt)
#Listen to PyGame events, respond
r.render(screen, uni, ui) #The UI class has a list of UI elements.
但是,渲染器需要保留一个持久的 PyGame 表面和需要绘制的图像列表,这就是问题所在。Uni
和实例都不必Body
知道 PyGame,因此它们不能自己保留这些。
另一方面,渲染器只存在于它的render
方法中,它不能只是根据需要创建和销毁 PyGame 表面(我猜这会很重性能)。
一种可能的解决方案是让渲染器有一个 PyGame 对象的字典,所有对象都由 body id 标识。然后,它将对其进行迭代,删除所有已消失的实体,并在每一帧添加任何新实体。
这是正确的方法吗?