2016-07-25 13 views
1

私の以前の質問here.私はイメージから各フレームを読み、レベルを描く方法を知りました。ループで遅延が発生するForeachループ?

Playerクラスを入力したので、プレーヤは実際にコードが変化していないにもかかわらず動きます。私はこれを知っています。私がレベルのコードをコメントアウトすると、プレーヤーはうまく動くからです。

私はこれを行うforeachループだと思います。私は考えていないと助けていただければ幸いです!

ここをクリックして時間を節約するために、ここで成功したレベルリーディングコードです。

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 
    Color brickRGB = new Color(128, 128, 128); 
    Color blankRGB = new Color(87, 0, 127); 

    int placeX = 0; 
    int placeY = 0; 

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

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

      Rectangle rect = new Rectangle(placeX, placeY, 40, 40); 
      blocks.Add(rect); 
     } 
     else if (pixel == blankRGB) 
     { 
      Texture2D back = Content.Load<Texture2D>("titlescreen/back"); 
      spriteBatch.Draw(back, new Rectangle(placeX, placeY, 40, 40), Color.White); 
     } 

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

Game.cs:

class Game 
{ 
    Player player; 
    LevelReader reader; 
    int level = 1; 

    public Game(ContentManager content) 
    { 
     reader = new LevelReader(content); 
     player = new Player(content); 
    } 

    public void Update() 
    { 
     player.Update(); 
    } 
    public void Draw(GraphicsDevice graphics) 
    { 
     reader.readLevel("levels/l" + level, graphics); 
     player.Draw(graphics); 

    } 
} 
+1

すべてのフレーム( 'Content.Load' ...)でレベルテクスチャを読み込むのは、パフォーマンス上の理由ではないでしょう。それ以外に、 'level.Width'と' level.Height'の実際の値は何ですか? –

+0

私が読んでいるイメージは22 * 15なので、foreachループを各フレームで330回ループしています。これはおそらく良い考えではありません。しかし、私は代替案を知らない、私は各フレームのレベルをロードする修正します。 – Xephyr

+0

あなたが精巧なコンテンツストリーミングシステムを持っていない限り(私はその証拠は見ません)、ゲームプレイ中には必ず 'Content.Load'を呼び出すべきではありません。静的な場合は、 'LoadContent'の間にそのような操作をすべて行うべきです。 – MickyD

答えて

1

あなたは、ループのspritebatch.Begin()spritebatch.End()外への呼び出しを移動したい場合があります。

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


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

      Rectangle rect = new Rectangle(placeX, placeY, 40, 40); 
      blocks.Add(rect); 
     } 
     else if (pixel == blankRGB) 
     { 
      Texture2D back = Content.Load<Texture2D>("titlescreen/back"); 
      spriteBatch.Draw(back, new Rectangle(placeX, placeY, 40, 40), Color.White); 
     } 

     if (placeX == 840) 
     { 
      placeX = 0; 
      placeY += 40; 
     } 
     else placeX += 40; 

    } 
spriteBatch.End(); 
+0

-_-私は今や気が気になりません。少なくとも私の問題はすばやく修正されました。本当にありがとう! I – Xephyr

+0

あなたは大歓迎です。ハッピーコーディング! – Jace

+1

'foreach'の繰り返しごとに同じレンガを' Content.Load'経由でロードしています。パフォーマンスが低下します! – MickyD

関連する問題