【问题标题】:Moving a transparent image in a picturebox在图片框中移动透明图像
【发布时间】:2014-04-26 03:20:52
【问题描述】:

对于一个项目,我正在制作一个游戏,其中有一个滚动地图。地图左右移动并在图片框中重新绘制,以便我可以在小图片框中拥有大地图。地图的顶部是透明的,因此我可以稍后更改天空颜色。但是,当我移动地图时,透明部分会出现故障。

Original map before moving

After moving the map a bit

如您所见,树线上方的所有内容都被拉伸了,这是因为这是透明度开始的地方。图片框的父级是窗体,窗体是浅蓝色的,这就是为什么背景是浅蓝色的。

这是我将图片移动/重绘到图片框的代码:

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;                 
        }      
    }
}

谁能帮忙解释一下这个故障?

【问题讨论】:

    标签: c# transparency picturebox


    【解决方案1】:

    尝试在调用g.DrawImage() 之前使用您的天空颜色调用g.Clear()。我认为它只是在自身之上绘制,这导致了拖尾。

    【讨论】:

      【解决方案2】:

      在我看来,您似乎在一遍又一遍地重绘,而没有清除上一次绘制的显示!您使用什么类型的框架来开发它?它有自定义绘图类吗?正如 tesserex 建议的那样,更具体地调用 g.Clear() 并且你会没事的。

      【讨论】:

        【解决方案3】:

        在这种情况下,您不需要g.Clear,因为您每次都在重新绘制新图像。

        我敢打赌 imageX 大于 (imageWidth - pbMap.Width) 所以它不会进入 IF,因此它会重绘和以前一样。

        注意:我不知道你是如何创建g的,但如果你使用.CreateGraphics(),别忘了Dispose()

        干杯

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-08
          • 2019-06-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多