2011-12-13 3 views
2

내가 별도의 그리기 루틴을 사용하고 있기 때문에 다음 명령VB.NET 더블 버퍼링

Public Sub New() 
     … 
    Me.SetStyle(ControlStyles.DoubleBuffer, True) 
End Sub 

를 사용하여 공간 침략자 게임 VB.NET GDI +에서 일하는 이중 버퍼 기능을 얻으려고 노력하지만 봤는데 클래스에 연결이 작동하지 않습니다

Class alien 
    … 
    Public Sub draw(ByVal palette) 
     Dim image As New Drawing.Bitmap("E:\alien.gif") 
     palette.DrawImage(image, loc.X, loc.Y, width, height) 
    End Sub 
End class 

을 내가 기본 폼에 타이머에서이 루틴을 호출

Private Sub TmrAlien_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles TmrAlien.Tick 
    Dim palette As Drawing.Graphics = Me.CreateGraphics 

    dave.draw(palette) 
    Invalidate() 
End sub 

외계인이 올바르게 그으나 이미지가 매우 불안정하고 이중 버퍼링이 작동하지 않는 것 같습니다.

모든 아이디어

답변

3

문제는 귀하의 Tick 이벤트 처리기에 있습니다. CreateGraphics()에 의해 반환 된 Graphics 객체를 사용한 그리기는 결코 이중 버퍼링되지 않습니다. Invalidate()를 호출하면 깜박임이 발생하여 양식이 다시 그려지고 draw() 메소드에서 그렸던 것을 덮어 씁니다. 잠시 외계인을 보게 될 것입니다. 이 같은

수정을 :

Public Sub New() 
     … 
    Me.DoubleBuffered = True 
End Sub 

Private Sub TmrAlien_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles TmrAlien.Tick 
    '' Change dave.Loc 
    ''... 
    Invalidate() 
End sub 

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 
    dave.draw(e.Graphics) 
    MyBase.OnPaint(e) 
End Sub 
+0

감사합니다. 이것은 의미가 있습니다. – pluke

+0

CreateGraphics()를 사용하지 말 것을 제안 해 주셔서 감사합니다. 그것은 내 문제에도 도움이되었습니다. –