私は天文学プロジェクトに取り組んでおり、それらの重力シミュレータ プログラムの 1 つを作成しています。Uni
天体 (クラスのインスタンス) で満たされた宇宙を表すクラスがありますBody
。
このUni
クラスは、それ自体を更新し、新しいボディを追加し、ボディを削除することができid
ます。それは完全に数学ベースであり、単独で動作するはずです。
その周りで、PyGame を使用してオプションでシミュレーションをリアルタイムで表示し、MatPlotLib を使用して結果を分析するプログラムを作成することを計画しています。しかし、計算 ( Uni
) とレンダリング ( Renderer
) を切り離す方法について少し混乱しています!
私はそれを次のように想像しました:
メインプログラム:
- PyGame をインポートして初期化し、
screen
. - ユニバースをインスタンス化し、ボディなどで埋めます (実際には、ユニバースの
FileManager
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 サーフェスを作成および破棄することはできません (パフォーマンスが重いと思います)。
考えられる解決策の 1 つは、ボディ ID によってすべて識別される PyGame オブジェクトの辞書をレンダラーに持たせることです。次に、それを繰り返し処理し、なくなったボディを削除し、フレームごとに新しいボディを追加します。
これは正しい方法ですか?