Auto fahren mit Richtung

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Auto fahren mit Richtung

    Hallo Leute,
    ich arbeite zurzeit an einem Multiplayer Spiel und bin auch relativ neu in diesem Bereich der Spieleprogrammierung.
    Ich habs es auch hingekriegt, dass mittlerweile jemand in meinem Spiel rumlaufen kann, funktioniert einwandfrei, die Figur dreht sich sogar in die richtige Richtung.
    Mein Problem: ich möchte das auch für eine Auto umbauen, jedoch ist es hier nicht möglich nur z.B. das Auto optisch zu drehen sondern ihn wircklich in die gegebene Richtung zu bewegen, d.h. wenn er in einem Winkel von 120° steht, soll er auch so weiterfahren.
    Ich schätze mal, dass man sowas mit den Winkelfunktionen macht, ist ja auch eig. kein Problem für mich, weil ich das schon in der Schule hatte,
    es scheiter eher an der Umsetzung in z.B. Koordinaten usw. .

    Danke schonmal im Vorraus

    Mit freundlichen Grüßen
    Trunk
    Naja du hast also den Winkel und die Geschwindigkeit gegeben. Die Geschwindigkeit, also die Anzahl an Pixel, die in einem Durchgang des Game Loops zurückgelegt werden soll, kannst du dir als Hypotenuse eines Dreiecks vorstellen. Nun kannst du mit den Winkelfunktionen die Katheten ausrechnen, die die X- und Y-Werte darstellen, die dein Auto sich bewegt.

    Habe dir das mal aufgemalt:


    Beispiel:
    sin(Winkel) = Y / Geschwindigkeit
    <=> sin(Winkel) * Geschwindigkeit = Y

    cos(Winkel) = X / Geschwindigkeit
    <=> cos(Winkel) * Geschwindigkeit = X

    (ohne Gewähr, hab das selbst ewig nicht mehr gemacht)

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Wenn Du ein Bild drehen willst, sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Private Shared Function RotateImageByAngle(bmpOld As System.Drawing.Image, angle As Single) As Bitmap
    2. Dim bmpNew = New Bitmap(bmpOld.Width, bmpOld.Height)
    3. Dim gr = Graphics.FromImage(bmpNew)
    4. gr.TranslateTransform(CSng(bmpOld.Width) / 2, CSng(bmpOld.Height) / 2)
    5. gr.RotateTransform(angle)
    6. gr.TranslateTransform(-CSng(bmpOld.Width) / 2, -CSng(bmpOld.Height) / 2)
    7. gr.DrawImage(bmpOld, New Point(0, 0))
    8. Return bmpNew
    9. End Function
    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!
    um die "nächste" position des Fahrzeugs in fahrtrichtung zu bekommen benötigst du 4 Angaben:

    - Rotation des Fahrzeugs (=> Fahrtrichtung)
    - Geschwindigkeit (Pixel pro Sekunde)
    - Jetzt-Position
    - vergangene Zeit (seit dem letzten aktualisierungsvorgang, sind normalerweise zeiten um die 20ms)

    XNeu = XAlt + Geschwindigkeit * Zeit * math.Cos(winkel)
    YNeu = YAlt + Geschwindigkeit * Zeit * math.Sin(winkel)

    Wichtig:
    die Geschwindigkeit ist in Pixel/Sekunde angegeben, also muss die Zeit auch in sekunden angegeben werden. 20ms = 20/1000 = 0.02 Sekunden. Wenn du das Spiel mit einem Timer "gebaut" hast, dann kannst du das ganze auch durch einen festen Faktor ersetzten (TimerInterval / 1000).

    Die Winkel müssen im Bogenmaß angegeben werden.

    WinkelGrad / 180 = WinkelBogen / Math.Pi
    WinkelBogen = WinkelGrad * math.Pi / 180

    Um das Fahrzeug gedreht darzustellen kannst du die befehle aus Rods Function benutzen, auf keinen Fall würde ich die Funktion so übernehmen, da es blödsinn ist erste eine Bitmap zu erzeugen und diese dann zu zeichnen. War aber auch so gedacht denke ich^^

    lg

    FreakJNS schrieb:

    da es blödsinn ist erste eine Bitmap zu erzeugen und diese dann zu zeichnen.
    So isses.
    Wichtig ist weiterhin, dass Du nicht das Auto um einen Winkel weiterdrehst, sondern immer das Startauto (den Ausgangszustand) zum (temporären) Zielwinkel drehst, sonnst summieren sich die (Pixel-) Fehler.
    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!
    Hi
    im Normalfall verwendet man für sowas Vektoren, da man damit leichter Rechnen kann. Die trigonometrischen Funktionen, sowie Wurzeln, die nur durch Näherungsverfahren bestimmt werden können, sollte man möglichst wenig anwenden, wenn es auf Performanz ankommt oder man viele Berechnungen hat, da sie häufig einen sehr hohen Rechenaufwand mit sich bringen. Die Zwischenspeicherung von wiederverwendeten Ergebnissen gibt übrigens auch einige Performanzverbesserungen

    Gruß
    ~blaze~