Von Vector1 zu Vector2

  • C#
  • .NET (FX) 4.0

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Von Vector1 zu Vector2

    Hi,

    ich baue gerade an einer Camera, und nun möchte ich bestimmte Positionen queuen an die die Camera gehen soll.

    C#-Quellcode

    1. /// <summary>
    2. /// Updates the camera
    3. /// </summary>
    4. /// <param name="gameTime">The game time</param>
    5. public void Update(GameTime gameTime)
    6. {
    7. if (_currentTargetPosition == null)
    8. {
    9. if (_queuedPositions.Count > 0)
    10. _currentTargetPosition = _queuedPositions.Dequeue();
    11. }
    12. if (_currentTargetPosition != null)
    13. {
    14. var oldDistance = Vector2.Distance(Center, _currentTargetPosition.Value);
    15. var normalized = Vector2.Normalize(_currentTargetPosition.Value - Center);
    16. var newPosition = Center + normalized*Velocity*gameTime.ElapsedGameTime;
    17. var newDistance = Vector2.Distance(newPosition, _currentTargetPosition.Value);
    18. if (oldDistance < newDistance)
    19. {
    20. Center = _currentTargetPosition.Value;
    21. _currentTargetPosition = null;
    22. }
    23. else
    24. {
    25. Center = newPosition;
    26. }
    27. }
    28. }


    Nun wollte ich mal fragen ob das dafür die richtige Vorgehensweise ist? Ich bestimmte aus Start und Endpunkt einen Richtungsvektor mit dem ich anhand von Velocity und deltaTime die neue Position errechne, nun vergleiche ich die Distanz vor und nach der Änderung. Ist die Distanz nach der Änderung größer bin ich wegen z.B zu hoher Geschwindigkeit übers Ziel hinausgeschossen.. falls ja ist meine neue Position die TargetPosition.

    Hier mal ein Beispiel mit Ausgabe:

    C#-Quellcode

    1. var camera = new Camera(new Rectangle(0, 0, 100, 100));
    2. camera.EnqueueTargetPosition(new Vector2(371, 277));
    3. camera.Velocity = new Vector2(0.08f, 0.02f);
    4. while (true)
    5. {
    6. Thread.Sleep(1000);
    7. camera.Update(new GameTime {ElapsedGameTime = 1000f});
    8. Console.WriteLine(camera.Center);
    9. }


    Spoiler anzeigen

    Quellcode

    1. {115,3179,61,54764}
    2. {176,4942,74,4353}
    3. {231,9032,88,86149}
    4. {279,4629,104,9435}
    5. {317,0376,122,6002}
    6. {343,4318,141,4803}
    7. {359,3792,161,0789}
    8. {367,359,180,9791}
    9. {370,3903,200,9648} <-- Hier ist das Problem mit X.. es "schwingt" um die target position
    10. {371,0318,220,9641}
    11. {370,9864,240,9641}
    12. {371,0166,260,9641}
    13. {370,9339,280,9641}
    14. {371,277}

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

    ThuCommix schrieb:

    aus Start und Endpunkt einen Richtungsvektor
    stimmt allerdings nur bei geradliniger gleichförmiger Bewegung, ansonsten wird es aufwändiger.
    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!