假设我多次使用 DrawImage 来绘制一堆图像。
e.Graphics.DrawImage(newImage, destRect);
如何从我绘制的图形纸中删除特定图像?是否有可以用于删除的特定功能?
我试过dispose
and Rectangle.Empty
,但他们实际上并没有删除我已经在纸上画的图像。
krikara,你应该做的是:
每一帧,你都必须从头开始重绘一切。这包括球、桨和积木列表(以及您需要的任何其他内容,例如得分等)
希望这可以消除您的任何困惑。
首先,GDI+ Graphics 中没有“删除对象”的概念。您必须在每一帧中重新绘制整个客户区。您应该在内存中保留对象及其状态的列表,并在每一帧中重绘整个表面。但请注意,这可能会导致闪烁和不那么流畅的用户体验。以下是避免这些情况的一些提示:
确保您的 Form 或 UserControl 的DoubleBuffered
属性设置为 True。这将产生比其他方式更平滑的动画。
永远不要调用CreateGraphics()
在绘图循环中获取对 Graphics 对象的引用。更新循环中的对象和状态列表,然后调用Invalidate()
控件/表单并在Paint
事件中执行绘图过程。
的一个重载Invalidate()
允许您指定需要无效(重绘)的矩形。您可以在弹跳球的当前位置(例如比球大小宽/高 20 像素)周围传递一个“安全”矩形作为 agrument,然后在您的Paint
事件中仅绘制该部分。
为了进一步提高性能,您可以将分数、玩家姓名等辅助信息保留在实际“游戏板”之外,并为它们使用普通标签/文本框而不是绘图。