C# 在picturebox中移动透明图像

C# 在picturebox中移动透明图像,c#,transparency,picturebox,C#,Transparency,Picturebox,对于一个项目,我正在制作一个游戏,其中有一个滚动地图。地图向左和向右移动,并在一个图片框中重新绘制,这样我就可以在一个小图片框中有一个大地图。地图的顶部是透明的,这样我以后可以改变天空的颜色。但是,当我移动贴图时,透明部分会出现小故障 正如您所看到的,树线上方的所有内容都会被拉伸,这是因为这是透明度的起点。picturebox的父对象是窗体,窗体为浅蓝色,这就是背景为浅蓝色的原因 以下是我将图片移动/重新绘制到picturebox上的代码: private void timerTick_Ti

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

正如您所看到的,树线上方的所有内容都会被拉伸,这是因为这是透明度的起点。picturebox的父对象是窗体,窗体为浅蓝色,这就是背景为浅蓝色的原因

以下是我将图片移动/重新绘制到picturebox上的代码:

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;                 
        }      
    }
}
private void timerTick_Tick(对象发送方,事件参数e)
{
move();
//绘制地图的新部分
g、 DrawImage(图像,新矩形(0,0,pbMap.Width,pbMap.Height),新矩形(imageX,imageY,pbMap.Width,pbMap.Height),GraphicsUnit.Pixel);
//刷新
pbMap.Image=bmp;
}
私人空位移动()
{
//右箭头事件
如果(右)
{
imageX+=mapSpeed;
//确保图片保持在边框内
if(imageX>=(imageWidth-pbMap.Width))
{
imageX=imageWidth-pbMap.Width;
}         
}
//左箭头事件
如果(左)
{
imageX-=地图速度;
//确保图片保持在边框内

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

尝试调用
g.Clear()
在调用
g.DrawImage()
之前使用天空颜色。我认为它只是在自身顶部绘制,这导致了涂抹。

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

我敢打赌,imageX大于(imageWidth-pbMap.Width),因此它不会进入(如果),因此它会像以前一样重新绘制

注意:我不知道如何创建g,但是如果使用
.CreateGraphics()
请不要忘记
Dispose()

干杯