0

我回来了,在过去的几周里我一直在顺利取得进展,但这让我在过去三天左右的时间里没有任何突破。

此代码供参考。

    private void paintMap(int xToUpdate, int yToUpdate, int layerToUpdate)
    {
        // this should ONLY be called if mapBitmap has already been drawn initially
        Graphics gfx;

        // create a blank tile to place on top of whatever tile they want to place (to sucessfully update our tile)
        Bitmap blankTile = new Bitmap(Program.pixelSize, Program.pixelSize);
        gfx = Graphics.FromImage(blankTile);
        gfx.Clear(Color.Transparent);

        gfx = Graphics.FromImage(mapBitmap[layerToUpdate]);

        // only draw a map, if a map has been loaded
        if (mapLoaded)
        {
            #region Draw Map Loop
            // draw the map

            // find the tile at that point
            int tile = map.mapTile[xToUpdate][yToUpdate].getTileLayer(layerToUpdate);
            int x1 = Program.getTileXLocation(tile);
            int y1 = Program.getTileYLocation(tile);

            // set the tile's rectangle location 
            srcRect = new Rectangle(x1 * Program.pixelSize, y1 * Program.pixelSize, Program.pixelSize, Program.pixelSize);

            // draw the tile
            gfx.DrawImage(blankTile, xToUpdate * Program.pixelSize, yToUpdate * Program.pixelSize);
            gfx.DrawImage(gfxTiles, xToUpdate * Program.pixelSize, yToUpdate * Program.pixelSize, srcRect, units);

            // weather crap
            // screenMain.DrawImage(gfxNight, x1 * Program.pixelSize, y1 * Program.pixelSize, night, units);
            #endregion
        }
        else // otherwise, a map hasn't been loaded; clear the drawing surface
        {
            gfx.Clear(Color.Black);
        }

        gfx.Dispose();
    }

这是共享相同名称的三种方法之一。我有一个不接受任何参数并刷新整个地图(图层和所有)的方法,并且此代码有效。

但是,当用户更新地图(通过放置/删除瓷砖)时,我不想重新绘制整个地图。相反,我只想用所做的更改来更新那个特定的空间。而不是更新每一层(通过切换那里绘制的瓦片)等等,所有的方法都是在旧瓦片上放置新瓦片。我添加了 blankTile 位图,认为在绘制更改之前绘制它会纠正问题,但事实并非如此。

我的询问是这样的:有没有办法通过删除那里的内容并用新图像替换它来更新位图上的特定图块?

如果需要,我可以提供更多信息。我想继续使用内置的 GDI 库,但如果解决此问题的唯一方法是切换,我会这样做。但我几乎可以肯定应该有一种方法可以解决这个特定问题,而无需关闭我的图形库。到目前为止,它已经完全满足了这个项目的需求(减去这个特定的错误)。

4

1 回答 1

1

找到了一个快速而肮脏的解决方案,不确定它是否是最好的解决方案。

// clear the tile to be redrawn
int x2 = xToUpdate * Program.pixelSize;
int y2 = yToUpdate * Program.pixelSize;

for (int a = x2; a <= x2 + Program.pixelSize - 1; a++)
{
    for (int b = y2; b <= y2 + Program.pixelSize - 1; b++)
    {
        mapBitmapFringe.SetPixel(a, b, Color.Transparent);
    }
 }

几乎,我通过 SetPixel 将我希望更新的位图区域设置为透明。之后,我可以自由地在该区域上重新绘制瓷砖,因为之前的区域已被“清除”。

很抱歉浪费时间。我想如果我再花几个小时研究,我就会找到解决问题的方法。(我不知道为什么我一直忽略 SetPixel 方法!)我将重命名我的问题,以便更容易理解我想要完成的事情。:)

于 2013-12-31T09:57:47.373 回答