Visual Basic Verständnis Frage

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Visual Basic Verständnis Frage

    Hallo, ich stehe gerade echt aufm Schlauch und habe keine Idee wie ich das am besten umsetze.
    Folgendes: Die Position eines Objektes soll via Tcp übertragen und auf einem anderen Rechner dargestellt werden.
    Umgesetzt ist der meiste Teil. Alle 500ms wird eine aktuelle Position übertragen und dargestellt. Soweit so gut. Aber ich brauche ja eine "smoothe Bewegung". Das Grundprinzip hatte ich, nur ich komme gerade garnicht weiter. Überlege schon seit 2 Stunden wie ich das am besten umsetze.
    Meine Idee:
    ich sende alle 500 ms ca. ein Position update packet und stelle es dar. [done] Beim rendern mach ich mir neben den X und Y coordis noch drawX und drawY, und prüfe immer, wie groß z.B. die differenz zwischen X und drawX ist. Wenn sich mein objekt z.B. 50 Einheiten pro 500 ms bewegt, und das ganze z.B. 10 mal in der Sekunde gerendert wird, muss ich so lange drawX += 10 ausführen, bis diese Differenz aufgehoben wurde.

    Ich weiß nicht warum, aber ich scheiter beim anwenden. Ist das Prinzip so richtig?
    Kann mir jemand ein Anhaltspunkt/eine Idee geben?



    Lg

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝
    Dein Ansatz klingt mir etwas kompliziert. Letztenendes gibt es 2. Möglichkeiten: Verzögerung in der Anzeige und Interpolation oder Extrapolation:
    Verzögerung in der Anzeige und Interpolation: Du hast zum Zeitpunkt t1 die Position 10, 10, 10 und zu Zeitpunkt t2 (= t1 + 500 ms) 20, 20, 20. Dann könnte Dein Renderer bis zum Zeitpunkt Zeitpunkt t3 (t1 + 1000 ms) diese Streckendifferenz in kleinen Schritten abarbeiten: (Position(t2) - Position(t1)) / Schritte. Nachteil: Du hinkst immer 500 ms hinterher, weil das Objekt tatsächlich ja schon woanders ist.

    Extrapolation: Du hast zum Zeitpunkt t1 die Position 10, 10, 10 und zu Zeitpunkt t2 (= t1 + 500 ms) 20, 20, 20. Aufgrund dieser Positionsdifferenz könnte man vermuten, dass zum Zeitpunkt t3 das Objekt an 30, 30, 30 ist. Das ließe sich auch schrittweise darstellen. Nachteil: Wenn das Objekt seine Richtung ändert, stimmt die extrapolierte Zielposition nicht, was zu Darstellungssprüngen führt.
    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.
    Danke für die Antwort, ich setze mich mal mir deiner Idee um.


    Bin trozdem offen für weitere Vorschläge

    lg

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝

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

    Ich habe mich jetzt nach deinem Beispiel ((Position(t2) - Position(t1)) / Schritte) gerichtet:

    VB.NET-Quellcode

    1. Dim t1x As Integer = 0
    2. Dim t1y As Integer = 0
    3. Private Sub make_smooth_Tick(sender As Object, e As EventArgs) Handles make_smooth.Tick
    4. Dim calc_1x As Integer = objekt.Location.X - t1x
    5. Dim calc_1y As Integer = objekt.Location.Y - t1y
    6. Dim calc_result_x As Integer = CInt(calc_1x / 3)
    7. Dim calc_result_y As Integer = CInt(calc_1y / 3)
    8. Dim calc_result_x_string As String = calc_result_x.ToString
    9. Dim calc_result_y_string As String = calc_result_y.ToString
    10. Dim calc_pos As Point = New Point(calc_result_x, calc_result_y)
    11. If Not objekt.Location = calc_pos Then
    12. If calc_result_x_string(0) = "-" Then
    13. Dim _loc As Point = New Point(objekt.Location.X - 1, objekt.Location.Y)
    14. objekt.Location = _loc
    15. Else
    16. Dim _loc As Point = New Point(objekt.Location.X + 1, objekt.Location.Y)
    17. objekt.Location = _loc
    18. End If
    19. If calc_result_y_string(0) = "-" Then
    20. Dim _loc As Point = New Point(objekt.Location.X, objekt.Location.Y - 1)
    21. objekt.Location = _loc
    22. Else
    23. Dim _loc As Point = New Point(objekt.Location.X, objekt.Location.Y + 1)
    24. objekt.Location = _loc
    25. End If
    26. Else
    27. t1x = playermouse.Location.X
    28. t1y = playermouse.Location.Y
    29. End If
    30. End Sub

    Der Timer "make_smooth" hat folgende Attribute:
    Enabled = true
    Interval = 25

    Da ich heute total durch den Wind bin, frage ich lieber: bin ich auf dem richtigen Weg? :rolleyes: ^^


    lg

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝
    Gegenvorschlag: Du machst Dir ne vernünftige Objektklasse, die u.a. die Position des Objektes enthält und die auch Positionsdifferenzen einfach berechnen kann. Dann sind die Zeilen #11-#31 überflüssig.
    Was sollen die Zeilen8 und #9 bewirken? Deine Variablennamen sind ... verwirrend.
    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.