我正在做一个天文学项目,制作其中一个重力模拟器程序。我有一个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, respondr.render(screen, uni, ui) #The UI class has a list of UI elements.
但是,渲染器需要保留一个持久的 PyGame 表面和需要绘制的图像列表,这就是问题所在。Uni和实例都不必Body知道 PyGame,因此它们不能自己保留这些。
另一方面,渲染器只存在于它的render方法中,它不能只是根据需要创建和销毁 PyGame 表面(我猜这会很重性能)。
一种可能的解决方案是让渲染器有一个 PyGame 对象的字典,所有对象都由 body id 标识。然后,它将对其进行迭代,删除所有已消失的实体,并在每一帧添加任何新实体。
这是正确的方法吗?