使用DrawImage函数无法获得准确的结果

时间:2013-11-18 07:13:55

标签: c# drawimage tiles-game

好的,所以我有一张图片来保存我的瓷砖。然后我把我的PictureBox用作我的“游戏画面”。所有的代码都是我的瓷砖集(瓷砖)的片段,并将其放在游戏屏幕上。

这是我的代码。

private void picMap_Click(object sender, EventArgs e)
        {

            //screenMain = picMap.CreateGraphics();

            // Create image.
            //gfxTiles = Image.FromFile(@Program.resourceMapFilePath + "poatiles.png");

            // Create coordinates for upper-left corner of image. 
            int x = 0;
            int y = 0;

            // Create rectangle for source image.
            Rectangle srcRect = new Rectangle(16, 16, 16, 16);
            GraphicsUnit units = GraphicsUnit.Pixel;

            // Draw image to screen.
            screenMain.DrawImage(gfxTiles, x, y, srcRect, units);
            screenMain.DrawImage(gfxTiles, 16, 0, srcRect, units);
            screenMain.DrawImage(gfxTiles, 32, 0, srcRect, units);
            screenMain.DrawImage(gfxTiles, 16, 16, srcRect, units);
        }

这是我的输出:http://tm14.net/pokestory/mapeditor_test.png

为什么每个“瓷砖”之间的空间都存在(这是2个像素的间隙)?我可以使用代数来修改代码,但是我计划使用代数来编程找出需要去的地方等等,所以一个贫民窟钻机可以工作,但是在整个游戏中这样做会很麻烦,至少,马虎。

2 个答案:

答案 0 :(得分:0)

我认为对DrawImage的调用是可以的。在您发布的图像中,它看起来像是彼此相邻的16x16图块。我查看poatiles.png。我不确定它中的Rectangle(16,16,16,16)是什么。它可能不是你的想法。

编辑:我不知道该说些什么。我做了一个几乎与poatiles一样大小的png,并在其中放了一个16x16的正方形16,16,它的绘制与你期望的完全一样。

代码看起来很好,因为它适用于较小的图像,我唯一能想到的就是poatiles存在问题。

在MSDN中有关于Graphics.DrawImage方法(Image,Int32,Int32,Rectangle,GraphicsUnit)的以下注释

  

此方法使用其物理大小绘制图像的一部分,因此   无论如何,图像部分都将以英寸为单位   显示设备的分辨率(每英寸点数)。例如,   假设图像部分具有216的像素宽度和水平   分辨率为每英寸72点。如果你调用这个方法来绘制它   设备上的图像部分,每英寸分辨率为96点,   渲染图像部分的像素宽度为(216/72)* 96 =   288。

由于你将像素指定为单位,我希望它忽略它。但是,如果没有更好的想法,你可能想要比较poatiles与较小图像的dpi。 (Image.Horizo​​ntalResolution& Image.VerticalResolution)

答案 1 :(得分:0)

我不确定所有的信息都是从那里开始的,但是这里有一些建议,看看你到目前为止做了什么。

1)检查poatiles.png以确保它绝对是一个16x16像素的图像,周围没有黑色像素。

2)你的Rectangle在它的构造函数中有四个int似乎很奇怪。矩形通常应该只有宽度和高度(如果任何边有不同的长度,那么它不是一个真正的矩形!)

3)您可能希望通过乘以您尝试绘制的矩形的宽度和高度并将该值添加到原点(0,0)来确定屏幕上的位置。