2011-01-20 5 views
3

나는 C# windows 폼 응용 프로그램에서 폭격 범 게임을 만들고 있습니다. 패널 위에 300 개가 넘는 그림 상자 (벽)가 있습니다. 봄버맨 자신의 그림 상자도 그 패널에 있습니다.C# 새로 고치라고 할 때 PictureBox/Panel 만 새로 고칩니다.

폭탄 그림 상자의 위치가 변경되면 패널의 모든 컨트롤이 자동으로 새로 고쳐집니다. 이 패널에는 너무 많은 컨트롤이 있고 그림 상자의 위치가 초당 여러 번 변경되기 때문에 이동하려고하면 프로그램이 느려집니다.

새로 고쳐야하는 pictureboxes 만 프로그래밍 방식으로 새로 고칠 때 내 문제가 해결 된 것 같아서 패널의 새로 고침 이벤트 (및 컨트롤)를 제어하려고합니다.

나는 누군가가 나를 도울 수 있기를 바랍니다.

Ruud.

+1

그림 상자를 사용하지 마십시오. 폼의 OnPaint() 메서드를 재정의하고 e.Graphics.DrawImage()를 사용하여 벽을 그립니다. –

답변

0

자녀를 이전하는 경우 이전에 자녀가 있던 곳을 그리어야 할 수 있으므로 부모를 새로 고쳐야합니다. 또한 모든 부모 (부모)의 자녀들이 새로워지는 것을 의미합니다.

OTH, 너무 많은 컨트롤을 사용하면 좋은 생각이 아닐 수 있습니다. 벽을 묘사하는 데이터 구조를 유지 한 다음 Panel (또는 사용자 정의 컨트롤) 내에서 벽을 그리는 데 사용하는 것이 좋습니다. Panel/Parent 레벨에서 마우스/키보드 이벤트를 캡처하여 히트 테스트 (벽 경계 내에서 마우스 또는 키보드 클릭)에 대한 논리를 작성할 수 있습니다. 올바른 조직 데이터 구조를 사용하면 적중 테스트가 매우 효율적일 수 있습니다.

+0

마지막 단락에 인수가 없습니다. –

0

확실하게 시간이 걸리는 전체 양식을 페인트하려고합니다. 경우에 따라 Bomberman을 새 위치로 이동하는 폼의 일부만을 변경하려면 다시 그리려는 영역 만 무효화 한 다음 Invalidate 메서드에 전달합니다.

이와 비슷한 작업을 수행하십시오. 확실하지만 뭔가를해야만 유사한 광택 코드가 작동 할

//Invalidate previous position of bomberman 
Rectangle invalid = new Rectangle(picturebox1.Location.x,picturebox1.Location.y,picturebox1.Width,picturebox1.Height); 
Invalidate(invalid); 
//Add code to move your picture box and then call above two lines again 
invalid = new Rectangle(picturebox1.Location.x,picturebox1.Location.y,picturebox1.Width,picturebox1.Height); 
Invalidate(invalid); 

주 ... 여기

참조에 대한 예제에 대한 링크입니다. http://msdn.microsoft.com/en-us/library/ms229628.aspx

+0

이것은 코드를 전혀 작성하지 않고 자동으로 이미 발생합니다. –

+0

@ 한자 Passant. 나는 당신이 컨트롤을위한 새로운 위치를 지정할 때 다시 그리기가 자동으로 행해지지만 그것에 대해 잘 모르겠다는 느낌이 들었다. –

관련 문제