移动图片框中的透明图像

本文关键字:透明 透明图 图像 移动 | 更新日期: 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()

欢呼