2011-12-03 3 views
1

私はC#でタイルマップを描画しようとしていますが、私の問題は私の意見では奇妙です。タイルマップを描画しようとするとOutOfMemoryExceptionが発生する

私は画面上にタイルを描画するためにx座標とy座標を保持するためにこのint配列を持っています。 (それだけではなく0の付いた矢印はXであり、もう一つはYである)私は、画面へのタイルの一部をレンダリングするために、ループのためにどのように使用するか

ここ

があり、それは私が「そうだ、ここです私がコメントアウトされますライン上でOutOfMemoryException」:

public void DrawTest(SpriteBatch spriteBatch) 
    { 
     for (int x = 0;; x++) 
     { 
      for (int y = 0;; y++) 
      { 
       x = level1[x, 0]; 
       y = level1[0, y]; 

       //This line bellow is where it says OutOfMemoryException 
       spriteBatch.Draw(tileSheet, new Rectangle(x, y, 32, 32), new Rectangle(0, 0, 32, 32), Color.White); 

       if (x >= 5 | y >= 5) 
       { 
        x = 0; 
        y = 0; 
       } 
      } 
     } 
    } 

私はこのrenderメソッドを呼び出したいとき、私はメインクラスでそれを行うには、私はこのDrawTestを使用する前に、それは完全に働いた方法

levelLoader.DrawTest(this.spriteBatch); 

をレンダリング方法をtにryはタイルを描く。しかし、なぜこれが正しく動作しないのか全くわかりません。

UPDATE:

public void DrawTest(SpriteBatch spriteBatch) 
     { 
      for (int x = 0; x < 5 ; x++) 
      { 
       for (int y = 0; y < 5 ; y++) 
       { 
        x = level1[x, 0]; 
        y = level1[0, y]; 
        spriteBatch.Draw(tileSheet, new Rectangle(x, y, 32, 32), new Rectangle(0, 0, 32, 32), Color.White); 
       } 
      } 
     } 

アップデート2:私はあなたが無限ループに陥っていると思う

 public void DrawTest(SpriteBatch spriteBatch) 
    { 
     for (int x = 0; x < 5 ; x++) 
     { 
      for (int y = 0; y < 5 ; y++) 
      { 
       int tileXCord = level1[x, 0]; 
       int tileYCord = level1[0, y]; 
       spriteBatch.Draw(tileSheet, new Rectangle(tileXCord, tileYCord, 32, 32), new Rectangle(0, 0, 32, 32), Color.White); 
      } 
     } 
    } 
+0

おそらく、描画呼び出しを無制限にバッチアップしようとしています。この奇妙なループで何をしようとしていますか? – harold

+0

私は作っているゲームの地図を描画するクラスを作成しようとしています。 – Rakso

答えて

2

私はあなたのコード内のいくつかの問題を参照してください。

  1. あなたがここにあなたのコード内の無限ループを持っています。ネストされたループの終了条件は何ですか?
  2. (重要!)spriteBatch.Draw()メソッドは何も描画せず、スプライトの描画をスケジュールするだけです。このメソッド呼び出しの前にはspriteBatch.Begin()(図面のスケジューリングを開始する)が必要で、最終的にspriteBatch.End()に電話して、スケジュールされた桁をデバイスにフラッシュする必要があります。無限ループでは、メモリがいっぱいになり、メモリ不足例外が発生するまでスプライト描画の無限スケジューリングが発生します。
  3. が(!注意してください)あなたはビット単位のOR比較を使用している(x >= 5 | y >= 5)の状態では、あなたがそれを行うべきではありません(私はむしろここを参照してくださいとしない、目的のない限り、ブール値を使用OR:(x >= 5 || y >= 5)
  4. それ

このようにしてコードを書き直すことになりますが、ループ自体の中でループカウンタを変更することは非常に悪い習慣です。

spriteBatch.Begin(); 
    for (int x = 0; x < 5; x++) 
    { 
     for (int y = 0; y < 5; y++) 
     { 
      x = level1[x, 0]; 
      y = level1[0, y]; 

      //This line bellow is where it says OutOfMemoryException 
      spriteBatch.Draw(tileSheet, new Rectangle(x, y, 32, 32), new Rectangle(0, 0, 32, 32), Color.White); 
     } 
    } 
    spriteBatch.End(); 

Draw()メインギャメルップのイベントごとにすべてのタイルを再描画します(クラスのDraw()メソッドからこのメソッドを呼び出す必要があります)。 XNAは、PCの性能と各フレームで実行する必要がある計算量に応じてFPSレートを変化させます。

+0

これは、spriteBatch.Begin()とEnd()を使用する必要はありません。私はプレイヤークラスについて同じ考えをしましたが、完全に動作します。もし私がここで更新メソッドを作るなら、それはたくさんの異なるspriteBatch.Draw()であり、複数のレベルでも計画しているので、spagetiコードにすることになります。 – Rakso

+0

いいえ、それは必須です(ただし、Draw()イベントごとに1回だけ行う方がよい)、[here](http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics .spritebatch_members.aspx)。 'Draw()'メソッドで、 'Begin()'と 'End()'を一度だけ、図面の始めと終わりに置いて、間にあるすべてのDrawメソッドを呼び出すことができます。 –

+0

+1良い答え。ちょうど賢明になる:XNAのデフォルト設定では固定のフレームレートが使用されます。連続した描画でも同じテクスチャ([ref](http://gamedev.stackexchange.com/a/9289/288))を使用すると、1つのbegin/endブロックに物事を保持することはパフォーマンス上の利点に過ぎません。 –

0

。メモリ不足の例外を避けるために何らかの方法で終了する必要があります。

+0

どうして私はまだタイルを描くことができますか? – Rakso

関連する問題