Variable Framerate

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

  • Variable Framerate

    Sorry, dass ich dazu nommel n Thread erstell.
    Also, ich möchte, dass mein Spiel, egal bei welcher Framerate, gleich schnell läuft. Dass mach ich nun folgendermaßen:

    Im Step:

    global.fpss = "aktueller Roomspeed"/fps

    Diese global.fpss multiplizier ich nun mit den ganzen Variablen (Speed etc.). Nun hab ich aber das Problem, dass mein Player (hab die FoxEngine), wenn ich z.B. den Speed von 60 auf 30 stell, höher springt als bei einem Wert bei 60. Hab schon alles mögliche probiert, hat aber nix gekplappt. Also her sind Events + Code:

    Create:

    GML-Quellcode

    1. image_speed=0; //set the image speed to 0
    2. image_index=1; //set the image index to 1
    3. gravity_direction=270; //set the gravity direction to down (270)
    4. wspeed=0; //wspeed is used for horizontal speed


    Step:

    GML-Quellcode

    1. p_maxspeed = global.fpss*5; //maximum speed
    2. p_accel = global.fpss*1; //move acceleration
    3. p_friction = global.fpss*0.5; //friction
    4. p_maxgravity = global.fpss*8; //maximum gravity speed
    5. p_jumpspeed = 30*global.fpss; //jump speed
    6. //perform friction on wspeed, it decreases the wspeed to 0
    7. wspeed = max(0,abs(wspeed)-p_friction)*sign(wspeed);
    8. //this is the magic code, first it checks if the player can move to the right,
    9. //if not, then it will start looping to see if it can go to right with a pixel up..
    10. for(i=0;i<abs(wspeed);i+=0.5) {
    11. var st, st2; st = place_free(x,y+2); st2 = sign(wspeed)/2;
    12. if(!st && place_free(x+st2*0.6,y+2)) { x+=st2*0.6; y+=2; }
    13. else if(!st && place_free(x+st2*0.8,y+1)) { x+=st2*0.8; y+=1; }
    14. else if(place_free(x+st2,y)) { x+=st2; }
    15. else if(!st && place_free(x+st2*0.8,y-1)) { x+=st2*0.8; y-=1; }
    16. else if(!st && place_free(x+st2*0.6,y-2)) { x+=st2*0.6; y-=2; }
    17. else if(!st && place_free(x+st2*0.4,y-3)) { x+=st2*0.4; y-=3; }
    18. else break;
    19. }
    20. //checks to see if the place below us is free
    21. if(place_free(x,y+1)) {
    22. //if the player is going up, and is not pressing up, then we want him to go down fast
    23. if(vspeed < 0 && !keyboard_check(ord('W'))) gravity = global.fpss*2.5;
    24. else gravity = global.fpss*1;
    25. }
    26. //no place free below the player! lets make him stop..
    27. else gravity=0;
    28. //we don't want the vspeed to go over 6
    29. if(vspeed > 6*global.fpss) vspeed=6*global.fpss
    Alles anzeigen


    Press W-key:

    GML-Quellcode

    1. //if there is ground below us, we want to jump! and ofcourse set the jump sprite
    2. if(!place_free(x,y+4)) {
    3. vspeed =- p_jumpspeed;
    4. if(sprite_index==spr_run_left||sprite_index==spr_idle_left) sprite_index=spr_jump_left;
    5. if(sprite_index==spr_run_right||sprite_index==spr_idle_right) sprite_index=spr_jump_right;
    6. }


    So, das wären alle wichtigen Events. Kann mir echt nicht erklären, was daran falsch is.
    Danke im Vorraus

  • global.fpss = "aktueller Roomspeed"/fps

    Das ergibt beim Roomspeed 60 und 60 fps 1. Und beim Roomspeed 30 und 30 fps auch 1.

    Gehen wir nun an die Gravitation.

    p_maxgravity = global.fpss*8; //maximum gravity speed

    Beide male beträgt p_maxgravity 8. Aber wenn du 60 hast, löst die Gravitation 60 mal pro Sekunde mit Geschwindigkeit 8 aus. Bei 30 tut sie das nur 30 mal pro Sekunde. Ergo ist die erreichbare Höhe theoretisch doppelt so hoch, da praktisch bei room_speed 30 nur die Hälfte der Schwerkraft von room_speed 60 greift.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Ich glaub ich hab den Fehler entdeckt.
    Also, die maximale Sprunghöhe lässt sich wie folgt berechnen:
    Sprungstärke(30)/Gravity(2.5) * Sprungstärke(30)/2
    =180

    So wenn du nun die zwei Werte halbierst:
    Sprungstärke(15)/Gravity(1.25) * Sprugstärke(15)/2
    =90
    So du musst auf jeden Fall entweder die Gravity nochmals halbieren (also vierteln (in deinem Fall noch mal durch das Verhältniss von fps und soll-fps teilen)),
    oder die Sprungstärke anpassen. (=21,21320344 in dem Fall, hab einfach eíne Formel aufgestellt und umgeformt)

    Edit: verdammt zu spät :motz:
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Achtung! Der Roomspeed ist nicht variabel, er steht fest auch 60 steps pro Sekunde. Die FPS, also Frames pro Sekunde sind jedoch variabel, so ergibt fpss bei jemandem, bei dem das Spiel mit vollen 60fps läuft gleich 1, also werden die Werte nicht verändert. Läuft das Spiel bei jemandem jedoch bei z.B. nur 30fps (langsamer PC), so beträgt fpss = 2, es wird also alles mit doppelter Geschwindigkeit ausgeführt.

    EDIT: ACH SCHEISSE!!! ES GEHT EINFACH NICHT!! BRAUCHE UNBEDINGT HILFE!!!
    PS: Nochmal einfach: Möchte die FoxEngine so umschreiben, das sie bei verschiedenen FPS-RAten immer gleich schnell läuft!

    EDIT2: Hab ne viel einfachere Lösung gefunden: gmc.yoyogames.com/lofiversion/index.php/t320198.html

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von EragonCool ()

  • Sorry für den Doppelpost.

    Langsam, ganz langsam werd ich wahnsinnig. Die letzt Lösung hat auch nicht funktioniert, so dass ich jetzt wieder bei dem Delta Frameskip angekommen bin (hier: gmc.yoyogames.com/lofiversion/index.php/t320198.html). Also die gleiche Lösung, die ich eigentlich vereits am Anfang hatte. Nur dass ich hier das selbe Problem hab wie oben, nämlich dass ich einfach nicht weiß, was ich alles mit der Differenz aus aktueller und gewünschter FPS multiplizieren muss. Ich sag daher jetzt ganz faul, dass ich mich freuen würde, wenn mir jemand in den Code an den richtigen Stellen diese Variable einfügen könnte.

    Danke 8o 8o 8o 8o

  • Probier's mal hiermit:

    GML-Quellcode

    1. global.fpss = 100/max(10,fps);


    Du wirst dann aber alles andere anpassen müssen, denk ich.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Sry, wenn ich mich grad n bissle dumm anstell. @mauge Also, warum machst du das mit dem max(...). Das Prolem liegt au gluab ich nicht da. Es funktioniert ja überall, bis auf das Springen. Hier bin ich zu nem ziemlich komischen Ergebniss gekommen. Halbieren sich die FPS, also z.B. von 60 auf 30, so muss p_jumpspeed auf 1.5*30 gesetzt werden, halbiert sie sich dann nochmals, also auf 15fps, dann muss p_jumpspeed auf 2 gesetzt werden. So hab ich das zumindest per Augenmaß festellen können. Halbiert sich also die FPS, so vergrößert sich p_jumpspeep um 15. Dafür hab ich jedoch bisher keine allgemeine Formel aufstellen können, bei der sich der Normalwert, als 30 bei 60fps nicht verändert.
    Trotzdem danke

  • Das max() ist nur dazu da, dass keine Fehler entstehen, wenn die FPS auf null stehen. Du musst dann global.fpss nur noch mit deinen Werten multiplizieren. Eigentlich eine einfache Angelegenheit.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Wie du oben im Quellcode siehst, hab ich das bereits gemacht, und es funktioniert auch alles, bis eben das Springen, hier scheint p_jumpspeed viel zu hoch zu sein. Ich glaube einfach, dass irgendwo der jumpspeed nochmals mit fpss multipliziert wird oder sonst wo, und dass dadurch das Problem ensteht.

    EDIT: Vielleicht versuchst du einfach mal selbst, dieses System an der FoxEngine (gmc.yoyogames.com/?showtopic=164852) anzuwenden, müsste ja so, wie du es beschreibst, ganz einfach sein. Sollte es dann bei dir funktionieren, kannst du deine Codes ja einfach mal posten ^^

  • Nein, tut mir leid. Ich hab jetzt weder Lust noch Zeit, fremden Code umzuarbeiten. Ich kann dir auch nicht sagen, wie sich meine Variante zusammen mit der Gravity verhält, da ich es selber in der Form noch nicht benötigt hab. Dennoch funktioniert es anders, als dein erster Vorschlag, und ich dachte, vielleicht hilft es dir ja.

    Btw, ich kann die Fox Engine dort nicht downloaden.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Ja, war vllt. n bissle unverschämt von mir, des zu verlangen ^^sorry. Hab jetzt durch ewiges rumprobieren mal so ne einigermaßen geeignete Lösung gefunden. Trotzdem danke, damit wär das Thema ja gelöst

    EDIT: Bei mir geht der 2. Downloadlonk (mirror) ^^