TopDown Movement - wie bei einer Drone

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • TopDown Movement - wie bei einer Drone

    Hallo Leute,

    ich passe gerade die Steuerungsart in meinem Spiel an. Es geht um ein Topdown-Shooter, in dem man ein Raumschiff steuert. Ich hatte die ganze Zeit eine "Raketensteuerung", allerdings war das nicht zufriedenstellend. Eine Steuerungsart vergleichbar mit einer Drone ist um einiges besser geeignet. Das ganze wird erstmal mit dem Analogstick vom Gamepad umgesetzt. Eigentlich habe ich das auch schon so umgesetzt, allerdings ist das ganze noch nicht perfekt.
    Nochmal zur Erklärung was ich erreichen will:
    Das Raumschiff bzw. die Drone kann in alle Richtungen, unabhängig von der Blickrichtung fliegen. Dabei entspricht die Richtung dem Winkel des Analogsticks. Eigentlich recht simpel, allerdings soll es aber eben einen realistischen "weichen" Übergang bei einem Richtungswechsel geben. Also wenn man gerade in Richtung 0Grad fliegt schlagartig in Richtung 180Grad wechselt, soll eben weich abgebremst werden und wieder beschleunigt. Und genau das funktioniert noch nicht, der weiche Übergang. Könnt ihr mir da auf die Sprünge helfen wie man das am besten realisieren kann? Meinen momentanen Code kann ich später mal posten... Bin gerade auf der Arbeit.
  • Du kannst zwei directions anlegen, einmal die die sich nach dem analogstick richtet: desiredDirection
    und einmal die der Drohnenrichtung entspricht: direction
    und dann je nach speed den die Drohne hat wird direction einen Schritt nach desiredDirection geändert. Je höher der Speed desto langsamer die Änderung.
    Dann schwenkt die Drohne immer ein bisschen und dreht sich nicht am Stand, es sei denn sie ist sehr langsam unterwegs.
    Mit der Funktion angle_difference kannst du immer den kleineren Winkel herausfinden zwischen den zwei directions und demnach immer den kürzesten Weg schwenken.

    Wenn du das genauer brauchst, schrei, dann versuch ich ein codebeispiel zuschreiben.

    EDIT: oder willst du nur gerade abbremsen und dann von null weg wieder gerade beschleunigen? Also eh ein bisschen so wie eine Rakete die sich dreht und dann in gegenrichtung wieder schub gibt?

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Bei der Bewegung kann man eine target Position festlegen (target_x, target_y).
    Die x und y Koordinaten müssen dann dahin bewegt werden.
    Beispielsweise
    x += (target_x - x) / 2;
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • @ Aku_Ryo:

    Danke für die ausführliche Antwort. Genau das mit den 2 unabhängigen Directions habe ich so schon umgesetzt, für die Flugrichtung (linker Analogstick) und die Blickrichtung (rechter Analogstick) das funktioniert auch so ganz gut. Und genau, ich will eigentlich einfach gerade abbremsen und beschleunigen, also der Winkel soll nicht weich angefahren werden, da dadurch eine unerwünschte Drehung entsteht (so hatte ich es die ganze Zeit).

    @ Husi012

    Danke für die Antwort, aber das bewirkt keinen weichen Richtungswechsel würde ich mal behaupten ;)
  • Ah ich dachte es kommt auf die Bewegung an ^^
    Hätte ich besser lesen sollen :)
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Verstehe :)

    da würde sich jetzt das physic system vom gamemaker anbieten, weil wenn du manuell code einbaust, dass er nur in die neue Richtung lenkt wenn er vorher abgebremst hat, kann er keine normalen kurven mehr fliegen. Du könntest als Bedingung eine angle_difference von mehr als 45 und speed höher xy stellen, damit er gerade abbremst und alles drunter fliegt er rund, aber dann hast du eine sehr stockende Grenze ab der er sich anders verhält. Einmal der direction folgend und einmal der desiredDirection.
    Beim physics system musst du nur eine local force richtung direction ausüben und wenn du dich drehst geht der Rest automatisch.

    EDIT:
    du kannst auch ohne physics die beiden "vektoren" aneinander hängen

    GML-Quellcode

    1. //Vec 1
    2. x += lengthdir_x(speed,direction);
    3. y += lengthdir_y(speed,direction);
    4. //vec 2
    5. desiredSpeed += 180-angleDifference(direction,desiredDirection);//ein wert von 0 bis 180 (kann aber auch 0-1 sein oder 0-10, wie immer du willst)
    6. x += lengthdir_x(desiredSpeed,desiredDirection);
    7. y += lengthdir_y(desiredSpeed,desiredDirection);

    siehst du in dieselbe Richtung wie du fliegst, fliegst du geradeaus dahin, in einer kure wirst du langsamer und driftest ein bisschen
    wenn du dich um 180 grad im flug drehst dann fliegst du halb so schnell wie zuvor
    du musst nur schauen wie du dich dann weiter abbremst und die direction zur desiredDirection.
    Sozusagen wenn desiredSpeed größer als speed wird, dann wird direction auf desiredDirection gesetzt.
    (nicht getestet!!! nur so vor mich hinfabuliert)


    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Aku_Ryou ()