Funktion umstellen

  • GM 8
  • Funktion umstellen

    Hallo,
    Ich habe letztens nach einer S-Kurve für die Geschwindigkeit gefragt. Diese funktioniert auch sehr gut, nur habe ich nun ein blödes Problem (sollte mir schon früher auffallen).

    Step event:

    GML-Quellcode

    1. if keyboard_check(ord('W')){i+=0.002;if i>1 i=1;speed=script1(i)*top_speed;}

    script1() beschreibt die S-Kurve.
    Wenn ich W nun loslasse und meine Geschwindigkeit abnimmt, verringert i sich dabei nicht. Das bedeutet, dass wenn ich wieder W drücke, aus der alten Geschwindigkeit heraus beschleunigt wird. Also möchte ich nebenbei eine andere Funktion laufen lassen, die mir i in Relation zu speed wiedergibt. Dazu müsste ich den Teil nach i umstellen:

    GML-Quellcode

    1. speed=script1(i)*top_speed;

    Leider habe ich keine Ahnung, wie ich das bewerkstelligen soll. Versucht habe ich nun schon so einiges aber nichts hat wirklich geklappt (vielleicht denke ich einfach zu kompliziert :S ).

    Ich freue mich schon auf eure Hilfe.

    Grüße, Skotchy
    "Ich sollte schlafen gehen"

    ~Pika-Pika~
  • Wenn ich das also nun richtig lese soll sich "i" veringern wenn Taste W nicht mehr gedrückt wird.

    Das müste doch so hier eigentlich gehen.

    GML-Quellcode

    1. if keyboard_check(ord('W')) then
    2. {
    3. i+=0.002
    4. if i>1 then i=1;
    5. speed=script1(i)*top_speed;
    6. }
    7. else
    8. {
    9. if i>0 then i-=0.002
    10. speed=script1(i)*top_speed;
    11. }
    Alles anzeigen
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Und was ist wenn du bei einem stoß/aufprall die variable i neu anpast.


    Aufprall=
    {
    i*=(speed/max_speed)
    }

    Wenn ich jetzt kein denk fehler habe sollte sich nun bei einem aufprall i prozentual danach richten wie schnee du bist.
    wenn du also jetzt nur noch 50% so schnel wie vorher bist wird ebenfalls auf 50% reduziert.

    Wenn max_spped zb 2 ist
    und dein speed nach dem aufprall nur noch 1 ist dann ergibt das i*=(1/2)

    evtl kommt man so dem ergebniss näher.
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • Wenn du diese Gleichung

    GML-Quellcode

    1. speed=script1(i)*top_speed

    nach i umstellen willst, muss natürlich die konkrete Funktion script1 bekannt sein, oder besser gesagt, ihre Umkehrfunktion. Du musst also neben script1 noch ein Script script1_inv verwenden, welches die Umkehrfunktion berechnet. Dann lautet die umgestellte Gleichung

    GML-Quellcode

    1. i=script1_inv(speed/top_speed)

    Das Script script1_inv muss man natürlich entsprechend selber programmieren. Wenn du damit Probleme hast, kannst du uns ja mal das entsprechende script1 zeigen.
  • Das mit der Umkehrfunktion habe ich versucht. Damit es einfacher ist, habe ich hier mit einer Quadratischen Funktion gearbeitet:

    GML-Quellcode

    1. //scritp1:
    2. if argument0<0 return 0;
    3. if argument0>1 return 1;
    4. if argument0<0.5 return 0.5 * power(2*argument0, 2);
    5. else return -0.5 * power(2*argument0-2, 2) + 1;

    Meine Umkehrfunktion ist diese:

    GML-Quellcode

    1. //script1_inv
    2. if argument0<0 return 0;
    3. if argument0>1 return 1;
    4. if argument0<0.5 return -0.5 * power(2*argument0-1, 2) + 0.5;
    5. else return 0.5 * power(2*argument0-1, 2) + 0.5;

    habe ich da irgendwo einen Denkfehler?

    Danke für eure Hilfe.

    Grüße, Skotchy
    "Ich sollte schlafen gehen"

    ~Pika-Pika~
  • So sollte es gehen:

    GML-Quellcode

    1. //script1:
    2. if argument0 < 0 return 0;
    3. if argument0 > 1 return 1;
    4. if argument0 < 0.5 return 2*sqr(argument0);
    5. else return -2*sqr(argument0-1)+1;

    GML-Quellcode

    1. //script1_inv:
    2. if argument0 < 0 return 0;
    3. if argument0 > 1 return 1;
    4. if argument0 < 0.5 return sqrt(argument0/2);
    5. else return 1-sqrt((1-argument0)/2);
  • Benutzer online 1

    1 Besucher