2016-07-25 4 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이므로 각 프레임을 330 번 반복하는 foreach 루프를 반복합니다. 또한 좋은 아이디어가 아닙니다. 하지만 대안을 모르지만 각 프레임 레벨을로드하는 문제를 해결할 것입니다. – 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