EatTheBlocks

Präsentation und Organisation von eigenen Projekten
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: EatTheBlocks

Beitrag von Dirty Oerti » Do Jan 15, 2009 2:38 pm

Zu deinem Problem mit den FPS:

Vor der while-Schleife:

Code: Alles auswählen

unsigned int LastTime = SDL_GetTicks();
unsigned int Frames = 0;
unsigned int fps = 0;
In der Schleife:

Code: Alles auswählen

    //rendern etc...
    Frames++;
    if((SDL_GetTicks() - LastTime) >= 1000)
    {
        fps = Frames;
        Frames = 0;
        LastTime = SDL_GetTicks();
    }
   //Bewegungen:
    good_move_in_x = (1/fps) * bad_move_in_x;
Müsste klappen :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Dominik
Beiträge: 381
Registriert: Mo Jul 07, 2008 9:39 pm

Re: EatTheBlocks

Beitrag von Dominik » Do Jan 15, 2009 4:07 pm

mensch ladet auch halt die complimierten exen hoch will net immer das complimieren müssen ok kanns auch net :lol: solang es keine virus ist;)

mfg
Rechtschreibefehler sind gewollt und dienen der Unterhaltung

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: EatTheBlocks

Beitrag von Kerli » Do Jan 15, 2009 4:51 pm

Dirty Oerti hat geschrieben:Zu deinem Problem mit den FPS:

Vor der while-Schleife:

Code: Alles auswählen

unsigned int LastTime = SDL_GetTicks();
unsigned int Frames = 0;
unsigned int fps = 0;
In der Schleife:

Code: Alles auswählen

    //rendern etc...
    Frames++;
    if((SDL_GetTicks() - LastTime) >= 1000)
    {
        fps = Frames;
        Frames = 0;
        LastTime = SDL_GetTicks();
    }
   //Bewegungen:
    good_move_in_x = (1/fps) * bad_move_in_x;
Müsste klappen :)
Echt. Versuch es doch einmal, aber ich bin mir sicher das es zu einem sehr eigenartigen Verhalten führen wird, da die Geschwindigkeit jede Sekunde zuerst sprunghaftig ansteigen wird, und dannach wieder fallen wird, da die Variable Frames ja immer wieder auf 0 zurückgesetzt wird und dann wieder zunimmt. Der Wert der Variable 'fps' stimmt also nur einmal pro Sekunde...
dani93 hat geschrieben:Das Problem ist, dass speed auch einen Anfangswert braucht. Den kann ich aber höchstens für mich anpassen. Oder ich setze die Variable am Anfang auf 0 und im 1. Frame bewegt sich nichts.
Genau. Es ist völlig egal ob sich im ersten Frame schon was bewegt oder erst im zweiten. Ich glaub das wird keiner merken :D
dani93 hat geschrieben:Also weise ich die alte Position des vorhergehenden Blocks zu und Multipliziere zusätzlich noch mit speed.
Nein. Du musst alle Blöcke so bewegen wie den ersten auch. Also aktuelle Position + speed * Richtungsvektor.

Das was ich versucht hab dir zu erklären ist, dass du dann den Fall beachten musst in dem die Schlange abbiegt und die Blöcke in irgendeinem Frame die Richtung ändern müssen, damit sie auch immer dem ersten Block folgen.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: EatTheBlocks

Beitrag von Dirty Oerti » Do Jan 15, 2009 5:20 pm

Der Wert der Variable 'fps' stimmt also nur einmal pro Sekunde...
Nein.
Der Wert wird jede Sekunde neu berechnet.
Und zwar auf dem Durchschnitt der letzten Sekunde.
da die Geschwindigkeit jede Sekunde zuerst sprunghaftig ansteigen wird, und dannach wieder fallen wird, da die Variable Frames ja immer wieder auf 0 zurückgesetzt wird und dann wieder zunimmt.
Die Variable Frames und die Geschwindigkeit hängen ja auch nicht zusammen ;)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: EatTheBlocks

Beitrag von Xin » Do Jan 15, 2009 5:34 pm

Dominik hat geschrieben:mensch ladet auch halt die complimierten exen hoch will net immer das complimieren müssen ok kanns auch net :lol: solang es keine virus ist;)
No Pets allowed!
Weder Viren noch Reptilien.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: EatTheBlocks

Beitrag von Kerli » Do Jan 15, 2009 5:35 pm

Dirty Oerti hat geschrieben:
Der Wert der Variable 'fps' stimmt also nur einmal pro Sekunde...
Nein.
Der Wert wird jede Sekunde neu berechnet.
Und zwar auf dem Durchschnitt der letzten Sekunde.
da die Geschwindigkeit jede Sekunde zuerst sprunghaftig ansteigen wird, und dannach wieder fallen wird, da die Variable Frames ja immer wieder auf 0 zurückgesetzt wird und dann wieder zunimmt.
Die Variable Frames und die Geschwindigkeit hängen ja auch nicht zusammen ;)
Aja, stimmt. Da hab ich wohl zu schnell darübergelesen :) Ist einmal ein anderer Ansatz. Bei mir habe ich immer die Framezeiten der letzten 10 oder 20 Frames gemittelt und so die Framerate errechnet.

Es gibt nur ein Problem an diesem Code und zwar in der ersten Sekunde. Was glaubst du passiert bei 1/fps wenn fps 0 ist ;)

Ich kann nur sagen, dass es bei mir bis jetzt immer ganz gut funktioniert hat, wenn ich die Zeit des letzten Frames für die Bewegung im aktuellen Frame verwendet habe, auch wenn der Code eine sehr einfache Möglichkeit zeigt die FPS eigentlich sehr genau zu berechnen, auf die ich bis jetzt eigentlich noch gar nicht gekommen bin :)
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: EatTheBlocks

Beitrag von Dirty Oerti » Do Jan 15, 2009 5:40 pm

Dominik hat geschrieben:mensch ladet auch halt die complimierten exen hoch will net immer das complimieren müssen ok kanns auch net :lol: solang es keine virus ist;)

mfg
Und warum sollte ich das jedes mal mit Wine starten müssen?
Wäre ja recht besch***rt.

Durch den Source Code ist das ganze viel besser verbreitbar. Und auch auf alle Plattformen optimierbar, da das ja der Compiler beim compilieren macht.
Kerli hat geschrieben:Bei mir habe ich immer die Framezeiten der letzten 10 oder 20 Frames gemittelt und so die Framerate errechnet.
(...)
auch wenn der Code eine sehr einfache Möglichkeit zeigt die FPS eigentlich sehr genau zu berechnen, auf die ich bis jetzt eigentlich noch gar nicht gekommen bin :)
Ich wäre auf deine Idee nie gekommen :)
Dachte halt einfach : FPS = Frames PRO Sekunde. Also einfach gucken, wieviele Frames man in einer Sekunde hat...
Kerli hat geschrieben:Es gibt nur ein Problem an diesem Code und zwar in der ersten Sekunde. Was glaubst du passiert bei 1/fps wenn fps 0 ist ;)
Das ist ein Einwand ^^
Ok, dann sollte man FPS lieber am Anfang auf 800 oder so stellen (dann ist die Bewegung am Anfang, also im ersten Frame auf jedenfall langsam....)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: EatTheBlocks

Beitrag von nufan » Do Jan 15, 2009 6:36 pm

Dirty Oerti hat geschrieben: In der Schleife:

Code: Alles auswählen

    //rendern etc...
    Frames++;
    if((SDL_GetTicks() - LastTime) >= 1000)
    {
        fps = Frames;
        Frames = 0;
        LastTime = SDL_GetTicks();
    }
   //Bewegungen:
    good_move_in_x = (1/fps) * bad_move_in_x;
Müsste klappen :)
Ganz funktioniert das bei mir nicht...
Zuerst hatte ich beim Ausführen immer "Floating point exception". Dann hab ich bei der Division "fps" auf float gecastet, dann ging das mal. Jetzt geht mir alles ein wenig zu schnell. Es startet - und dann ist es auch schon wieder vorbei.
Dominik hat geschrieben:mensch ladet auch halt die complimierten exen hoch will net immer das complimieren müssen ok kanns auch net :lol: solang es keine virus ist;)
Jetzt will ich endlich mal die Geschwindigkeit fixen und beim nächsten Upload pack ich auch eine exe dazu.
Mehr als euch versprechen, dass es kein Virus ist kann ich wohl auch nicht. Und wer mir nicht vertraut muss sich wohl den Code ansehen und selber kompilieren ;)
Kerli hat geschrieben:Nein. Du musst alle Blöcke so bewegen wie den ersten auch. Also aktuelle Position + speed * Richtungsvektor.
Heißt das, ich muss mit jedem Block das machen, was ich jetzt schon nur mit dem ersten mache?

Code: Alles auswählen

      if (snake[0].direction == UP)
        snake[0].y -= 10.0 * (1.0 / (float) fps);
      
      else if (snake[0].direction == RIGHT)
        snake[0].x += 10.0 * (1.0 / (float) fps);
      
      else if (snake[0].direction == DOWN)
        snake[0].y += 10.0 * (1.0 / (float) fps);
      
      else if (snake[0].direction == LEFT)
        snake[0].x -= 10.0 * (1.0 / (float) fps);
Nur, dass ich jetzt schon fps verwende.
Kerli hat geschrieben:Es gibt nur ein Problem an diesem Code und zwar in der ersten Sekunde. Was glaubst du passiert bei 1/fps wenn fps 0 ist ;)
Im ersten Frame mal gaaanz langsam mit 1 FPS anfangen ;)

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: EatTheBlocks

Beitrag von Dirty Oerti » Do Jan 15, 2009 6:49 pm

dani93 hat geschrieben:Ganz funktioniert das bei mir nicht...
Zuerst hatte ich beim Ausführen immer "Floating point exception". Dann hab ich bei der Division "fps" auf float gecastet, dann ging das mal. Jetzt geht mir alles ein wenig zu schnell. Es startet - und dann ist es auch schon wieder vorbei.
Ja stimmt, casten sollte man das noch.
Warum es so schnell geht ist doch klar...

Du hast wahrscheinlich für deine Bewegung:

Code: Alles auswählen

bewegung = 10 * (1.0/(float)fps);
Am besten machst du dir eine Art "time" Variable. (So war das in der Engine von 3d GS gelöst).

Code: Alles auswählen

float time = (1.0/(float)fps)*0.5;
Die *0.5 sind dabei ein korrigierendes Element.
Nun berechnest du die Bewegung mit

Code: Alles auswählen

bewegung = NORMALE_BEWEGUNGSSTÄRKE * time;
Wichtig ist, dass du das korrigierende Element eben so einstellst, wie du es haben möchtest. (Damit könntest du sogar eine Zeitlupe realisieren^^).
dani93 hat geschrieben:Im ersten Frame mal gaaanz langsam mit 1 FPS anfangen ;)
1 FPS würde ein langsamer Rechner liefer. Lässt du das auf einem aber schnellen Rechner laufen ist die Geschwindigkeit deutlich größer. Du nimmst nämlich mal 1/FPS. Je größer FPS also, desto langsamer.
Aber es geht dabei ja eh nur um den ersten Frame...^^
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: EatTheBlocks

Beitrag von cloidnerux » Do Jan 15, 2009 6:58 pm

Nur nicht vergessen die Timevariable zu Aktualisieren, denn die Frames ändern sich zur laufzeit.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten