2016-07-18 8 views
0

私はレベル用のレイアウトを含む画像を持っています。画像から各ピクセルの色を読み込み、対応するブロックを描画することによってゲームのレベルを読み込みたいと思います。私はこのコードを使用しています:Texture2D XNAから各ピクセルの色の配列を取得しますか?

public void readLevel(string path, GraphicsDevice graphics) 
    { 
     //GET AN ARRAY OF COLORS 
     Texture2D level = Content.Load<Texture2D>(path); 
     Color[] colors = new Color[level.Width * level.Height]; 
     level.GetData(colors); 

     //READ EACH PIXEL AND DRAW LEVEL 
     Vector3 brickRGB = new Vector3(128, 128, 128); 

     int placeX = 0; 
     int placeY = 0; 

     foreach (Color pixel in colors) 
     { 
      SpriteBatch spriteBatch = new SpriteBatch(graphics); 
      spriteBatch.Begin(); 

      if (pixel == new Color(brickRGB)) 
      { 
       Texture2D brick = Content.Load<Texture2D>("blocks/brick"); 
       spriteBatch.Draw(brick, new Rectangle(placeX, placeY, 40, 40), Color.White); 
      } 


      if(placeX == 22) 
      { 
       placeX = 0; 
       placeY++; 
      } 
      else 
      spriteBatch.End(); 
     } 
    } 

ただ空白の画面が表示されます。助けていただければ幸いです!

編集:問題が解決しました! (下のhtmlcoderexeの答えを読んでください)また、このコードに別の問題がありました。here.

答えて

1

あなたのコードは、1つのピクセルオフセットで前回と同じように描画されていますが、他のパラメータは40ピクセル幅です。 placeXとplaceYにタイルのストライドを乗算する必要があります(40)。

また、色を比較するビットでは、浮動小数点のカラー値(0.0f〜1.0f)とバイトカラーを一緒に使用すると問題が発生する可能性があります。

new Color(brickRGB) 

これはに変換:だからそれは1F(カラー用フロート入力の許容最大値)に、は0.0f-1.0Fの範囲からクリップをカラーダウン構築、および試み

new Color(new Vector3(128f,128f,128f)) 

目標色(128,128,128)と同じではない白い色(255,255,255)になります。

は、この問題を回避するには、変更してみてください

Vector3 brickRGB = new Vector3(128, 128, 128); 

Color brickRGB = new Color(128, 128, 128); 

にこの部分

if (pixel == new Color(brickRGB)) 

にちょうど

if (pixel == brickRGB) 

また、placeXとplaceYに40を掛けた描画矩形を作成する必要がありますが、変数には書き込まないでください。ちょうどplaceX * 40を使用し、後で定数に置き換えてください。

関連する問題