2013-04-06 106 views
0

假设我使用DrawImage几次绘制一组图像。如何从图形中删除图像

e.Graphics.DrawImage(newImage, destRect);

如何删除从图形纸,我画了一个具体的形象? 是否有可用于删除的特定功能?

我试过disposeRectangle.Empty,但是他们实际上并没有删除我已经在纸上画的图像。

+3

删除,你的意思是重绘之前有什么,或只是用纯色覆盖?一旦你在图形上画了一些东西,它下面的东西就消失了。 – 2013-04-06 00:59:34

+0

嗯,我正在寻找一种方法来删除矩形。我正试图实现一个游戏突破游戏,我有一个球,桨和一堆砖。一旦球击中砖块,砖块(矩形)应该被移除。我已经把球从砖块上弹起来了,我正试图想出一种方法来永久地移除每一块砖块,这样球就不会从空间中回弹。 – krikara 2013-04-06 01:02:38

+0

“Graphics”对象没有“删除”的概念。您必须重新绘制砖背后的背景来自其他来源。 – 2013-04-06 01:08:05

回答

1

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

  1. 确保您的窗体或用户控件都有DoubleBuffered属性设置为True。这将导致比其他方式更平滑的动画。

  2. 永远不会调用CreateGraphics()来获得对绘图循环中Graphics对象的引用。更新您的循环中的对象和状态列表,然后在控件/表单上调用Invalidate(),并在Paint事件中执行绘制过程。

  3. Invalidate()的一个重载允许您指定需要失效(重绘)的矩形。您可以在弹跳球的当前位置周围传递一个“安全”矩形(比球大小宽20个像素)作为填充,然后在您的Paint事件中仅绘制该部分。

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

+0

对于撞击砖块的球有什么建议?你会使用Rectangle.Empty并再次使用DrawImage吗? – krikara 2013-04-06 15:31:26

+0

不知道我是否正确理解你。你的意思是如何检查命中测试?这与获取砖矩形和球矩形的交点('Rectangle.IntersectsWith()')一样简单。 – dotNET 2013-04-06 16:36:23

+0

是的,我目前正在使用相交。但除了下面的程序,我没有看到除砖之外的其他选项。 – krikara 2013-04-06 17:37:44

1

krikara,你应该做的是:

  1. 跟踪所有的砖在列表
  2. 当球击中砖,从列表中删除该砖

每框架,您必须从头开始重绘所有内容。这包括球,桨和砖的列表(以及其他任何你需要的东西,比如比分等)。

希望这可以消除你的困惑。

+0

是的,这是目前我正在处理的。 – krikara 2013-04-06 15:32:22