2013-04-06 7 views
0

여러 이미지를 그리는 데 DrawImage를 몇 번 사용한다고 가정 해 보겠습니다.그래픽에서 이미지를 삭제하는 방법

e.Graphics.DrawImage(newImage, destRect);

어떻게 내가 그것을 그린 그래픽 용지에서 특정 이미지를 삭제할 수 있습니까? 삭제를 위해 사용할 수있는 특정 기능이 있습니까?

나는 disposeRectangle.Empty을 시도했지만 이미 종이에 그린 이미지는 실제로 삭제하지 않습니다.

은, 당신이해야 할 것은
+3

삭제하면 이전에 있었던 것을 다시 그리거나 단색으로 덮어 버리는 것을 의미합니까? 그래픽 위에 무언가를 그려 넣으면 그 밑에 있던 것은 무엇이든 사라집니다. –

+0

글쎄 사각형을 제거 할 방법을 찾고있었습니다. 나는 공, 패들, 그리고 벽돌을 가지고있는 게임 브레이크 아웃 게임을 구현하려고합니다. 공이 벽돌에 닿으면 벽돌 (직사각형)을 제거해야합니다. 나는 벌써 벽돌에서 튀어 오르는 공을 가지고 있으며 공이 공백에서 벗어나지 않도록 각 벽돌을 영구적으로 제거하는 방법을 찾아 내려고 노력 중이다. – krikara

+0

'Graphics' 객체로 "removed"라는 개념이 없습니다. 벽돌 뒤에있는 배경은 다른 곳에서 다시 그려야합니다. –

답변

1

우선 GDI + Graphics에서 "개체 삭제"개념이 없습니다. 모든 프레임에서 전체 클라이언트 영역을 다시 그려야합니다. 객체와 상태의 목록을 메모리에 보관하고 모든 프레임에서 전체 표면을 다시 그려야합니다. 그러나이 경우 깜박임과 부드럽 지 않은 사용자 경험이 발생할 수 있습니다.

  1. 확실히 당신의 형태를 만들거나 UserControl을 True로 설정된 DoubleBuffered 속성이 다음은이를 방지하기위한 몇 가지 도움말입니다. 이렇게하면 다른 것보다 훨씬 부드러운 애니메이션이 생성됩니다.

  2. 결코 그리기 루프에서 Graphics 개체에 대한 참조를 얻으려면 CreateGraphics()을 호출하면 안됩니다. 루프의 개체 및 상태 목록을 업데이트 한 다음 Invalidate()을 컨트롤/양식에 호출하고 드로잉 프로세스를 Paint 이벤트로 수행하십시오.

  3. 하나의 오버로드로 Invalidate()을 지정하면 무효화 (다시 그려야 함) 할 사각형을 지정할 수 있습니다. 진동하는 공의 현재 위치 (예 : 공 크기보다 20 픽셀 더 넓거나 큰 것)에서 "안전한"직사각형을 계측기로 전달한 다음 Paint 이벤트에서 해당 부분 만 그릴 수 있습니다.

  4. 성과를 더 높이려면 점수, 선수 이름 등의 보조 정보를 실제 "게임 게시판"외부에 유지하고 그리기 대신 일반 레이블/텍스트 상자를 사용할 수 있습니다.

+0

벽돌을 치는 공에 대한 귀하의 제안은 무엇입니까? Rectangle.Empty를 사용하고 DrawImage를 다시 사용 하시겠습니까? – krikara

+0

잘 이해하고 있는지 잘 모르겠습니다. 히트 테스트를 확인하는 방법을 의미합니까? 이것은 벽돌 직사각형과 공 사각형의 교차 ('Rectangle.IntersectsWith()')를 취하는 것만큼이나 간단합니다. – dotNET

+0

그래, 현재는 intersects를 사용하고 있습니다. 하지만 아래의 절차 외의 벽돌 제거에 대한 다른 옵션은 없습니다. – krikara

1

krikara입니다 :

  1. 공 벽돌을 명중 할 때, 목록
  2. 에있는 모든 벽돌을 계속 추적 목록에서 그 벽돌을 제거

모든 프레임에서 처음부터 모든 것을 다시 그려야합니다. 여기에는 공, 패들 및 벽돌 목록 (점수 등)이 포함됩니다.

혼란이 있었기를 바랍니다.

+0

이것은 현재 내가 작업하고있는 것입니다. – krikara

관련 문제