2011-10-18 8 views
1

私は小さなビデオゲームを構築しています。私は良いoop /デザインをしようとしています。デザイン、ゲームに関するOOP

私はマップオブジェクトとカメラオブジェクトを持っています。これらは両方とも '世界'のオブジェクトに作成されます。

ただし、問題があります。地図では、すべてをレンダリングして更新します。パフォーマンス上の理由から、私はプレーヤーの画面上にあるものだけを更新/レンダリングしたいだけです。

カメラオブジェクトにはこの情報がありますが、マップオブジェクトはその情報にアクセスできません。

この情報を取得するにはいくつかの方法がありますが、その方法の選択肢が必要でした。

答えて

7

おそらく最も関連性の高いOOの原則はSingle Responsibility Principleです。 MapオブジェクトがCameraオブジェクトが 世界を観察するために使用された視点を維持する責任がある世界

  • のレイアウトを保持する責任がある

    • は責任のこれらのステートメントを考えてみましょう

      これを考えると、画面に表示されているものをレンダリングする責任を負うことは、明らかに管轄外です。

      あなたはおそらく、画面を描画するために両方Mapに取るべきWorldRenderer、およびCameraを持っている必要があります。 私たちは良いデザインの対象ですが、WorldRendererは本質的に変更不可能にすることをお勧めします。建設時にMapCameraが入り、その時点から変更することはできません。 :

      public class WorldRenderer { 
          private final Map map; 
          private final Camera camera; 
          private final List<LightSource> lightSources; 
      
          public WorldRenderer(Map map, Camera camera, List<LightSource> sources) { 
           this.map = map; 
           this.camera = camera; 
           this.lightSources = sources; 
          } 
      
          public void render() { 
           Viewport viewport = camera.getViewport(); 
           Map submap = map.getVisibleMapFor(viewport); 
           Scene litScene = applyLighting(submap); // using lightSources 
           renderScene(litScene); 
          } 
      
          private void renderScene(Scene scene) { 
           ... 
          } 
      } 
      

      ...この例ではいくつかの光源も提供されていることに気づいたかもしれません。ここでもSRPを使用して、レンダリングプロセスをコンポーネント要素から切り離しています。

  • +0

    ありがとう、それはとても良いデザインです!それははるかに理にかなっています。あなたはそのように考えてどこで学んだのですか?あなたがお勧めする本はありますか? –

    +1

    小さな子供のように、私はオブジェクト指向のスパイダーのグループ(実際にはのセットでした)の攻撃を受け、そのうちの1つが大脳皮質に卵を産んだ。以来、私はオブジェクトの面ですべてを見ます:-)ただ冗談を言う;私が最も得意とする本は、古典的なGOFのパターン、おじさんのBob [Clean Code](http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882)とJeff Langrの著名な[Essential Java Style](http://www.amazon.com/Essential-Java-Style-Patterns-Implementation/dp/0130850861/ref=sr_1_1?ie=UTF8&qid=1289278951&sr=8-1)。そして、たくさんの練習を! – millhouse

    0

    ビューに入っていなくても、何かが表示されても既にその位置にあるように、私は個人的にすべてを更新します。レンダリングに関しては、draw()メソッドやpaint()メソッドの独自のバージョンを実装して、カメラに表示されるものだけを描画することができます。それは単純なアルゴリズムのいくつかの並べ替えになります。

    関連する問題