2013-04-06 176 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