0

好的,所以我有一个包含我的图块集的图像。然后我将我的 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 像素的间隙)?我可以使用 ghetto rig 代码,但我计划使用代数以编程方式找出瓷砖需要去的地方等等,所以 ghetto rig 可以工作,但在整个游戏中这样做会很麻烦,至少,草率。

4

2 回答 2

0

我不确定所有信息是否都已开始,但这里有一些我从查看您迄今为止所做的工作中得到的建议。

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

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

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

于 2013-11-18T07:41:16.080 回答
0

我认为对 DrawImage 的调用是可以的。在您发布的图片中,它看起来像彼此相邻的 16x16 瓷砖。我会检查 poatiles.png。我不确定 Rectangle(16, 16, 16, 16) 里面有什么。可能不是你想的那样。

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

代码看起来不错,因为它适用于较小的图像,所以我唯一能想到的就是 poatiles 有问题。

MSDN 中有以下关于 Graphics.DrawImage Method (Image, Int32, Int32, Rectangle, GraphicsUnit) 的评论

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

由于您将像素指定为单位,我希望它会忽略它。但是在没有更好的想法的情况下,您可能希望将 poatiles 的 dpi 与较小的图像进行比较。(Image.Horizo​​ntalResolution & Image.VerticalResolution)

于 2013-11-18T07:35:33.403 回答