Benutzer mit den meisten Antworten
Wie drehe ich die Ausgabe eines Form paint Events einer if Anweisung in ein Gegenteil um?

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.
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.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
- Bearbeitet Stefan Mihael Rihar Dienstag, 27. April 2021 16:54 not actual any longer and not composed with an, hm, additional me
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- Als Antwort vorgeschlagen Peter Fleischer Samstag, 3. März 2018 09:54
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 15. März 2018 10:17
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 -
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- Als Antwort vorgeschlagen Peter Fleischer Samstag, 3. März 2018 09:54
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 15. März 2018 10:17
-
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.