Bewegung in vb ( Timer )

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Bewegung in vb ( Timer )

    Moin zusammen

    ich möchte gern ein Blauen Punkt ( Picturebox ) um das Oval bewegen lassen weis aber nicht wie ich mit if abfrage den blauen Punkt um die jeweilige Kurve herum kommen kann es gibt zwar Tutorials drüber richtig es wird aber nicht gezeigt wie man um die kurve kommt.

    Es wäre sehr lieb von euch wenn ihr mir helfen könntet es wäre sehr schön mit Tipps und auch den ein oder anderen Ratschlag zu wissen um vllt mir auch zu zeigen was ich für ein Fehler gemacht habe.


    Lieben Gruß der Laie
    Bilder
    • Bewegung in vb mit Timer.JPG

      115,18 kB, 1.642×864, 192 mal angesehen
    • Bewegung in vb mit Timer.JPG

      115,18 kB, 1.642×864, 161 mal angesehen
    Hey,

    ich bitte dich, es bringt dir null wenn du mir 20 Minuten nach deiner Thread Erstellung eine Nachricht schreibst.
    Wenn jemand Zeit findet dann nimmt er sich diese und hilft dir dann.

    Zu deinem Problem: Wie sehen denn deine bisherigen versuche aus? Und was klappt dann nicht?
    Du schreibst ja das du da Tutorials gelesen hast, dann müsstest du ja schon etwas haben.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    Quellcode

    1. [vbnet]​
    2. Private Sub Timer1Zeit_Tick(sender As Object, e As EventArgs) Handles Timer1Zeit.TickPictureBox1.Location = New Point(PictureBox1.Location.X + 1, PictureBox1.Location.Y)If PictureBox1.Location = New Point(PictureBox1.Location.X + 315, PictureBox1.Location.Y) ThenPictureBox1.Location = New Point(PictureBox1.Location.X, PictureBox1.Location.Y - 2)End If End Sub
    3. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    4. Timer1Zeit.Enabled = True
    5. Timer1Zeit.Start()
    6. [/vbnet]
    Da ist aber nix ovales an der Laufbahn.
    Wenn man von der schiefgegangenen Codeformatierung absieht:

    Der Laie schrieb:

    If PictureBox1.Location = New Point(PictureBox1.Location.X + 315, PictureBox1.Location.Y)
    Wie soll PicBox1 jemals an einem Punkt X sein und gleichzeitig 315 Pixel weiter rechts? Wenn, dann definiere Dir feste Punkte, an denen sich das Bewegungsverhalten ändert und gestalte entsprechend den Code. Du könntest z.B. mit Enum bestimmte Bewegungsstatusangaben festlegen:

    VB.NET-Quellcode

    1. Private Enum MovementStatus
    2. FromLeftToRight
    3. DiagonalFromUpperLeftToLowerRight
    4. Down
    5. 'usw.
    6. End Enum

    Wobei das Enum ein Schönheitsfaktor ist. Du kannst auch nur angeben: CurrentMovement = 1 usw. und dieses dann im Timer_Tick auswerten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Der Laie Du brauchst 2 Gleichungen, die Dir die x- und y-Position als Funktion der Zeit berechnen.
    Bei einem Kreis sähe das so aus:

    VB.NET-Quellcode

    1. x = Sin(freq * t)
    2. y = Cos(freq * t)
    mit freq als Kreisfrequenz und t als Zeit.
    Damit das ganze darstellbar wird, musst Du da noch Faktoren und Offsets zur Darstellung einbringen:

    VB.NET-Quellcode

    1. x = x0 + Vx * Sin(freq * t)
    2. y = y0 + Vy * Cos(freq * t)
    x0 und y0 verschieben den Ursprung nach {x0, y0}, Vx und Vy strecken das Bild in der jeweiligen Achse auf diese Werte.
    Gilt: Vx = Vy, dann wird eine Kreisbahn dargestellt, ansonsten eine Ellipse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Der Laie: Sorry, aber auch ich bin niemand, der forenrelevante Fragen in ner Konversation erörtert. Und in 3 Konversationen zum selben Thema gleich 3x nicht.
    Wenn die Laufbahn tatsächlich oval ist, nimm die Berechnung in Rods Post. Und beachte seine Signaturaussage: "VB-Fragen über PN / Konversation werden ignoriert!"
    Wenn die Box dann doch eher ein paar gerade Strecken ablaufen soll, da eben wie gesagt: Die Box startet an einen von Dir festgelegten Punkt nach rechts aus. Dann nimm z.B. eine Zusatzvariable CurrentMovement As Integer = 0 hinzu.
    Dann im Timer:

    VB.NET-Quellcode

    1. Private Sub Timer1Zeit_Tick(sender As Object, e As EventArgs) Handles Timer1Zeit.Tick
    2. 'die End"punkte", an denen die Bewegung sich ändert
    3. Select Case CurrentMovement
    4. Case 0: If DeinePicBox.Left >= 386 Then CurrentMovement = 1
    5. Case 1: If DeinePicBox.Left >= 420 Then CurrentMovement = 2
    6. Case 2: If DeinePicBox.Left <= 386 Then CurrentMovement = 3
    7. 'usw.
    8. End Select
    9. 'die Bewegung in den einzelnen Fällen
    10. Select Case CurrentMovement
    11. Case 0: DeinePicBox.Left = DeinePicBox.Left + 2
    12. Case 1: DeinePicBox.Left = DeinePicBox.Left + 1: DeinePicBox.Top = DeinePicBox.Top + 1
    13. Case 2: DeinePicBox.Left = DeinePicBox.Left - 1: DeinePicBox.Top = DeinePicBox.Top + 1
    14. 'usw.
    15. End Select
    16. End Sub

    Das kann man alles noch viiieeel schöner und effizienter machen (Enum statt "kryptische Kennzahlen" des aktuellen Bewegungsstatus benutzen, beide Select-Cases zusammenfassen, alles in ne Klasse auslagern, variable Endpunkte, automatische Endpunkterkennung mithilfe der gezeichneten Linien, usw.), aber damit Du überhaupt mal einen Ansatz hast.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Deine Aufgaben: sichten, probieren, verstehen, anpassen, verbessern, ausbauen
    Und keine weiteren Konversationen starten.
    Dateien
    • WalkingPicBox.zip

      (19,8 kB, 126 mal heruntergeladen, zuletzt: )
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    xChRoNiKx hi du, stimmt da hast du recht sorry meine Fehler,

    hier der Code

    Quellcode

    1. [vbnet]​
    2. Public Class FrmMain
    3. Private Enum MovementStatus
    4. ToTheRight
    5. DiagonalToDownRight
    6. DiagonalToDownLeft
    7. ToTheLeft
    8. DiagonalToUpLeft
    9. DiagonalToUpRight
    10. End Enum
    11. Private CurrentMovement As MovementStatus = MovementStatus.ToTheRight
    12. Private PictureBoxIsMoving As Boolean = False
    13. Private Sub BtnToggleMovement_Click(sender As Object, e As EventArgs) Handles BtnToggleMovement.Click
    14. PictureBoxIsMoving = Not PictureBoxIsMoving
    15. If PictureBoxIsMoving Then
    16. UpdateMovementLabelText()
    17. BtnToggleMovement.Text = ";" 'Webdingszeichen Pause ||
    18. TmrPicBoxMovement.Start()
    19. Else
    20. BtnToggleMovement.Text = "4" 'Webdingszeichen Start >
    21. TmrPicBoxMovement.Stop()
    22. End If
    23. End Sub
    24. Private Sub TmrPicBoxMovement_Tick(sender As Object, e As EventArgs) Handles TmrPicBoxMovement.Tick
    25. Select Case CurrentMovement
    26. Case MovementStatus.ToTheRight : PicBox.Left += 2
    27. Case MovementStatus.DiagonalToDownRight : PicBox.Left += 1 : PicBox.Top += 1
    28. Case MovementStatus.DiagonalToDownLeft : PicBox.Left -= 1 : PicBox.Top += 1
    29. Case MovementStatus.ToTheLeft : PicBox.Left -= 2
    30. Case MovementStatus.DiagonalToUpLeft : PicBox.Left -= 1 : PicBox.Top -= 1
    31. Case MovementStatus.DiagonalToUpRight : PicBox.Left += 1 : PicBox.Top -= 1
    32. End Select
    33. Select Case CurrentMovement
    34. Case MovementStatus.ToTheRight : If PicBox.Left > 300 Then CurrentMovement = MovementStatus.DiagonalToDownRight : UpdateMovementLabelText()
    35. Case MovementStatus.DiagonalToDownRight : If PicBox.Left > 350 Then CurrentMovement = MovementStatus.DiagonalToDownLeft : UpdateMovementLabelText()
    36. Case MovementStatus.DiagonalToDownLeft : If PicBox.Left < 300 Then CurrentMovement = MovementStatus.ToTheLeft : UpdateMovementLabelText()
    37. Case MovementStatus.ToTheLeft : If PicBox.Left < 100 Then CurrentMovement = MovementStatus.DiagonalToUpLeft : UpdateMovementLabelText()
    38. Case MovementStatus.DiagonalToUpLeft : If PicBox.Left < 50 Then CurrentMovement = MovementStatus.DiagonalToUpRight : UpdateMovementLabelText()
    39. Case MovementStatus.DiagonalToUpRight : If PicBox.Left > 100 Then CurrentMovement = MovementStatus.ToTheRight : UpdateMovementLabelText()
    40. End Select
    41. End Sub
    42. Private Sub UpdateMovementLabelText()
    43. LblCurrentMovementStatus.Text = [Enum].GetName(GetType(MovementStatus), CurrentMovement)
    44. End Sub
    45. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    46. End Sub
    47. End Class
    48. [/vbnet]



    vllt könnt ihr mir Hilfestellung geben in der Dunkelheit

    LG
    Da das der komplette Code ist, der in dem von mir geschickten Projekt ist, ist das so sinnvoll wie wenn man fragt: "Was verstehst Du in gerade Mathematik nicht?" und man als Antwort erhält: "Alles!"
    Ich kann mir gerade nicht erklären, was an dem Code so unklar ist. Ohne konkrete Fragen hier in diesem Thread zu irgendwelchen konkreten Punkten im Code bin ich erstmal raus. Das ist mir hier zu fahrig/ziellos.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    hi du danke für die Antwort

    Quellcode

    1. ​[vbnet]​
    2. Select Case CurrentMovement
    3. Case MovementStatus.ToTheRight : If PicBox.Left > 300 Then CurrentMovement = MovementStatus.DiagonalToDownRight : UpdateMovementLabelText()
    4. Case MovementStatus.DiagonalToDownRight : If PicBox.Left > 350 Then CurrentMovement = MovementStatus.DiagonalToDownLeft : UpdateMovementLabelText()
    5. Case MovementStatus.DiagonalToDownLeft : If PicBox.Left < 300 Then CurrentMovement = MovementStatus.ToTheLeft : UpdateMovementLabelText()
    6. Case MovementStatus.ToTheLeft : If PicBox.Left < 100 Then CurrentMovement = MovementStatus.DiagonalToUpLeft : UpdateMovementLabelText()
    7. Case MovementStatus.DiagonalToUpLeft : If PicBox.Left < 50 Then CurrentMovement = MovementStatus.DiagonalToUpRight : UpdateMovementLabelText()
    8. Case MovementStatus.DiagonalToUpRight : If PicBox.Left > 100 Then CurrentMovement = MovementStatus.ToTheRight : UpdateMovementLabelText()
    9. End Select
    10. [/vbnet]



    If PicBox.Left < 300 Then: was bedeutet diese 300 und Picturebox.Left

    MovementStatus.ToTheRight : was bedeutet dieser Befehl

    MovementStatus.DiagonalToDownLeft : und dieser


    ich verstehe es zwar zun Teil aber mit Kommentaren wäre es schon mal eine kleine Leitlinie






    Quellcode

    1. ​[vbnet]​
    2. Private Enum MovementStatus
    3. ToTheRight
    4. DiagonalToDownRight
    5. DiagonalToDownLeft
    6. ToTheLeft
    7. DiagonalToUpLeft
    8. DiagonalToUpRight
    9. End Enum
    10. Was bedeutet dieser Codeblock
    11. wäre Lieb wenn du mir da ein paar Hilfestellung geben könntest
    12. LG
    13. [/vbnet]
    @Der Laie Wie würdest Du reagieren, wenn wir Dir so nen Code hinklatschen :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    X/
    Statt
    [ code ]
    [ vbnet ]
    Hier Dein Code
    [ /vbnet ]
    [ /code ]
    darfst Du nur einen Tag verwenden, nämlich den vbtag, also
    [ vbnet ]
    Hier Dein Code
    [ /vbnet ]

    Mit beiden Tags kommt es falsch raus, nämlich:

    Quellcode

    1. [vbnet]
    2. Hier Dein Code
    3. [/vbnet]


    Mit nur dem vb-Tag hingegen:

    VB.NET-Quellcode

    1. Hier Dein Code

    Und so soll es sein. Bitte editier Deine hiesigen Code-Posts entsprechend. Entferne also bitte die [code]-Tags und deren [/code-Pendants]

    ##########

    Zum Problem - auch wenn es so klingt, als ob Dir ewig viele Grundlagen fehlen:

    Der Laie schrieb:

    was bedeutet diese 300 und Picturebox.Left

    Wenn Du weißt, was PictureBox.Left bedeutet, wird auch die Bedeutung der 300 klar. Wenn Du Visual Studio benutzt, reicht es schon aus, wenn Du mit dem Mauszeiger drüberzeigst und es wird ne Hilfe dazu angezeigt, nämlich:

    Also quasi die X-Koordinate der PicBox. Oder noch einfacher ausgedrückt: Der Wert, wie weit vom linken Fensterrand die PicBox entfernt werden soll. Bei nem Wert von Null ist die PicBox also ganz links im Fenster, bei 1 ist sie 1 Pixel vom Rand entfernt. Bei 300 eben 300 Pixel. Den Wert selber hab ich einfach festgelegt. Er sagt: Wenn die PicBox 300 oder mehr Pixel vom linken Fensterrand entfernt ist, soll sie ihr Bewegungsverhalten ändern. Das aktuelle Bewegungsverhalten ist in der Variable CurrentMovement drin. Diese Variable nimmt nur einen Wert zwischen 0 und 5 an, also nix ominöses. Da das allerdings etwas kryptisch/unverständlich wäre, habe ich ganz zum Anfang den enum-Block reingesetzt. Legt man keine konkreten Werte in dem Enumblock fest, so wie ich es eben getan habe, ist der erste Wert = 0. ToTheLeft ist also festgelegt als Null. DiagonalToDownRight bekommt automatisch den Wert 1 und so weiter. Im Timer-Tick wird das eben ausgewertet und bestimmt, wohin die Reise für die PicBox geht. Ist CurrentMovement eben ToTheLeft, also Null, dann bewegt sich die PicBox 2 Pixel weiter nach rechts. Irgendwann tritt die Veränderungsbedingung im Timer ein, wenn die PicBox weit genug nach rechts gewandert ist, also PictureBox.Left >= 300 ist. Dann bekommt CurrentMovement den Wert DiagonalToDownRight, also 1 zugewiesen. Und wenn dieser Wert 1 ist, dann - wie es in der Timer-Tick-Sub steht, bewegt sich die PicBox nicht mehr 2 Pixel nach links, sondern 1 Pixel nach links und 1 Pixel runter (die Bedeutung von PictureBox.Top kannst Du nun selber recherchieren). Und so weiter.
    Noch genauer kann ich nicht. Und werd ich auch nicht. Das hier ist kein wir-bringen-Euch-VB-von-Grundauf-bei.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Bewegung in vb

    VaporiZed Moin

    Nun habe ich dir mal 3 Bilder Bilder eingefügt damit du sehen kannst warum ich dein Vorschlag gebraucht habe und warum ich mit deinem Programm arbeiten wollte was du mir geschickt hast, mit den Checkboxen möchte ich auf der Karte die jeweiligen Richtungen selber bestimmten klar kann ich mit deinen Programmbefehlen gewisse Routen voreinstellen wo jeweils meine Vierecke sich bewegen sollen nur mit den Checkboxen möchte ich halt die Richtungen der jeweiligen Vierecke beeinflussen.

    deswegen war meine Frage damit ich die Richtungen der Vierecke beeinflussen kann und diese dann ihre Richtung ändern via Checkbox und nicht vorgegebener Route, muss ich bestimmt die Bedienung in die Timerfunktion einbauen damit der Timer im richtigen mom die Picturebox ( Viereck ) umleiten kann in einer andere Richtung und nicht die Vorgeschrieben Richtung.

    deswegen muss ich wohl jede Bedienung und Veränderung in dem Select Case Timerblock dementsprechend wohl anpassen oder würdest du was anderes sagen ???


    Meine Zielidee ist es was du vllt sehen kannst auf dem Bild, das ich ein Modellstraßenverkehr nachbauen möchte und das die Autos wie in der Realität auf der Straße herumfahren mit abbiegen und teilweise voreingestellter Route

    LG Der Laie
    Bilder
    • Weichensteuerung Vorlage.JPG

      95,63 kB, 1.360×693, 137 mal angesehen
    • 25185107bx.jpg

      90,54 kB, 1.024×768, 121 mal angesehen
    • Straßenskizze.JPG

      144,39 kB, 1.670×1.007, 140 mal angesehen

    Der Laie schrieb:

    damit ich die Richtungen der Vierecke beeinflussen kann
    Das ist ein völlig falsches Datenmodell.
    Mach Dir eine Klasse, die Viereck, Auto, Waggon oder so heißt und die sich (die aktuelle Instanz) aufgrund der Daten, die erforderlich sind, selbst an der richtigen Position im richtigen Winkel malt.
    Zauberwörter dazu wären GraphicsPath und Matrix.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Könntest du evtl. genau sagen was unklar ist? Woran soll Rod nun bei 40 Fragezeichen wissen was du nicht verstehst?
    Rod hat dir doch super ein paar "Zauberwörter" gegeben die man evtl. ja mal nachschlagen kann.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen