移动图片框中的透明图像
本文关键字:透明 透明图 图像 移动 | 更新日期: 2023-09-27 17:51:07
对于一个项目,我正在制作一款游戏,其中我有一个滚动地图。地图左右移动,并在一个图片框中重新绘制,这样我就可以在一个小的图片框中有一个大的地图。地图的顶部是透明的,这样我就可以稍后改变天空的颜色。但是,当我移动地图时,透明部分出现故障。
移动前的原始地图
移动一个位后
正如你所看到的,树线以上的所有东西都被拉长了,这是因为这是透明度开始的地方。图片框的父元素是窗体,窗体是浅蓝色的,这就是为什么背景是浅蓝色的原因。
这是我的代码移动图片/重新绘制它到图片框:
private void timerTick_Tick(object sender, EventArgs e)
{
move();
//Draws new portion of the map
g.DrawImage(image, new Rectangle(0, 0, pbMap.Width, pbMap.Height), new Rectangle(imageX, imageY, pbMap.Width, pbMap.Height), GraphicsUnit.Pixel);
//Refreshes
pbMap.Image = bmp;
}
private void move()
{
//Right arrow events
if (right)
{
imageX += mapSpeed;
//Makes sure the picture stays within borders
if (imageX >= (imageWidth - pbMap.Width))
{
imageX = imageWidth - pbMap.Width;
}
}
//Left arrow events
if (left)
{
imageX -= mapSpeed;
//Makes sure the picture stays within borders
if (imageX <= 0)
{
imageX = 0;
}
}
}
有谁能帮忙解释一下这个故障吗?
在呼叫g.DrawImage()
之前尝试使用您的天空颜色呼叫g.Clear()
。我认为它只是在自己上面绘图,这导致了涂抹。
对我来说,你似乎是一遍又一遍地重新绘制,而没有清除显示从以前的绘制!你使用什么类型的框架来开发它?它有自定义绘图类吗?正如tesserex建议的那样,更具体地调用g.c clear()和u就可以了。
在这种情况下你不应该需要g.Clear
,因为你每次都重新绘制一个新图像。
我打赌imageX大于(imageWidth - pbMap.Width),所以它不会进入IF,因此它将像以前一样重新绘制。
注意:我不知道你如何创建g,但如果你使用.CreateGraphics()
,不要忘记Dispose()
欢呼