xna 2d редактор карт, рисующий только то, что на экране - PullRequest
0 голосов
/ 20 июля 2011

Хорошо, у меня есть редактор 2D Tile Map, над которым я работаю в xna c #.

В методе Draw я зацикливаю (с помощью цикла for) мой двумерный массив плиток так, чтобы Моя карта обновляется и рисует все плитки в каждом кадре.

У меня вопрос, как вы рисуете только плитки, которые видны на экране.

Также есть лучший способ нарисовать карту тайлов (вместо того, чтобы обновлять каждый кадр).

Ответы [ 2 ]

1 голос
/ 20 июля 2011

В демоверсии платформера я играл с видимыми плитками, которые вычислялись, а затем рисовались только эти плитки.Я полагаю, что вам придется включать их в метод рисования, который будет рисоваться каждый раз.

Вот фрагмент (в нем только прокрутка слева направо, поэтому вертикальный диапазон не рассчитывался).Это отслеживало положение камеры для ее расчета.

Редактировать :: Добавлен второй метод, показывающий, как обновляется позиция камеры на основе позиции игрока, сохраненной в объекте игрока.

    private void DrawTiles(SpriteBatch spriteBatch)
    {
        // Calculate the visible range of tiles.
        int left = (int)Math.Floor(cameraPosition / Tile.Width);
        int right = left + spriteBatch.GraphicsDevice.Viewport.Width / Tile.Width;
        right = Math.Min(right, Width - 1);
        // For each tile position
        for (int y = 0; y < Height; ++y)
        {
            for (int x = left; x <= right; ++x)
            {
                // If there is a visible tile in that position
                Texture2D texture = tiles[x, y].Texture;
                if (texture != null)
                {
                    // Draw it in screen space.
                    Vector2 position = new Vector2(x, y) * Tile.Size;
                    spriteBatch.Draw(texture, position, Color.White);
                }
            }
        }
    }`


    private void ScrollCamera(Viewport viewport)
    {
        const float ViewMargin = 0.35f;

        // Calculate the edges of the screen.
        float marginWidth = viewport.Width * ViewMargin;
        float marginLeft = cameraPosition + marginWidth;
        float marginRight = cameraPosition + viewport.Width - marginWidth;

        // Calculate how far to scroll when the player is near the edges of the screen.
        float cameraMovement = 0.0f;
        if (Player.Position.X < marginLeft)
            cameraMovement = Player.Position.X - marginLeft;
        else if (Player.Position.X > marginRight)
            cameraMovement = Player.Position.X - marginRight;

        // Update the camera position, but prevent scrolling off the ends of the level.
        float maxCameraPosition = Tile.Width * Width - viewport.Width;
        cameraPosition = MathHelper.Clamp(cameraPosition + cameraMovement, 0.0f, maxCameraPosition);
    }
0 голосов
/ 20 июля 2011
int MapSizeX = 20;   
int MapSizeY = 20;
int LeftCornerX = 0;       //the position of the Tile in the 2Darray that is going
int LeftCornerY = 0;       //to be drawn in the left corner of the screen.
int ScreenSizeX = 10;
int ScreenSizeY = 10;

public Tiles[,] tiles = new Tile[MapSizeX, MapSizeY]; //list of all Tiles

//then you can draw it like this....

int counterX = 0;  //represents the position on screen
int counterY = 0;

// y and x inside the for loops represents the position in tiles

for(int y = LeftCornerY; y < MapSizeY <  y++)
{
    for(int x = LeftCornerX; y < MapSizeX <  x++)
    {
         if(counterX  < ScreenSizeX && counterY < ScreenSizeY)
         {
              tiles[x, y].draw(tiles[counterX , counterY]);
         }
         counterX ++;
         //when you do like this you draw the tiles you want
         //at the position you want. In the draw method you just
         // drawn the tile you want at the position of the tile you 
         // send as in parameter to the draw method.
    }
    counterY++;
    counterX = 0;
}

тогда вам просто нужно увеличить переменные LeftCorner, чтобы нарисовать другую часть карты

...