我回来了,在过去的几周里我取得了顺利的进展,但在过去的三天左右时间里,这一直困扰着我,没有任何突破。
此代码仅供参考。
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库,但如果解决这个问题的唯一方法是切换,我会这么做。但我几乎可以肯定,应该有一种方法可以在不切换图形库的情况下解决这个特定问题。到目前为止,它非常适合这个项目的需要(减去这个特殊的错误)。
找到了一个快速而肮脏的解决方案,不确定它是否是最好的解决方案。
// 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方法!)我要重命名我的问题,这样更容易理解我试图实现的目标。:)