Verbesserte Steuerung

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

  • Verbesserte Steuerung

    Hallo zusammen

    Bis jetzt nutze ich zur Steuerung eines Fahrzeuges folgenden Code:

    GML-Quellcode

    1. //Links
    2. if (keyboard_check(vk_left)) or (keyboard_check(ord('A')))
    3. {
    4. if (speed<=10) direction += speed/2;
    5. if (speed>=10 && speed<=15) direction += speed/4;
    6. if (speed>=15 && speed<=20) direction += speed/6;
    7. };
    8. //Rechts
    9. if (keyboard_check(vk_right)) or (keyboard_check(ord('D')))
    10. {
    11. if (speed<=10) direction -= speed/2;
    12. if (speed>=10 && speed<=15) direction -= speed/4;
    13. if (speed>=15 && speed<=20) direction -= speed/6;
    14. };
    15. //Beschleunigen
    16. if (keyboard_check(vk_up)) or (keyboard_check(ord('W'))) speed = min(18,speed+0.4)
    17. //Bremsen
    18. if keyboard_check(vk_down) or (keyboard_check(ord('S'))) speed = max(-8,speed-0.3)
    19. image_angle = direction;
    20. };
    Alles anzeigen


    Nun habe ich vor die Steuerung zu verbessern, indem ich eine Vorderachse hinzufüge, damit meine ich das, man die Vorderräder in einen bestimmten Winkel bringen kann Z. B. 35° nach Links so wie bei einem realen Fahrzeug. Nun komme ich zu meinem Hauptproblem, bisher errechne ich die direction mit der speed variable und einer Hochzählenden variable damit, sich das Fahrzeug sanft in die jeweilige Richtung dreht und nicht um die eigene Achse. Da ich nun aber einen Festen wert habe dreht sich bisher in meinen Versuchen, das Fahrzeug um seine eigene Achse, wie kann ich das verhindern hat einer von euch einen Tipp für mich?

    Bisher habe ich mir schon allgemeine Formeln zum Wendekreis, Spurkreis, Winkelgeschwindigkeit und Bogenmaß angeschaut aber auch mit diesen Formeln fehlt mir der entscheidende Denkanstoß.
    Meine Webseite: jesoftmedia.de
  • also ich versteh grad nicht so ganz dein problem ^^... mach doch einfach ne abfrage:

    GML-Quellcode

    1. if direction >30 {direction =30;}

    und setz die origin in x zentral wo deine hinterachse ist wenn ich richtig liege.
    Leider versteh ich grad echt nicht wie du es meinst, kann sein das ich bisschen zu übermüdet bin :D... falls du aber meintest das es sanfter gehen soll dann guck dir mal die funktion friction an :)

    EDIT: ok jetzt hab ichs gerafft was du meinst (/.\)... interessantes thema... ich guck mir das jetzt auch mal an :D
    Wir stehen zusammen und wir fallen zusammen

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

  • CREATE:

    GML-Quellcode

    1. keyboard_set_map(ord('A'), vk_left);
    2. keyboard_set_map(ord('D'), vk_right);
    3. keyboard_set_map(ord('W'), vk_up);
    4. keyboard_set_map(ord('S'), vk_down);
    5. speed_max = 20;
    6. speed_min = -8;
    7. acceleration = 3;
    8. turn_speed = 2;

    STEP:

    GML-Quellcode

    1. var k_left = keyboard_check(vk_left);
    2. var k_right = keyboard_check(vk_right);
    3. var k_up = keyboard_check(vk_up);
    4. var k_down = keyboard_check(vk_down);
    5. direction += ((speed_max/max(abs(speed),1))*turn_speed)*(k_left - k_right);
    6. speed = clamp(speed + ((k_up - k_down)*(acceleration*(abs(speed)/speed_max) + .1)),speed_min,speed_max);
    7. if (k_up + k_down = 0) {
    8. speed *= .95;
    9. }
    Alles anzeigen

    Hab mal etwas aufgeräumt. Und bitte mach kein Semikolon; nach Den Klammern{}, in anderen Sprachen würde das schon zu einem Fehler führen ergo schlechte Angewohnheit
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

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

  • Ich habe jetzt mal denn Code ausprobiert, und habe festgestellt das sich das Fahrzeug sofort in Bewegung setzt, ohne das eine taste betätigt wurde. Da ich dies nicht möchte, habe ich den folgenden Code verändert nun habe ich aber wieder das Problem, das sich das Fahrzeug auf der Stelle dreht.

    GML-Quellcode

    1. if (k_up + k_down = 0) {
    2. speed = 0;
    3. }


    Vielleicht noch einmal eine bessere Erklärung. Ich habe ein Fahrzeug zu Begin mit den variablen direction und speed von 0. Wenn nun die rechte oder linke Feiltaste im Stehen betätigt wird, wird eine Variable hochgerechnet von 0° auf 35° bzw. auf -35° dies dauert, sagen wir mal 2 sec. Wenn man nun beschleunigt, soll das Fahrzeug im ausgewählten Winkel anfahren, und sich nicht um die eigene Achse drehen.
    Meine Webseite: jesoftmedia.de
  • Ich habe das ganze auf die schnelle im Texteditor geschrieben. Es sollte syntaktisch alles korrekt sein und auch keine explizite Lösung fdür dein Problem weil ich das ehrlich gesagt noch nicht ganz Verstanden habe was du willst, ich habe nur deinen Code gesehen und sofort gemerkt das man ihn höllich vereinfachen kann. Ich habe quasi deinen code von der Funktionalität 1:1 übernommen und dir andere einstell möglichkeiten gegeben. Du musst vermutlich ein wenig anpassen und immernoch deien Achse einbauen, aber wenn du mit den Werten spielst solltest du ein besseres Ergebnis erziehlen.

    if (k_up + k_down = 0) ist richtig, der Fehler war nur das speed_min auf 8 anstatt -8 gestellt ist, hättest du aber auch drauf kommen können^^
    Kopiers einfach nochmal alles habs korrigiert.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

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

  • Ich habe mir mal selber Gedanken gemacht, und eine Test Datei erstellt, diese funktioniert auch soweit allerdings habe ich wieder das Problem, das sich das Fahrzeug bei sinkender Geschwindigkeit fast um seine eigene Achse dreht. Zum Testen die linke und die obere Pfeiltaste gedrückt halten, ist nun die volle Geschwindigkeit erreicht, lässt man die obere Taste wieder los, und erkennt das sich das Fahrzeug zunächst im selben Winkel weiter bewegt, und erst zum Ende hin den Winkel ändert. Wie kann man genau das Verhindern, also das der Winkel gleich bleibt?
    Dateien
    • test.gmx.zip

      (286,13 kB, 388 mal heruntergeladen, zuletzt: )
    Meine Webseite: jesoftmedia.de
  • Ich hab es jetzt mal angeguckt, habe ein kleines Problem mit meinem Code festgestellt aber es ist schon enttäuschend wenn man sich mühe gibt Code zu verbessern und das dann nichtmal angenommen wird. Auch wenn du es nicht ans laufen kriegst hättest du wenigstens die key_map Funktionen übernehmen können, der Code ist echt schrecklich so. Ich weiß zwar nicht warum du die Achse unbedingt haben willst, aber das ist nunmal eine rein grafische Sache dessen Implementation ich dir überlasse, brauchen tut man sie nicht.

    Ansonsten habe ich dein Projekt nun verbessert:
    DOWNLOAD
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Ich habe Deinen Code nur nicht benutzt, da dieser auch in der zweiten Variante nicht funktioniert hat, und ich mit Deinem Code nicht klar Kamm (Verständnis). Der jetzige Code funktioniert fast perfekt, allerdings ist die direction Veränderung beim Anhalten sehr langsam, kann man dies auch noch ändern?
    Meine Webseite: jesoftmedia.de
  • Du könntest turn_speed weiter runter setzen, aber ich denke du musst das so machen

    GML-Quellcode

    1. direction += (turn_speed*(abs(speed*C)/speed_max))*(k_left - k_right);

    Wobei C das Verändert was du willst, setze es auf irgendwas was dir passt zB 1.5
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel: