我正在编写一个十六进制地图创建程序。它基本上像一个绘图程序,我可以用我选择制作地图的图像或颜色绘制每个十六进制。我试图拥有透明的六边形,这样我就可以制作出不同形状和大小的地图,而不仅仅是正方形。但是当我创建一个包含所有透明六边形的地图时,当我绘制任何十六进制时,其右边的所有六边形,然后向下,对于地图的其余部分采用相同的图像。
这就是我的期望:
但这就是我得到的:
这是绘制地图的代码:
internal static Bitmap Create(Map map, Rectangle visibleArea, Color penColor = default(Color))
{
var visibleAreaF = new RectangleF(visibleArea.X, visibleArea.Y, visibleArea.Width, visibleArea.Height);
var mapImage = new Bitmap(visibleArea.Width, visibleArea.Height);
using (Graphics mapGraphics = Graphics.FromImage(mapImage))
{
mapGraphics.SetClip(new RectangleF(new PointF(), visibleArea.Size));
mapGraphics.Clear(Color.Transparent);
PointF[] hexagonPoints = HexCalculator.HexagonPoints(map.Radius);
using (var tileImage = new Bitmap(map.HexSize.Width, map.HexSize.Height))
{
using (Graphics tileGraphics = Graphics.FromImage(tileImage))
{
tileGraphics.Clear(Color.Transparent);
ClipHexOverflow(tileGraphics, hexagonPoints);
foreach (
Hex hex in
map.Where(
hex =>
visibleAreaF.Contains(hex.BoundingBox) ||
visibleAreaF.IntersectsWith(hex.BoundingBox)))
{
tileGraphics.DrawImage(Terrain.ReturnTerrainImage(hex.Terrain), 0, 0, map.HexSize.Width,
map.HexSize.Height);
DrawBorder(tileGraphics, hexagonPoints, hex, penColor);
mapGraphics.DrawImage(tileImage, hex.Location.RemoveOffsetF(visibleArea.Location));
}
}
}
}
return mapImage;
}
我能够通过在使用SystemColors.ControlDark的代码中创建一个图像来获得我想要的结果,我使用它作为透明地形的十六进制图像,但它一直让我发疯,试图找出为什么我得到第二个结果从上图。我逐步完成了代码,并为tileGraphics.DrawImage调用得到了正确的hex.Terrain,但是就像它将以前的非透明图像保存在内存中一样。