等距,仅在屏幕上绘制

时间:2013-06-02 13:44:46

标签: c# xna drawing isometric tiles-game

我只需要在屏幕上绘制图块以提高性能。有什么可行的方法呢?

我尝试了这个让我接近但最终得到了一个我似乎无法解决的错误。

//world position to start drawing from
        int sPosX = (int)(cam.Position.X - (device.Viewport.Width / 2));
        int sPosY = (int)(cam.Position.Y - (device.Viewport.Height / 2));

        //tile position to start drawing from
        int sTileX = (int)((sPosX + (2*sPosY) - (Map.TileWidth/2)) / Map.TileWidth -1);
        int sTileY = (int)((sPosX - (2 * sPosY) - (Map.TileHeight / 2)) / -Map.TileWidth - 1);

        //amount of rows/collumns to draw
        int rowCount = (int)(device.Viewport.Height / (Map.TileHeight / 2) + 2);
        int colCount = (int)(device.Viewport.Width / Map.TileWidth + 2);

        //current tile to draw
        int tileX;
        int tileY;


        for (int row = 0; row < rowCount; row++)
        {
            for (int col = 0; col < colCount; col++)
            {
                tileX = sTileX + col + (int)((row / 2));
                tileY = sTileY - col + (int)((row / 2));
                if (tileX >= 0 && tileX < tileMap.GetLength(0) && tileY >= 0 && tileY < tileMap.GetLength(1))
                {
                    batch.Draw(grid, new Rectangle((tileX * (TileWidth / 2)) - (tileY * (TileWidth / 2)), (tileX * (TileHeight / 2) + (tileY * (TileHeight / 2))), TileWidth, TileHeight), Color.White);
                    batch.DrawString(tiny, tileX + "," + tileY, new Vector2(tileX * (TileWidth / 2) - (tileY * (TileWidth / 2)) + 24, tileX * (TileHeight / 2) + (tileY * (TileHeight / 2)) + 12), Color.White);
                }
            }
        }

在这里,我尝试逐行绘制我的tilemap。首先,我找出要绘制的第一个图块(左上角),然后我找出需要绘制多少个柱和多少行。

起初我只使用浮点数并在最后一刻投射结束,同时将浮点数逐步转换为int我能够在屏幕上获得完整的X = 0和完整的Y = 0行但其余的仍然出现在这张照片上。

Isometric display problem

移动相机时,显示/渲染的图块在不均匀和均匀之间切换,因此如果我突然向下移动一小部分,图片中显示的所有图块都会消失,并显示空白。进一步向前移动它会逆转,如果我继续移动它会在这两个状态之间闪烁。我认为它与(行/ 2)有关但我似乎无法解决它。

我计算绘制哪些瓷砖的方式似乎很好。当我缩小时,我得到了这个(缩放还没有改变公式)。在下图中,您可以看到第二个状态以及正在绘制的其他图块。

enter image description here

1 个答案:

答案 0 :(得分:2)

tileX = sTileX + col + (int)((row / 2) + (row%2));

模数修正了它,因为除了第一行之外,每第二行应该增加一个。

我仍然认为这是有价值的信息,因为我花了几个小时才发现如何正确地做到这一点并最终自己做了。我认为这是绘制所有内容的最有效方法,因为它允许将钻石样式的等距地图渲染为锯齿形正方形。