Picturebox mit den Pfeiltasten flüssig bewegen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von TheGameSiders.

    Picturebox mit den Pfeiltasten flüssig bewegen

    Hi.

    Wie man eine Picturebox mit den Pfeiltasten bewegt weiss ich. Das geht auch.

    Nun hab ich ein Problem.

    Die X und Y Koordinate wird in einer Textbox gezeigt, und dass sofort wenn sich die Picturebox bewegt.

    Leider ist dieser Code schuld, dass ich die Picturebox nicht mehr gut bewegen kann, sondern sie "klemmt".

    VB.NET-Quellcode

    1. Dim txt As String = TextBox1.Text
    2. Dim result As String = txt.Split(CChar(" "))(0)
    3. Dim txt2 As String = TextBox1.Text
    4. Dim result2 As String = txt2.Split(CChar(" "))(1)
    5. PictureBox1.Location = New Point(result, result2)



    Das ist in einem Timer mit dem Interval 100.
    Wenn ich ihn auf 4000 stelle z.B. gehts in den 4 Sekunden flüssig, dann bleibt die Picturebox kurz an dem Punkt stehen, dann gehts weiter.
    Das ganze muss aber 1:1 übertragen werden, nicht alle 4 Sekunden oder sowas..

    Was kann ich da jetzt machen?

    Danke sehr!

    Mfg. TGS :)
    Wie Kinsi schon sagt, wenn du's anständig machen willst, nimm GDI.
    Ein Control mit dem Timer bewegen, naja..

    Hat sogar ein Tutorial: Ich mach's mit GDI!

    BTW: Schreib an die erste Zeile deiner Klasse "Option Strict On". Wieso? Weil du mit Strings rechnest und es dir korrekt vorkommt..

    Edit: Ist klar, dass wenn ich mal was schreib, dass mir zwei davorkommen.. :rolleyes:

    Greez Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Keydown/Up reagieren nicht nachdem ich z.B. einen Button gedrückt habe irgendwie.. Und es klemmt weil ich die Koordinaten in die Textbox schreibe und sie dort gleichzeitig wegnehme um die Location festzulegen.
    Wenn ein Timer also die jetzigen Koordinaten festsetzt, ist ja eigentlich klar das es schwer ist von dem Punkt wieder weg zu kommen (klemmen) aldo müsste man vielleicht die Koordinaten vergleichen oder sowas.. Ich werd die anderen Vorschläge ausprobieren.

    Ist meine Vermutung richtig?

    Danke.
    Mfg. TGS
    Wie wäre es gleich damit: Du hörst auf Controls für Zwecke zu missbrauchen, für die sie nicht gedacht sind?
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    TheMaxiSoftware schrieb:

    KeyDown und KeyUp müssten eigentlich immer funktionieren.

    Das stimmt zwar, aber nur wenn du auch das richtige KeyDown_Event nimmst. Schließlich kann nur das Steuerelement dieses Event feuern, welches auch den aktuellen Focus hat. Wenn man das umgehen will bietet sich die GetAsyncKeyState API an
    Es fördert aber einen grausamen Stil. Wenn er sich vielleicht irgendwann mal entscheidet, dieses Wissen weiterzugeben, fangen zwanzig oder am Ende gar hunderte Leute an, diesen zu übernehmen. Es funktioniert halt für den Moment. Aber dieses Vorgehen ist unperformant und unbrauchbar.

    Natürlich soll dem TE in eine Richtung geholfen werden, die seiner Frage entspricht - allerdings muss man abwägen zwischen "genau seine Frage beantworten" oder "ihn auf einen besseren Stil verweisen". Controls sind für Spieleentwicklung ein tabu und daher sollte man ihm (mMn) auf diesem Holzweg nicht weiterhelfen.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

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

    So, konnte das Problem lösen, indem ich den Timer wärend ich die Taste drücke disable:

    VB.NET-Quellcode

    1. If Me.WindowState = FormWindowState.Maximized Then
    2. Dim hotkey1 As Boolean
    3. hotkey1 = GetAsyncKeyState(Keys.W)
    4. If hotkey1 = True Then
    5. PlayerEmpfang.Stop()
    6. PictureBox1.Top -= 8
    7. streamw.WriteLine(PictureBox1.Location.X.ToString + " " + PictureBox1.Location.Y.ToString)
    8. streamw.Flush()
    9. PlayerEmpfang.Start()
    10. End If
    11. Dim hotkey2 As Boolean
    12. hotkey2 = GetAsyncKeyState(Keys.S)
    13. If hotkey2 = True Then
    14. PlayerEmpfang.Stop()
    15. PictureBox1.Top += 8
    16. streamw.WriteLine(PictureBox1.Location.X.ToString + " " + PictureBox1.Location.Y.ToString)
    17. streamw.Flush()
    18. PlayerEmpfang.Start()
    19. End If
    20. Dim hotkey3 As Boolean
    21. hotkey3 = GetAsyncKeyState(Keys.A)
    22. If hotkey3 = True Then
    23. PlayerEmpfang.Stop()
    24. PictureBox1.Left -= 8
    25. streamw.WriteLine(PictureBox1.Location.X.ToString + " " + PictureBox1.Location.Y.ToString)
    26. streamw.Flush()
    27. PlayerEmpfang.Start()
    28. End If
    29. Dim hotkey4 As Boolean
    30. hotkey4 = GetAsyncKeyState(Keys.D)
    31. If hotkey4 = True Then
    32. PlayerEmpfang.Stop()
    33. PictureBox1.Left += 8
    34. streamw.WriteLine(PictureBox1.Location.X.ToString + " " + PictureBox1.Location.Y.ToString)
    35. streamw.Flush()
    36. PlayerEmpfang.Start()
    37. End If
    38. Else
    39. End If


    Aber ihr habt Recht gehabt: Jetzt fängts langsam an unsauber zu werden.. Werds mal mit GDI ausprobieren.
    Danke :)

    Mfg. TGS