Es geht mir um ein altbekanntes Thema: Jedem ist wohl klar, dass ein Spiel unabhängig von der Rechenleistung auf jedem Rechner gleich schnell laufen sollte. Also ist es meist am einfachsten, alle Bewegungen abhängig von der "Framedauer" (Berechnungen + Neuzeichen) zu machen.
In Java habe ich bislang nur Minispiele geschrieben, wo man das nicht braucht. In C++ habe ich schon Spielchen mit dieser Technik geschrieben, wo ich einfach die Zeit vor und nach Berechnungen und dem Zeichnen ermittle und dann mit der Differenz entsprechend weiterarbeite.
Jetzt habe ich in Java einen Thread mit meiner Programmschleife laufen:
Das Problem ist ja, dass repaint() nicht wirklich zeichnet, sondern die JVM nur anweist, bei der nächsten Möglichkeit neu zu zeichnen. Ich könnte also so wie es im moment ist, die Framedauer nur abhängig davon machen, wielange das Berechnen dauert, nicht aber von der benötigten Zeit zum Neuzeichnen.
Wie kann man das Problem lösen? Kann ich irgendwie warten, bis neu gezeichnet wurde oder das Zeichnen direkt erzwingen? Oder würdet ihr mir einen ganz anderen Ansatz empfehlen?
Das zweite Problem bezieht sich auf die Berechnungen, z.B. von Bewegungen. In C++ habe ich mit OpenGL gearbeitet, was bei der Ausgabe sowieso immer float oder double akzeptiert hat. Arbeite ich in Java mit Graphics2D dann brauche ich Ganzzahlen. Wenn ich jetzt bei den Berechnugen (Positionen, Bewegung ...) mit double oder float arbeite, da sich ja z.B. die Position nicht bei jedem Frame um einen ganzen Pixel ändert, muss ich ja beim Zeichen entsprechend casten. Kostete mich das sehr viel Zeit? Gibt es vll. eine bessere Lösung?
In Java habe ich bislang nur Minispiele geschrieben, wo man das nicht braucht. In C++ habe ich schon Spielchen mit dieser Technik geschrieben, wo ich einfach die Zeit vor und nach Berechnungen und dem Zeichnen ermittle und dann mit der Differenz entsprechend weiterarbeite.
Jetzt habe ich in Java einen Thread mit meiner Programmschleife laufen:
Code:
/*Pseudocode*/
SPIELETHREAD {
// ...
SCHLEIFE {
startzeit = aktuelleZeit();
brechneAlles(framedauer);
myJPanel.repaint(); // die Problemstelle
framdauer = aktuelleZeit() - startzeit;
// ...
}
}
Wie kann man das Problem lösen? Kann ich irgendwie warten, bis neu gezeichnet wurde oder das Zeichnen direkt erzwingen? Oder würdet ihr mir einen ganz anderen Ansatz empfehlen?
Das zweite Problem bezieht sich auf die Berechnungen, z.B. von Bewegungen. In C++ habe ich mit OpenGL gearbeitet, was bei der Ausgabe sowieso immer float oder double akzeptiert hat. Arbeite ich in Java mit Graphics2D dann brauche ich Ganzzahlen. Wenn ich jetzt bei den Berechnugen (Positionen, Bewegung ...) mit double oder float arbeite, da sich ja z.B. die Position nicht bei jedem Frame um einen ganzen Pixel ändert, muss ich ja beim Zeichen entsprechend casten. Kostete mich das sehr viel Zeit? Gibt es vll. eine bessere Lösung?