私の以前の質問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なので、foreachループを各フレームで330回ループしています。これはおそらく良い考えではありません。しかし、私は代替案を知らない、私は各フレームのレベルをロードする修正します。 – Xephyr
あなたが精巧なコンテンツストリーミングシステムを持っていない限り(私はその証拠は見ません)、ゲームプレイ中には必ず 'Content.Load'を呼び出すべきではありません。静的な場合は、 'LoadContent'の間にそのような操作をすべて行うべきです。 – MickyD