如何更新位图图像的特定部分?

时间:2013-12-30 10:32:01

标签: c# graphics gdi+ gdi tiles-game

我回来了,过去几周我一直在顺利进步,但这让我在过去三天左右难以接受,没有任何突破。

此代码仅供参考。

    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库,但如果解决这个问题的唯一方法是切换,我会这样做。但我几乎可以肯定,如果不切换我的图形库,应该有办法解决这个问题。到目前为止,它不仅适合这个项目的需要(减去这个特定的错误)。

1 个答案:

答案 0 :(得分: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方法!)我将重命名我的问题,以便更容易理解我想要完成的任务。 :)