Я пытаюсь создать простую 2D-игру с прокруткой в качестве учебного упражнения в моноигре (XNA). В настоящее время я загружаю информацию о плитке из текстового файла, создавая массив (tiles[,]) с объектом плитки, хранящим информацию о том, где записана плитка и какую текстуру следует использовать при вызове метода рисования. В настоящее время я рисую каждую плитку в массиве сразу, а затем просто обновляю положение плитки, чтобы перемещать ее по экрану. Очевидно, рисовать все плитки одновременно довольно сложно, и я думаю, что было бы лучше, если бы я рисовал только те плитки, которые видны на экране, чтобы по мере перемещения плиток по экрану отрисовывалось больше плиток. Я не уверен, как лучше это сделать? Я немного потерялся в том, как я могу сказать, какие плитки должны быть нарисованы. Любая помощь будет принята с благодарностью. Вот мои методы рисования и обновления в моем классе уровня - он просто вызывает методы в классе Tile для рисования/обновления позиции.
/// <summary>
/// Draws each individual tile in the level.
/// </summary>
private void DrawTiles(SpriteBatch spriteBatch)
{
// For each tile position
for (int y = 0; y < Height; ++y)
{
for (int x = 0; x < Width; ++x)
{
tiles[x, y].Draw(spriteBatch);
}
}
}
public void Update(GameTime gameTime, int scrollSpeed, ScrollDirection direction)
{
// Update the positions of each of the Background sprites
foreach (Tile tile in tiles)
{
tile.Update(gameTime, new Vector2(0, scrollSpeed), scrollDirection);
}
}
}
заранее спасибо
Теперь я пытаюсь прокручивать только видимые на экране плитки для рисования, используя окно просмотра, переданное с графического устройства. В основном я пытаюсь получить количество плиток, которые могут поместиться на экране, прежде чем пытаться их нарисовать, разделив высоту экрана на высоту плитки и то же самое на ширину. Это прекрасно работает и рисует все тайлы, видимые в точке обзора.
Единственная проблема заключается в том, что он больше не рисует плитки, которые начинались за пределами области просмотра, поэтому, даже если в обновлении плитки перемещаются в область просмотра, они не рисуются, поскольку цикл использует их исходное местоположение. Я не могу придумать способ исправить это, не перебирая все плитки :-(
Поскольку уровень может быть большим, было бы очень неэффективно перебирать все плитки, чтобы рисовать только то, что было на экране.
Мы будем очень признательны за любые советы.
вот обновленный розыгрыш:
private void DrawTiles(SpriteBatch spriteBatch)
{
float tileWidth = 40;
float tileHeight = 32;
for (int y = 0; y < (int)Math.Ceiling(mViewport.Height / tileHeight); ++y)
{
for (int x = 0; x < (int)Math.Ceiling(mViewport.Width / tileWidth); ++x)
{
tiles[x, y].Draw(spriteBatch);
}
}
}