Flackernarmes Bewegen von Bildern über Form

  • VB.NET
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von M-Stef.

    Flackernarmes Bewegen von Bildern über Form

    Grüss euch Community :)

    Dies ist mein erster Post, aber ich will direkt zur Sache kommen.
    Ich habe da ein Problem. Ich will mittels vb.net ein einfaches Spiel programmieren. Eine Figur, die sich durch die Landschaft bewegen kann in X und Y Richtung.
    (Und ja ich weiss, dass VB.NET nicht so ideal ist um ein Spiel zu machen, aber ich liebe die Herausforderung ;) )

    Klingt erstmal nicht spektakulär. Die Probleme aber, sind nicht ohne.
    Ich habe für die Bewegung der Figur verschiedene Bilder, die nach und nach gezeichnet bzw. wieder entfernt werden. Dadurch entsteht der Eindruck, dass sich die Figur bewegt.

    Der grosse Vorteil des direkten zeichnen auf die Form gegenüber einem Bild in der Picturebox ist ganz klar, dass wenn man ein anderes Objekt kreuzt, nicht der "unsichtbare" Hintergrund der Picturebox zu sehen ist.
    Das Problem ist aber, dass das Bild nicht flüssig ist, sondern ein bisschen flackert. Weiss jemand, wie man das minimieren bzw. ganz vermeiden kann?

    Ich erstelle sie im Form.paint event.

    Ich wäre wirklich Froh, wenn mir jemand helfen könnte. Danke im Voraus! :)

    Falls jemand nicht weiss für was das invalidate ist -> es dient dazu, die Form neu zu zeichnen. Und weil ich nicht will, dass alles wie wild flackert, zeichne ich nur das Rechteck neu, welches mein Objekt enthält.
    Hier noch der Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. End Sub
    4. Dim i As Integer = 0
    5. Dim i2 As Integer = 0
    6. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    7. e.Graphics.DrawImage(My.Resources.visual_studio, 100, 100, 100, 100)
    8. 'e.Graphics.DrawImage(My.Resources.visual_studio, 100, 0, 50, 50)
    9. If richtung = 0 Then
    10. e.Graphics.DrawImage(My.Resources.indi0, 0 + (i * 10), 0 + (i2 * 10), 80, 100)
    11. Else
    12. If switchfigur = False Then
    13. If richtung = 1 Then
    14. e.Graphics.DrawImage(My.Resources.indi1, 0 + (i * 10), 0 + (i2 * 10), 80, 100)
    15. ElseIf richtung = 2 Then
    16. e.Graphics.DrawImage(My.Resources.indi3, 0 + (i * 10), 0 + (i2 * 10), 80, 100)
    17. Else
    18. e.Graphics.DrawImage(My.Resources.indi1, 0 + (i * 10), 0 + (i2 * 10), 80, 100)
    19. End If
    20. Else
    21. If richtung = 1 Then
    22. e.Graphics.DrawImage(My.Resources.indi2, 0 + (i * 10), 0 + (i2 * 10), 80, 100)
    23. ElseIf richtung = 2 Then
    24. e.Graphics.DrawImage(My.Resources.indi4, 0 + (i * 10), 0 + (i2 * 10), 80, 100)
    25. Else
    26. e.Graphics.DrawImage(My.Resources.indi2, 0 + (i * 10), 0 + (i2 * 10), 80, 100)
    27. End If
    28. End If
    29. End If
    30. End Sub
    31. Private Sub gehnachrechts()
    32. Me.Invalidate(New Rectangle(New Point(0 + (i * 10), 0 + (i2 * 10)), New Size(90, 100)))
    33. i += 1
    34. End Sub
    35. Dim richtung As Integer = 0
    36. Private Sub Button1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
    37. richtung = 1
    38. Timer1.Enabled = True
    39. End Sub
    40. Private Sub gehnachlinks()
    41. i -= 1
    42. Me.Invalidate(New Rectangle(New Point(0 + (i * 10), 0 + (i2 * 10)), New Size(90, 100)))
    43. End Sub
    44. Private Sub gehnachoben()
    45. i2 -= 1
    46. Me.Invalidate(New Rectangle(New Point(0 + (i * 10), 0 + (i2 * 10)), New Size(80, 110)))
    47. End Sub
    48. Private Sub stehenbleiben()
    49. Me.Invalidate(New Rectangle(New Point(0 + (i * 10), 0 + (i2 * 10)), New Size(80, 110)))
    50. Timer1.Stop()
    51. End Sub
    52. Private Sub gehnachunten()
    53. Me.Invalidate(New Rectangle(New Point(0 + (i * 10), 0 + (i2 * 10)), New Size(80, 110)))
    54. i2 += 1
    55. End Sub
    56. Dim switchfigur As Boolean = False
    57. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    58. If richtung = 1 Then 'rechts
    59. gehnachrechts()
    60. ElseIf richtung = 2 Then 'linkgs
    61. gehnachlinks()
    62. ElseIf richtung = 3 Then 'oben
    63. gehnachoben()
    64. ElseIf richtung = 4 Then 'unten
    65. gehnachunten()
    66. ElseIf richtung = 0 Then 'unten
    67. stehenbleiben()
    68. End If
    69. If switchfigur = False Then
    70. switchfigur = True
    71. Exit Sub
    72. End If
    73. If switchfigur = True Then
    74. switchfigur = False
    75. Exit Sub
    76. End If
    77. End Sub
    78. Private Sub Button1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseUp
    79. richtung = 0
    80. 'Timer1.Enabled = False
    81. End Sub
    82. Private Sub Button2_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button2.MouseDown
    83. richtung = 2
    84. Timer1.Enabled = True
    85. End Sub
    86. Private Sub Button2_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button2.MouseUp
    87. richtung = 0
    88. ' Timer1.Enabled = False
    89. End Sub
    90. Private Sub Button3_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button3.MouseDown
    91. richtung = 3
    92. Timer1.Enabled = True
    93. End Sub
    94. Private Sub Button3_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button3.MouseUp
    95. richtung = 0
    96. ' Timer1.Enabled = False
    97. End Sub
    98. Private Sub Button4_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button4.MouseDown
    99. richtung = 4
    100. Timer1.Enabled = True
    101. End Sub
    102. Private Sub Button4_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button4.MouseUp
    103. richtung = 0
    104. ' Timer1.Enabled = False
    105. End Sub
    106. End Class
    Bilder
    • bild1.PNG

      33,33 kB, 426×443, 181 mal angesehen
    • Bild2.PNG

      33,11 kB, 402×467, 175 mal angesehen
    • bild_bewegung_bilder.PNG

      34,11 kB, 1.227×442, 167 mal angesehen
    • bild3.PNG

      29,03 kB, 473×467, 156 mal angesehen
    "Die menschliche Vorstellungskraft ist unendlich"
    ->Versuch dir mal 'ne neue Farbe auszudenken!

    Mit Schleifen kann man alles lösen!

    Dim d as Double = 1
    Do until d = 0
    d = (d / 2)
    Loop

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „M-Stef“ ()

    Setze die (protected) Eigenschaft DoubleBuffered der Form auf true. Am besten im Konstruktor.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    WOW, hätte nicht gedacht, dass sich das Problem so schnell lösen lässt!

    Vielen Dank 'Arby' :thumbup:
    "Die menschliche Vorstellungskraft ist unendlich"
    ->Versuch dir mal 'ne neue Farbe auszudenken!

    Mit Schleifen kann man alles lösen!

    Dim d as Double = 1
    Do until d = 0
    d = (d / 2)
    Loop