Klasse instanzieren und auf Formular zeichnen

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Klasse instanzieren und auf Formular zeichnen

    Guten Tag,

    ich hätte da mal eine Frage und hoffe, dass mir jemand ein paar Tipps geben kann.

    Ich schreibe momentan ein einem Spiel. Nun möchte ich, dass in bestimmten Situationen eine "Explosion" ausgelöst wird.

    Die Explosion habe ich als Klasse geschrieben:

    VB.NET-Quellcode

    1. Public Class Explosion
    2. Private WithEvents FrameCount As Timer
    3. Private _ListPOINT As New List(Of Point)
    4. Private _IMGCOL As New List(Of Image)
    5. Private StartFrame As Integer = 0
    6. Public Sub New(ByVal x As Integer, ByVal y As Integer)
    7. _ListPOINT.Add(New Point(x, y))
    8. For i as Integer = 1 to 8 'Bilder sind von 1 bis 8 nummeriert
    9. _IMGCOL.Add(Image.FromFile(Application.StartupPath & "\graphics\sprites\Explode_" & CStr(i) & ".bmp", True))
    10. Next
    11. FrameCount = New Timer
    12. With FrameCount
    13. .Interval = 200
    14. .Start()
    15. End With
    16. End Sub
    17. Private Sub Draw()
    18. Dim g as Graphics = Form1.CreateGraphics
    19. g.DrawImage(_IMGCOL(StartFrame - 1), _ListPOINT(0))
    20. End Sub
    21. Private Sub FrameCount_Tick() Handles FrameCount.Tick
    22. If StartFrame >= 7 Then
    23. FrameCount.Stop()
    24. FrameCount.Dispose()
    25. End If
    26. StartFrame += 1
    27. Draw()
    28. End Sub
    29. End Class




    Nun wird es auch schön gezeichnet, allerdings flackert es wie sau. Nur fällt mir keine andere Möglichkeit ein, direkt im Paint-Event des Formulars zu zeichnen, da ja jede Explosion anders bezüglich ihres Instanzierungs-Zeitraumes dargestellt werden soll.



    Weiß jemand Rat?



    Mit freundlichen Grüßen, eXpire

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „eXpire“ ()

    Stell mal deine Form auf DoubleBuffered = True

    Eventuell verschafft das Abhilfe...

    LG
    Habe ich schon ganz am Anfang gemacht. Ist ja so, alles was ich direkt im Paint-Event zeichne, funktioniert einwandfrei ohne zu flackern.

    Aber arbeite ich außerhalb des Paint-Events mit "CreateGraphics", wird alles was damit gezeichnet wird, "flackernd" dargestellt.
    So, habe es jetzt hinbekommen.

    Zeichne jetzt alles im Paint-Event des Formulars, wo ich vorher eine List(Of Explosion) erstelle. Dann kann man ja ganz einfach auf die Werte zugreifen.

    Hier noch der Code der Klasse "Explosion"

    VB.NET-Quellcode

    1. Public Class Explosion
    2. Private WithEvents FrameCount As Timer
    3. Private _ListPOINT As PointPublic _IMGCOL As New List(Of Image)
    4. Public StartFrame As Integer = 0
    5. Public ReadOnly xPos As Integer
    6. Public ReadOnly yPos As Integer
    7. Public Sub New(ByVal x As Integer, ByVal y As Integer)
    8.  
    9. xPos = x
    10. yPos = y_ListPOINT = New Point(x, y)
    11. For i as Integer = 1 to 8 'Bilder sind von 1 bis 8 nummeriert
    12. _IMGCOL.Add(Image.FromFile(Application.StartupPath & "\graphics\sprites\Explode_" & CStr(i) & ".bmp", True))
    13. Next
    14. FrameCount = New Timer
    15. With FrameCount
    16. .Interval = 30
    17. .Start()
    18. End With
    19. End Sub
    20.  
    21. Private Sub FrameCount_Tick() Handles FrameCount.Tick
    22. If StartFrame >= 6 Then
    23. FrameCount.Dispose()
    24. _IMGCOL.Clear()
    25. FrameCount.Stop()
    26. End If
    27. StartFrame += 1
    28. End Sub
    29. End Class
    Hi
    Du könntest das ganze auch erst in einen Buffer zeichnen und anschließend auf das Graphics der Form übertragen. Die entsprechende Klasse heißt BufferedGraphics und wird mit BufferedGraphicsManager.Current.Allocate zur Verfügung gestellt (du kannst natürlich auch einen eigenen Context benutzen, aber der Standardcontext sollte ausreichen). Erst wird auf die Graphics-Eigenschaft der BufferedGraphics-Instanz zugegriffen, damit die Zeichnung erfolgen kann. Nach dem Zeichenvorgang kannst du das ganze mit der Render-Methode auf das von CreateGraphics zur Verfügung gestellte Graphics-Objekt zeichnen. Für die Verwendung sollten dir die vom IntelliSense bereit gestellten Informationen genügen.

    Gruß
    ~blaze~