none
Wie drehe ich die Ausgabe eines Form paint Events einer if Anweisung in ein Gegenteil um? RRS feed

  • Frage

  • Ich übe Animationen zu programmieren mit dem Form Paint Event. Meine Logik reicht mit meinem Wissen leider nicht aus. So komm ich über die Anfangsschwierigkeit schon nicht hinaus. Mit dem Timer Event gelang es mir zwei Striche des Paint Events in einer Richtung ausgeben zu lassen. Ich würde nun gerne diese Möglichkeit auch noch in das erste Bild der aktive Formlaufzeit ändern. Es folgt der Code einer 300 x 300 Form mit einem Timer.

    Public Class Form1 Dim X As Integer = 150 Dim Y As Integer = 100 Dim rechtsOben As Integer = 250 Dim rechtsUnten As Integer = 100 Dim sonnenUntergang As Integer = 50 Dim sonnenAufgang As Integer = 100 Dim linksOben As Integer = 100 Dim linksUnten As Integer = 100 Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load Timer1.Start() DoubleBuffered = True CenterToScreen() End Sub Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick If X < 200 Then X += 1 'Else : While (X > 150) ' X -= 1 ' End While End If If linksOben < 150 Then linksOben += 1 'Else : While (linksOben > 100) ' linksOben -= 1 ' End While End If Invalidate() End Sub Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) _

    Handles Me.Paint e.Graphics.DrawLine(New Pen(Color.Black, 3), X, Y, rechtsOben, rechtsUnten) e.Graphics.DrawLine(New Pen(Color.Black, 3), sonnenUntergang, sonnenAufgang, _

    linksOben, linksUnten) End Sub End Class

    Mit der Else : While Verzweigung im Timer Event als ein Kommentar eingefügt ist es möglich den Vorgang um zu kehren. Nur leider Sprunghaft. Ich wünsche mir den Vorgang der If Anweisung in der selben Geschwindigkeit und auch (OR)Pixel für Pixel.
    • Bearbeitet Stefan Mihael Rihar Dienstag, 27. April 2021 16:54 not actual any longer and not composed with an, hm, additional me
    Mittwoch, 28. Februar 2018 17:34

Antworten

  • Hi Stefan,
    nutze eine Schrittweite, die entweder positiv (Vergrößerung) oder negativ (Verkleinerung) ist. Die Schrittweite schaltest Du beim Erreichen der Grenzen einfach um:

      Dim schritt As Integer = 1
      Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
        If linksOben < 100 Then
          schritt = 1
        ElseIf linksOben > 200 Then
          schritt = -1
        End If
        X += schritt
        linksOben += schritt
        Invalidate()
      End Sub


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 28. Februar 2018 19:36

Alle Antworten

  • Hallo,

    ein Timer Tick Event ist immer ungenau und das sieht man dann bei einer Animation. Für eine flüssige Animation braucht man eine Funktion die Anhang der vergangenen Zeit berechnet welchen Fortschritt man erreicht hat. Als beispiel eine lineare Funktion in C#

    static double LinearTween(double time, double startValue, double endValue, double duration)
    {
        time /= duration;
        return endValue * time * time + startValue;
    }

    Bei jedem Tick übergibt man als ersten Parameter die gesamt verstrichene Zeit in ms. Der zweite und dritte Parameter ist die Entfernung die zurück gelegt werden muss, z.B 0 und 100. Der vierte Parameter ist die ist die Gesamtzeit der Animation.

    Mehr Funktionen findest Du z.B. hier link


    Gruß Thomas
    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
    Dev Apps von mir: Icon für UWP,  UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    Mittwoch, 28. Februar 2018 17:58
  • Hi Stefan,
    nutze eine Schrittweite, die entweder positiv (Vergrößerung) oder negativ (Verkleinerung) ist. Die Schrittweite schaltest Du beim Erreichen der Grenzen einfach um:

      Dim schritt As Integer = 1
      Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
        If linksOben < 100 Then
          schritt = 1
        ElseIf linksOben > 200 Then
          schritt = -1
        End If
        X += schritt
        linksOben += schritt
        Invalidate()
      End Sub


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 28. Februar 2018 19:36
  • Hallo Peter. Deine Antwort hat mich an mein Ziel geführt. Ich habe folgenden Code verwendet und mein Ziel erreicht. Danke.

        Dim schritt As Integer = 1
    
        Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
            If X < 100 Then
                schritt = 1
            ElseIf X > 200 Then
                schritt = -1
            End If
            If linksOben < 100 Then
                schritt = 1
            ElseIf linksOben > 200 Then
                schritt = -1
            End If
            X += schritt
            linksOben += schritt
            Invalidate()
        End Sub

    Ich werde noch eine weile brauchen um den Code genau studieren zu können.

    Die Antwort von Thomas war auch hilfreich obwohl ich sie nicht als Hilfe markiert habe, den wenn ich ein wenig Zeit für meine Arbeiten finden kann werde ich mich wieder auf C++ oder C# stürzen.

    Donnerstag, 1. März 2018 17:00