1

私は天文学プロジェクトに取り組んでおり、それらの重力シミュレータ プログラムの 1 つを作成しています。Uni天体 (クラスのインスタンス) で満たされた宇宙を表すクラスがありますBody

このUniクラスは、それ自体を更新し、新しいボディを追加し、ボディを削除することができidます。それは完全に数学ベースであり、単独で動作するはずです。

その周りで、PyGame を使用してオプションでシミュレーションをリアルタイムで表示し、MatPlotLib を使用して結果を分析するプログラムを作成することを計画しています。しかし、計算 ( Uni) とレンダリング ( Renderer) を切り離す方法について少し混乱しています!

私はそれを次のように想像しました:

メインプログラム:

  1. PyGame をインポートして初期化し、screen.
  2. ユニバースをインスタンス化し、ボディなどで埋めます (実際には、ユニバースのFileManagerJSON 仕様を読み取る によって行われます)。
  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 サーフェスと画像の永続的なリストを保持する必要があり、そこに問題があります。どちらのインスタンスUniBodyPyGame を認識する必要がないため、それら自体を保持することはできません。

一方、レンダラーはそのrenderメソッドのためだけにあり、必要に応じて PyGame サーフェスを作成および破棄することはできません (パフォーマンスが重いと思います)。


考えられる解決策の 1 つは、ボディ ID によってすべて識別される PyGame オブジェクトの辞書をレンダラーに持たせることです。次に、それを繰り返し処理し、なくなったボディを削除し、フレームごとに新しいボディを追加します。

これは正しい方法ですか?

4

1 に答える 1

1

body ID の代わりに、ID の代わりにBodys 自体を pygame オブジェクトの辞書に追加してみませんか? 結局のところ、Python 変数は単なるラベルであるため、レンダラーは変数が何を表しているかを知る必要はありません。また、ID を検索する手間を省くことができます。

関連するオプションは、1 つまたは複数のviewportオブジェクトをユニバースに追加することです。表示メカニズムの実装に関係なく、通常はユニバース全体を表示したくないため、ビューポートはユニバースの適切な属性になります。そのビューポートを使用すると、いくつかの方法が実行されます(作成とサイズ変更を除く)。最初Bodyに、ビューポート内のすべての を取得するメソッド (ビューポート オブジェクトに保持するリストを返すだけです)。2 つ目は、2 つのリストを含むタプルを取得するメソッドです。ビューポートに表示された の1 つと、最後の更新以降にビューポートから出た のBodyリストです。Bodyビューポートには、ユニバースの update メソッドによって呼び出される update メソッドも必要です。

于 2012-10-27T12:16:16.117 に答える