Lieber ruckeln statt Zeitlupe

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

  • Kein Problem.

    Nur wirst du eventuell mit diesem System Probleme mit Alarmen und Kollisionen bekommen.
    Ein alarm basiert ja auf den fps, bei jedem neuen Frame wird 1 abgezogen.
    Da müsstest du dein eigenes Alarmsystem schreiben, das pro frame die Deltazeit vom alarm abzieht, damit jemand, bei dem es flüssig läuft nicht z.b. schneller schiessen kann als jemand bei dem es ruckelt.

    Probleme mit Kollisionen wirst du bekommen, wenn das Spiel sehr arg ruckelt.
    Je langsamer das Spiel läuft, desto grössere 'sprünge' machen die Objekte.
    Läuft das Spiel sehr langsam, sind diese Sprünge sehr gross und man kann z.b. durch eine Wand schiessen weil keine Kollision festgestellt wurde.
    Wie man das vernünftig lösen könnte, weiss ich nicht. Vieleicht, indem man der Deltazeit einen Minimalwert zuweist.
  • Das mit der Kollision wird in der Regel so gelöst, dass man nicht nur die aktuelle Position eines Objektes betrachtet, sondern auch den Weg zwischen der Position im vorherigen Frame und dem jetzigen um auszuschließen, dass das objekt ein anderes überspringt. Solch ein Kollisionssystem müsste man sich allerdings selber programmieren weil der GM das anders macht.
  • also mit den alarm-funktionen werde ich keine probleme haben, ich mach einfach ne wartezeit-variable, die jeden step um 1 erhöht wird, wenn dann die variable einen bestimmten wert erreicht hat soll was ausgeführt werden und die variable sinkt wieder auf 0, woraufhin sie wieder jeden step um 1 erhöht wird.

    bei den collisionen muss ich echt ma schauen...

    ach und noch ne frage, ich bin gerade dabei die deltatime einzubauen, nur wie sieht das mit direction und anderen variablen außer speed aus?? ich kann meine objekte nich mit der deltatime drehen, oder mache ich da was falsch??

    im step event:

    GML-Quellcode

    1. speed=scr_get_deltatime()*dspeed;
    2. direction=scr_get_deltatime()*ddirection;


    im begin-step:

    GML-Quellcode

    1. if keyboard_check(global.turnleft) {
    2. ddirection-=180;
    3. }


    Das funzt nich, in einer sekunde soll sich das objekt um 180° drehen, doch es passiert gar nix
  • so jetz ma was schwierigeres:
    mein objekt soll nicht sofort einen speed von 2 haben sondern "langsam anfahren" und immer schneller bis zu einem bestimmten speed-wert werden, nur kriege ich das nich so hin mit deltatime^^ SRY, muss ich da was besonderes beachten? :D
  • ?
    Behandle einfach die dspeed Variable wie die normale speedvariable.
    Pack einfach ins step event:

    GML-Quellcode

    1. if(dspeed<*maximaler Speedwert*)
    2. {
    3. dspeed+=*Beschleunigungswert*;
    4. if(dspeed>*maximaler Speedwert*)
    5. dspeed=maximaler Speedwert*
    6. }


    das sollte die Geschwindigkeit so lange um den Beschleunigungswert erhöhen, bis der maximale Speedwert erreicht ist.
  • Solange in deiner Formel die FPS vorkommen (und wenn es nur der Kehrwert ist), wirst du immer Probleme haben und der Wert ist von den FPS abhängig.

    Eine weitere Idee: Beide PCs vergleichen ihre FPS und der schnellere drosselt die dann runter.
  • jaja generals.
    Mit Freuden erinnere ich mich da an Lanparties, bei denen ich alle Anderen mit meiner lahmen Mühle freude bereitet habe.
    Generals ist übrigens das einzige Spiel das ich kenne, das so etwas macht.
    Ich glaube eher, Delta Timing ist da der Standart.
    Wie sonst lassen sich fps von mehr als 500 bei einigen Spielen erklären, obwohl alles auf jedem Computer, auch wenn man nur 60 fps schafft, mit der selben Geschwindigkeit läuft?
  • Okay, es ist nicht die Standardmethode, aber es kommt vor... aaah jaaa.... das waren Zeiten. Als wir mal einen Patch für Need for Speed Underground zusammengeschustert hatten, der das Spiel LAN-Fähig und durch eben dieses Verfahren unlaggy machte... ich sag Euch: Bullettime ist bei Autorennspielen wirklich SCH****!!! ^^

    Ist ja auch nicht immer die beste Lösung. Bei den meisten Spielen kommt es ja schon auf eine gewisse Hektik an. Kein Wunder also, dass UT2k4 etwa bei unserem 32 Spieler LAN-Match dann wohl lieber im Frame-by-Frame verfahren angetrieben wurde anstatt einfach gebremst zu werden. ^^ Vor allem bei RTS Spielen habe ich das aber schon mehrmals gesehen, dass man einfach drosselt. Ich denke dann aber doch, dass allgemein das Ruckeln die bessere Lösung ist. Bei Strategiespielen mit "Hardware-Oberfläche" (wo Mauszeiger und HUD unabhängig von den FPS betrieben werden) kann es ruckeln wie man will, man kann trotzdem ordentlich steuern, so etwa bei Dawn of War. Da habe ich zwar immer ne Dia-Show gehabt, dank des übersichtlichen HUDs und des stets kontrollierbaren Mauszeigers habe ich dann doch beinahe sämtliche Matches gewonnen (bis ich dann eine bessere Hardware bekam ^^").
  • nur leider is das probem mit den kollisionen ja dann wieder, wenn ich deltatiming mache, werden die sprünge zwischen punkt 1 und punkt 2 größer, je niedriger die fps sind.

    außerdem finde ich es ziemlich umständlich mein game komplett auf deltatiming umzustellen, weil es da doch schon komplexer ist.

    z.b. kann ich es nich machen, dass mein objekt langsam anfährt un beschleunigt bis zu einer maximalgeschwindigkeit. die max-geschwindigkeit ist zwar bei jedem room_speed gleich, aber komischerweise ist das beschleunigen meines objektes bei 10 fps viel langsamer als bei 100 fps, bei über 100 fps sieht man gar nich dass de rüberhaupt beschleunigt und bei 10 fps braucht der voll lange um auf max-speed zu kommen ?(
  • ich hab genau so wie in deinem beispiel gemacht:

    GML-Quellcode

    1. if(dspeed<*maximaler Speedwert*)
    2. {
    3. dspeed+=*Beschleunigungswert*;
    4. if(dspeed>*maximaler Speedwert*)
    5. dspeed=maximaler Speedwert*
    6. }

    wie gesagt das objekt bewegt sich vom max-speed bei allen fps-stufen gleich schnell, so wie es ja sein soll, nur die beschleunigung dauert bei 10 fps länger als bei z.b. 100 (hier sieht es so aus als gäbe es gar keine beschleunigung, man drückt den cursor nach oben und das objekt hat scheinbar ohne beschleunigung sofort den max-speed erreicht)

    weißt du was ich meine oder soll ich mal nen example uppen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DJ-Davudska ()

  • Oookay... dann werde ich das, was dir jetzt schon 2 mal gesagt wurde im Klartext in diesen Code schreiben...

    GML-Quellcode

    1. if(dspeed<maximaler Speedwert)
    2. {
    3. dspeed+=Beschleunigungswert*scr_get_deltatime();
    4. if(dspeed>maximaler Speedwert)
    5. dspeed=maximaler Speedwert
    6. }


    Der Beschleunigungswert gibt an, wie viele Pixel pro Sekunde beschleunigt wird.