EatTheBlocks

Präsentation und Organisation von eigenen Projekten
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 11:56 pm

Dirty Oerti hat geschrieben:Aber es geht dabei ja eh nur um den ersten Frame...^^
Nein, mit dieser Methode geht es um eine ganze Sekunde. Deshalb nehme ich auch bei mir die Zeit des vorherigen Frames, weil sich die Geschwindigkeit so schneller anpassen kann und auch nur ein einziges Frame eine Geschwindigkeit von 0 haben kann.

Ein weiteres Problem, wenn die Framerate nur jede Sekunde einmal aktualisiert wird tritt dann auf, wenn ein oder mehrere Frames einmal besonders lange brauchen. Stellt euch vor in einer bestimmten Sekunde verbraucht irgendein anderer Prozess plötzlich so viel Leistung, dass das Spiel nur mehr ein oder zwei Bilder rendern kann. Jetzt wird die Framerate aktulisiert und dieser Prozess ist fertig und plötzlich kann das Spiel wieder zb 50 Bilder in einer Sekunde rechnen.
Jetzt wird sich das Spiel dann eine Sekunde lang mit der Bewegungsweite die einer Framrate von 2 FPS entsprechen würde bewegen und das aber 50 mal. Ein Objekt das sich vorher zb 4 Pixel in einer Sekunde bewegt hätte bewegt sich jetzt plötzlich 100 Pixel in der nächsten Sekunde. Und so ein Verhalten kann man in einem Spiel nicht gebrauchen.

Deshalb ist es auch der übliche Weg über die Dauer des vorherigen Frames zu gehen und eventuell um Rechenleistung zu sparen die Framerate auf eine gewisse Obergrenze einschränken.
"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 » So Jan 18, 2009 9:16 pm

Stimmt. Es geht um die erste Sekunde. Jeden Frame würde ich das nicht neu berechnen. Das führt zu sehr unstabilen Werten, wenn der Computer einmal länger gebraucht hat.
Das kann man aber auch ändern:

Code: Alles auswählen

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

Code: Alles auswählen

    //rendern etc...
    Frames++;
    if((SDL_GetTicks() - LastTime) >= 100)
    {
        fps = Frames* (1000/ 100);
        Frames = 0;
        LastTime = SDL_GetTicks();
    }
   //Bewegungen:
    good_move_in_x = (1/fps) * bad_move_in_x;
Damit aktualisierst du alle 0.1 Sekunden. Und du hast 1 Frame Ungenauigkeit, was du nie wegbekommen kannst.
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 » Mo Jan 19, 2009 7:22 pm

Ich hab mal versucht das so umzusetzen.
Diesmal hab ich mich auch mit VC++ rumgeplagt...
Die exe hab ich auf Vista getestet. Der Changelog dürfte aus den hier erklärten Gründen nicht richtig lesbar sein.
*klick*
Hoffe, dass das mit der Geschwindigkeit endlich passt...

Ist auch recht groß. Ungepackt 6.3 MB davon 6 MB Windows. Was davon muss wirklich rein und was kann ich da rauslöschen? Und der letzte Gameover-Screen wird unter Windows auch nicht angezeigt.

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

Re: EatTheBlocks

Beitrag von nufan » Di Feb 10, 2009 7:51 pm

Mal wieder ein Update von mir :)

Der Code ist auf über das 6-fache gewachsen (2453 Zeilen). Muss ja noch nichts heißen ;)

Die wichtigsten Änderungen:
* Für die Schlange wird kein Array sondern eine doppelt verkettete Liste verwendet.
* Der Code ist kommentiert. Ich glaube die Quantität ist nicht schlecht, an der Qualität kann man noch feilen :)
* Neue Ordnerstruktur. Die Schrift liegt jetzt im selben Ordner wie das Programm (Windows hatte glaube ich was gegen "./fonts/arial.ttf"...).
* Highscoreliste (schummeln ist ziemlich einfach, wenn man sich bisschen mit Files auskennt ^^)
* direkte Eingabe bei Highscorelist mittels SDL-Events (Großbuchstaben, Kleinbuchstaben, Ziffern (auch vom Ziffernblock), @, und ein paar andere Sonderzeichen)
* Menü
* über Parameter konnte man die Auflösung temporär ändern, jetzt gehts auch Ingame und permanent mittels config-file.
* keine Windows exe mehr *
* verbessertes makefile
* keine Konsolenausgaben mehr (Fehler werden in die Datei "error.log" geschrieben)
* RAM-Verbrauch ist auf 2 MB gestiegen. Das sollte aber noch jeder packen ;)

* Visual C++ meldete tausende Fehler wo gcc und g++ nicht mal eine Warnung ausgeben... hab die selbe Projektmappe wie das letzte Mal verwendet als es noch ging...

Details finden sich unter /doc/CHANGELOG

Eine Frage hab ich aber noch:
Man kann unter "Settings" die Einstellungen ändern. Ist es sicher eine zweites mal SDL_SetVideoMode aufzurufen?
Außerdem funktioniert bei mir 1440*900 Vollbild nicht, obwohl das die Standardauflösung des Monitors ist. Das Fenster zuckt immer wie wild und bleibt dann schließlich im Fenstermodus.
Erstellt

Code: Alles auswählen

SDL_SetVideoMode (800, 600, 16, SDL_FULLSCREEN | SDL_DOUBLEBUF);
überhaupt ein doppelgepufftertes Vollbildsurface oder ist das wirklich ein "oder", das das zweite wählt, wenn das erste fehlschlägt?

Die Bewegung kommt mir immer noch etwas ruckelig vor...

Unter Einstellungen soll irgendwann auch mal die Steuerung frei wählbar sein. Ich schätze dazu werden wieder globale Variablen gebraucht, sonst wird das ziemlich aufwendig. :(

Über ein Feedback würde ich mich freuen :)
Link

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: EatTheBlocks

Beitrag von +Fuss+ » Di Feb 10, 2009 8:33 pm

Das sind ja ein paar Zeilen mehr als vorher...

Bei mir gibt es Probleme mit der Geschwindigkeit!
ich habe nur kurz gespielt und dabei festgestellt dass die Geschwindigkeit zwischendurch für kurze Zeit spürbar abnimmt und dann wieder ansteigt.
Bei zweiten Spielstart war es nicht so extrem (glaub ich jedenfalls)

Die Highscore als versteckte Datei hab ich schon gefunden. Aber wie öffnet man diese am Besten (Zeichenkodierung)???

MfG Fuss

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

Re: EatTheBlocks

Beitrag von nufan » Di Feb 10, 2009 8:40 pm

Huhu ein Tester :)
+Fuss+ hat geschrieben:Bei mir gibt es Probleme mit der Geschwindigkeit!
ich habe nur kurz gespielt und dabei festgestellt dass die Geschwindigkeit zwischendurch für kurze Zeit spürbar abnimmt und dann wieder ansteigt.
Wie gesagt
dani93 hat geschrieben:Die Bewegung kommt mir immer noch etwas ruckelig vor...
Ich weiß leider auch nicht wirklich woran das liegt.
+Fuss+ hat geschrieben:Die Highscore als versteckte Datei hab ich schon gefunden. Aber wie öffnet man diese am Besten (Zeichenkodierung)???
Die Datei ist außerhalb des Spiels nicht richtig zu öffnen (jedenfalls nicht ohne ein anderes Programm).
1. Sicherheitsstufe, Datei versteckt ;)
Die sollte von jedem der sich ein bisschen mit Computer auskennt zu knacken sein.
Stufe 2 ist wie du schon gemerkt hast eine Binärdatei :D
Du kannst sie über die Konsole mit

Code: Alles auswählen

od .scores
öffnen. Ob dir das was bringt ist eine andere Sache ;)
Wie gesagt, wenn man sich mit Files ein bisschen auskennt und dazu noch den Quellcode des Spiels hat kann man sich binnen 5 Minuten ein Programm schreiben um die Liste zu manipulieren. Aber warum sollte ein Programm zum Cheaten für mein eigenes Spiel schreiben? :D

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: EatTheBlocks

Beitrag von +Fuss+ » Di Feb 10, 2009 8:47 pm

Code: Alles auswählen

0000000 000010 000000 062504 067156 071551 000000 124261 004004
0000020 053060 004244 000002 000000 062504 067156 071551 000000
0000040 000000 000000 037764 133777
0000050
interessant.

Das mit den 5 Min sollte stimmen.

Zur Geschwindigkeit:
Ein einfacher Ausweg wäre vielleicht, wenn du mehrere Level erstellst.
In jedem Level konstante Geschwindigkeit, im nächsten etwas schneller (vielleicht auch mehr Punkte?) und so weiter...

MfG Fuss

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

Re: EatTheBlocks

Beitrag von nufan » Di Feb 10, 2009 9:05 pm

+Fuss+ hat geschrieben:

Code: Alles auswählen

    0000000 000010 000000 062504 067156 071551 000000 124261 004004
    0000020 053060 004244 000002 000000 062504 067156 071551 000000
    0000040 000000 000000 037764 133777
    0000050


interessant.
Tja, das sind deine Highscores ;)
Wenn du sie in ASCII haben willst, solltest du den -c Flag von od verwenden :) Dann kann man Teile erkennen.
+Fuss+ hat geschrieben:Zur Geschwindigkeit:
Ein einfacher Ausweg wäre vielleicht, wenn du mehrere Level erstellst.
In jedem Level konstante Geschwindigkeit, im nächsten etwas schneller (vielleicht auch mehr Punkte?) und so weiter...
Das habe ich teilweise auch jetzt schon.
Konstante Geschwindigkeit ist schlecht, da die Geschwindigkeit von den FPS abhängig sein muss. Ich berechne mir die FPS und multipliziere mit dem Level (Zeile 1492: speed = 1 / fps * level;). Daraus wird dann die Bewegung berechnet. Mehr Punkte... naja... pro gefressenem Block erhöht sich das Level um 0.01. Ich denke nicht, dass es gut aussieht wenn man am Ende einen Score von 15.01233378 oder so hat...

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

Re: EatTheBlocks

Beitrag von Kerli » Do Feb 12, 2009 12:46 pm

dani93 hat geschrieben:Mal wieder ein Update von mir :)
Schon langsam wird es ja richtig spielbar *thumbs up* :)
dani93 hat geschrieben: Der Code ist auf über das 6-fache gewachsen (2453 Zeilen). Muss ja noch nichts heißen ;)
Bei der Größe solltest du dir aber langsam einmal überlegen wie du den Code auf mehrere Dateien aufteilst. Sonst wird es doch etwas unübersichtlich.

dani93 hat geschrieben:* Der Code ist kommentiert. Ich glaube die Quantität ist nicht schlecht, an der Qualität kann man noch feilen :)
Ich glaube das hast du wirklich etwas übertrieben ;)

Solche Kommentare sind doch ziemlich überflüssig da der Code sowieso selbsterklärend ist:

Code: Alles auswählen

switch (action) // switch the action

Code: Alles auswählen

draw_highscorelist (-1);  // show highscorelist
Und auch welche Funktionen in den Standardbibliotheken stehen brauchst du nicht dazuschreiben. Das sollte wohl klar sein ;)
dani93 hat geschrieben:* Highscoreliste (schummeln ist ziemlich einfach, wenn man sich bisschen mit Files auskennt ^^)
Wenn keine Highscoredatei vorhanden ist könntest du eventuell auch eine Fehlermeldung ausgeben. So weis man nicht so ganz was passiert. Du könntest auch einfach trotzdem die Highscore anzeigen und "keine Einträge vorhanden" hinschreiben.
dani93 hat geschrieben:* verbessertes makefile
Halte dich doch an die üblichen Konventionen und mach auch ein 'all'-Target.
dani93 hat geschrieben:Eine Frage hab ich aber noch:
Man kann unter "Settings" die Einstellungen ändern. Ist es sicher eine zweites mal SDL_SetVideoMode aufzurufen?
Ja, du solltest nur vorher die alte Surface freigeben, die du beim ersten Aufruf von SDL_SetVideoMode erhalten hast.

dani93 hat geschrieben:Erstellt

Code: Alles auswählen

SDL_SetVideoMode (800, 600, 16, SDL_FULLSCREEN | SDL_DOUBLEBUF);
überhaupt ein doppelgepufftertes Vollbildsurface oder ist das wirklich ein "oder", das das zweite wählt, wenn das erste fehlschlägt?
Das ist ein binäres 'oder'. Es werden allso beide Flags verwendet.
"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
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: EatTheBlocks

Beitrag von fat-lobyte » Do Feb 12, 2009 1:03 pm

Hi!
Nett wäre noch eine kleine Anmerkung zu den abhängigkeiten. Ich hab keine SDL Entwicklerbibliotheken installiert, und kann dementsprechend das spiel auch nicht kompilieren. Vielleicht solltest du für die wichtigsten Distributionen die benötigten Pakete dazuschreiben.
Haters gonna hate, potatoes gonna potate.

Antworten