이전 질문에서 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);
}
}
모든 프레임 ('Content.Load' ...)에서 레벨 텍스처를로드하는 것이 성능상 현명한 방법은 아닙니다. 그 외,'level.Width'와'level.Height'에 대한 실제 값은 무엇입니까? –
내가 읽는 이미지는 22 * 15이므로 각 프레임을 330 번 반복하는 foreach 루프를 반복합니다. 또한 좋은 아이디어가 아닙니다. 하지만 대안을 모르지만 각 프레임 레벨을로드하는 문제를 해결할 것입니다. – Xephyr
정교한 컨텐츠 스트리밍 시스템 (증거 없음)이 없다면 게임 플레이 중에 'Content.Load'를 호출해서는 안되며 확실히 모든 프레임에 대해 호출해서는 안됩니다. 정적 인 경우 LoadContent 중 모든 작업을 수행해야합니다. – MickyD