C# 如何从图形中删除图像

C# 如何从图形中删除图像,c#,image,graphics,C#,Image,Graphics,假设我多次使用DrawImage来绘制一组图像 e.Graphics.DrawImage(newImage,desect) 如何从绘制图像的图纸中删除特定图像? 是否有特定的功能可用于删除 我尝试了dispose和Rectangle.Empty,但他们实际上并没有删除我在纸上画的图像。krikara,你应该做的是: 跟踪列表中的所有砖块 当球碰到砖块时,从列表中删除该砖块 每一帧,你都必须从头开始重画。这包括球、桨和砖块列表(以及你需要的任何东西,如分数等) 希望这能消除您的困惑。首先,GDI+

假设我多次使用DrawImage来绘制一组图像

e.Graphics.DrawImage(newImage,desect)

如何从绘制图像的图纸中删除特定图像? 是否有特定的功能可用于删除


我尝试了
dispose
Rectangle.Empty
,但他们实际上并没有删除我在纸上画的图像。

krikara,你应该做的是:

  • 跟踪列表中的所有砖块
  • 当球碰到砖块时,从列表中删除该砖块
  • 每一帧,你都必须从头开始重画。这包括球、桨和砖块列表(以及你需要的任何东西,如分数等)


    希望这能消除您的困惑。

    首先,GDI+图形中没有“删除对象”的概念。您必须在每个帧中重新绘制整个客户端区域。您应该在内存中保留对象及其状态的列表,并在每一帧中重新绘制整个曲面。不过要小心,这可能会导致闪烁,用户体验也不那么流畅。以下是一些避免这些问题的提示:

  • 确保窗体或UserControl的
    双缓冲
    属性设置为True。这将产生比其他方式更平滑的动画

  • 永远不要调用
    CreateGraphics()
    ,以获取对图形循环中图形对象的引用。更新循环中的对象和状态列表,然后在控件/窗体上调用
    Invalidate()
    ,并在
    Paint
    事件中执行绘图过程

  • Invalidate()
    的一个重载允许您指定需要作废(重画)的矩形。您可以在弹跳球的当前位置周围传递一个“安全”矩形(例如比球的大小宽/高20像素),作为一个图形,然后在
    绘制
    事件中仅绘制该部分

  • 为了进一步提高性能,您可以将分数、玩家姓名等辅助信息保留在实际“游戏板”之外,并使用普通标签/文本框代替绘图


  • “删除”是指重新绘制以前的内容,还是仅用纯色覆盖?一旦你在图形上画了一些东西,下面的东西就不见了。我正在寻找一种方法来删除矩形。我正在尝试实现一个突破游戏,我有一个球,桨,和一堆砖头。一旦球碰到砖块,砖块(矩形)就应该被移除。我已经让球从砖块上弹下来了,我正试图找出一种方法来永久地移除每个砖块矩形,这样球就不会从空白处反弹。对于
    图形
    对象,没有“移除”的概念。你必须重新绘制砖块后面的背景,这只是一张“纸”,没有可以移除的物体。你对球击中砖块有什么建议?你会使用矩形。空并再次使用DrawImage吗?不确定我是否理解正确。你是说如何检查命中测试?这很简单,只需取砖矩形和球矩形的交点(
    Rectangle.IntersectsWith()
    ),是的,我目前使用的是与相交。但是除了下面的过程之外,我看不到任何其他移除砖块的选项。您可以在砖块类中保留一个名为
    Visible
    的bool属性或其他内容,并在命中后将其转换为
    False
    。然后在
    绘制中
    代码只能绘制可见的砖块。除了
    IntersectsWith()
    之外,您还可以在命中测试中使用相同的属性。