我在做一个天文项目,制作一个重力模拟器程序。我有一个Uni
类,它代表一个充满天体的宇宙(这个Body
类的实例)。在
这个Uni
类能够更新自身,添加新的实体,并通过它们的id
删除实体。它完全基于数学,应该单独工作。在
围绕它,我计划构建一个程序,它使用PyGame来实时显示模拟,并使用MatPlotLib来分析结果。但是,我对如何保持计算(Uni
)和渲染(Renderer
)解耦有点困惑!在
我的设想是这样的:
主程序:
screen
。在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
还是{
另一方面,渲染器只为它的render
方法而存在,该方法不能根据需要创建和销毁PyGame曲面(我想这会影响性能)。在
一个可能的解决方案是让渲染器有一个PyGame对象的字典,所有对象都由body id标识。然后,它将迭代它,移除任何已消失的实体,并在每一帧中添加任何新的实体。在
走这条路对吗?在
为什么不将
Body
本身添加到pygame对象的字典中而不是添加ID?毕竟,Python变量只是一个标签,因此渲染器不需要知道变量代表什么。这样你就不用查身份证了。在一个相关的选项是将一个或多个
viewport
对象添加到你的宇宙中。因为无论查看机制的实现是什么,通常都不希望显示整个宇宙,因此视口是宇宙的一个适当属性。使用该视口可以使用两种方法(除了创建和调整大小)。首先是一个方法来获取viewport中的所有Body
(它可以返回一个保留在viewport对象中的列表)。第二个方法是获取一个包含两个列表的元组;一个是在视口中出现的Body
,第二个是自上次更新以来从视口中消失的Body
列表。视口还应该有一个由universe的update方法调用的update方法。在相关问题 更多 >
编程相关推荐