Wie mache ich ein Spiel?
-
Hall zusammen.
Ich programmiere gerade an einem Labyrinth-Spiel, welches Labyrinthe generiert, welche nachher gelöst werden können. Das ganze mache ich im Rahmen einer Prüfungsarbeit.Wer sich den aktuellen stand des Labyrinthes angucken will, kann das hier anschauen. Das Programm wird als Applet gemacht.
Ich habe jetzt gerade angefangen die Game Engine zu schreiben, und bin schon auf das erste Problem gestossen: Wie kriege ich die fps raus???
Ich habe einen Timer, welcher möglichst oft eine Aktualisierung der game engine aufruft. In dieser Aktualisierung wird die Spielfigur bewegt und Kollisionsberechnungen etc. gemacht.
Damit das Spiel aber immer gleich schnell läuft, muss ich die fps rauskriegen um die Geschwindigkeit pro Sekunde zu erhalten.Das ganze ist in 2D gehalten und dient nur dazu mich in die Materie zu vertiefen, es muss schlussendlich nicht unbedingt schön aussehen
Wäre froh um etwas Unterstützung, da ich erst seit 4 Wochen mit Java arbeite und erst seit 2 Wochen an dem Projekt.
Grüsse
Chiller
-
Statt einer FPS-Fixierung ist es geläufiger eine sogenannte Framebremse einzubauen. Das Stichwort sollte bei Google genügend Material ergeben.
MfG SideWinder
-
Baue einen Zähler ein, der bei jedem repaint hochzählt. Wenn (mindestens) eine Sekunde vergangen ist, weisst du wieviele Bilder pro Sekunde gezeichnet wurden. Der Zähler sollte dann wieder mit 0 initialisiert werden.
-
Steffo schrieb:
Der Zähler sollte dann wieder mit 0 initialisiert werden.
Ein Objekt wird nur 1 mal initialisiert. Und deine Methode ist unbrauchbar. Normalerweise misst man die Zeit.
-
314159265358979 schrieb:
Steffo schrieb:
Der Zähler sollte dann wieder mit 0 initialisiert werden.
Ein Objekt wird nur 1 mal initialisiert. Und deine Methode ist unbrauchbar. Normalerweise misst man die Zeit.
Mit Zeitmessung arbeitet meine Methode ja auch.
EDIT: @Chiller: Womöglich wäre das Buch "Developing Games in Java" von David Brackeen etwas für dich.
-
Zählen != Zeitmessung.
-
Ich schrieb:
Wenn (mindestens) eine Sekunde vergangen ist,...
Vielleicht kannst du mir erklären, wie man das ohne Zeitmessung anstellen kann!?
-
volkard hat sowas von Recht.
-
Ich glaube nicht, dass er meinte, Zählen == Zeitmessung.
Ich glaube, er meinte, Zählen + Zeitmessung = Framerate.
-
ntrnt schrieb:
Ich glaube nicht, dass er meinte, Zählen == Zeitmessung.
Ich glaube, er meinte, Zählen + Zeitmessung = Framerate.So ist es. Ich muss natürlich messen, wann eine Sekunde vergangen ist und in diesem Moment gucke ich, welche Zahl mir der Zähler ausspuckt, was dann der Framerate pro Sekunde entspricht.
EDIT: Man muss sich natürlich nicht 1 Sekunde Zeit lassen. Man kann auch weniger oder länger warten und muss dann dementsprechend hoch- oder runterrechnen.
-
Du kannst aber nicht festlegen, wann dein Code für "1 Sekunde" ausgeführt wird. Und im Endeffekt musst du eben doch wieder die Zeit messen, was deinen Zähler überflüssig macht.
-
314159265358979 schrieb:
Du kannst aber nicht festlegen, wann dein Code für "1 Sekunde" ausgeführt wird. Und im Endeffekt musst du eben doch wieder die Zeit messen, was deinen Zähler überflüssig macht.
Ich fürchte, du missverstehst mich. Mein Code wird nicht "1 Sekunde lang ausgeführt", sondern ich messe, wieviel Zeit ein repaint in Anspruch nimmt und addiere das zur Gesamtzeit (Zeitmessung). Wenn die Gesamtzeit >= 1 Sek. ist, dann gucke ich, was mein Zähler sagt (Frames per Second). Danach wird wieder Zähler, als auch der Wert der Variable "gesamtzeit" wieder auf 0 gesetzt.
Ja, die Zeit muss natürlich gemessen werden. Das sage ich doch schon die ganze Zeit. Wenn du eine Methode ohne Zählvariable kennst, dann sei doch so freundlich und beschreibe sie mal. Jeder hier ist offen, wie man etwas noch besser implementieren kann.L. G.
Steffo
-
Oh man.
-
314159265358979 schrieb:
Oh man.
Du bist auch ein bisschen schwer von Verstand, oder?
-
Jo.
-
Mensch, es muss nicht immer so schwer sein...
Ich mache es glaub ich so, dass ich bei jedem Aufruf gucke wie viel Zeit vergangen ist (neue Zeit - alte Zeit) und kann somit raus finden wie viel Zeit seit dem Letzten Frame vergangen ist.
Da der Benutzer keine Ahnung von fps haben muss, sondern die ganze Information nur intern verwendet werden muss, reicht diese Methode vollkommen.
Falls meine Überlgeung grundlegende Mängel aufweist, dann sagt es bitte.Ich brauche das auch nur, um die Geschwindigkeit der Spielfigur auf jedem PC gleich zu haben. Es wird auch kein Hightech Game, sondern dient einzig und alleine dazu, mich selber weiterzubilden und eine gute Note zu erhalten...
Gebräuchlich ist bei Labyrinthen ja, dass man eine Spielfigur um ein Feld verschiebt pro Tastendruck, ich habe aber vor, das ganze etwas dynamischer zu gestalten.
@Steffo:
Ich guck mir das Buch mal an, vlt hilft es ja.Grüsse
Chiller
-
@Chiller: Genau, so macht man das.
@Steffo: Deine Methode ist total ungenau (bzw ungleichmäßig ungenau). Wenn, dann nimmt man die Zeit der letzten X Frames, aber bestimmt nicht jede Sekunde einen Reset.
-
Ähmmmmm
Wie kann ich die Zeit rauskriegen?
Hab es mit java.awt.calendar versucht, aber irgendwie krieg ich das nicht zum laufen.
Ich brauche nur die Anzahl Milisekunden die seit dem Letzten Refresh vergangen sind.
Die FPS krieg ich dann mit der umkehrfunktion (1/x) raus.Grüsse
Chiller
-
probiers mit System.currentTimeMillis()
-
nein, dafür nimmt man seit 1.5: System.nanoTime();