Swing Aktives Zeichen für Spieleprogrammierung ?

kaoZ

Top Contributor
Ich hab beim stöbern mal dieses Tutorial gefunden ,

https://www.youtube.com/watch?v=9dzhgsVaiSo

(der Fehler im Video das er versucht das Graphics Objekt sich selbst zuzuweisen, fällt ihm selber am Ende des Videos auf 😀)

was mir aufgefallen ist , ist das der Ersteller hier aktiv über getGraphics(); zeichnet, anstatt dies passiv zu machen , ist es so das man es in der Spiele Programmierung so macht?

Normalerweise überschreibt man ja paint/paintComponent und führt alle Zeichenoperationen dort aus, nun ist die Frage wie sich dann in Verbindung mit dem Gameloop gestaltet, wäre super wenn mir da Fix jemand einen Hinweis oder einen Verweis auf ein Tutorial geben könnte.

Oder mir sagt ob hier tatsächlich nur die Möglichkeit besteht dies über das aktives Zeichnen zu realisieren.
 
Zuletzt bearbeitet:
ist es so das man es in der Spiele Programmierung so macht
Das ist ein Ansatz, der Vorteile bietet und deswegen wird er häufig eingesetzt.

Du möchtest ja eine hohe FPS-Rate haben und da stören ALLE Dinge, die du nicht unter Kontrolle hast.

Beispielsweise kann die JVM dein Fenster minimieren, unterbrechen und ähnliches, unter anderem
deshalb laufen viele Spiele im Vollbildmodus. Daher ist es angenehmer das Rendering eines Spiels selbst zu übernehmen und sich nicht darauf zu verlassen, das ein Paint-Request von der JVM erzeugt und an das Spiel weitergereicht wurde.
 
Also damit ich das jetzt auch richtig verstehe, wenn ich selber dafür sorgen will, das dann gezeichnet werden soll wann ich es für richtig halte , sprich z.B 60 (fps) mal pro Sekunde, sollte ich mich selbst um die Implementierung kümmern und einfach nur den Grafikkontext übergeben mit und oder auf welchem ich zeichnen möchte , um ggf. verzögerte aufrufe / ungewolltes Verhalten, durch die JVM wie es z.B beim anstoßen eines neuzeichnens durch repaint(); der Fall sein kann zu unterbinden ?

Das Rendering ist ja letzen endes nur die Umsetzung der Darstellung, sprich das was ich dann in der draw(Graphics g) oder drawToScreen(Graphics g) Methoden implementiere, und mir dann über den Grafikkontext des Systems auf den jeweiligen Panel / Frame etc. gezeichnet wird.

Könnte man es so stehen lassen oder findest du noch gravierende Fehler ?
 
Zuletzt bearbeitet:
Ja, ist richtig.

Um zum Beispiel Flackern während des Neuzeichnens zu verhindern, wird oft in ein separates BufferedImage off-screen gemalt und dann alles auf einmal "gezeichnet". Dieses Double-Buffering macht beispielsweise Swing intern ebenfalls.
 
Ahhh, alles klar.

Also könnte man nun hergehen und z.B ein Menü ruhig so implementieren :

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;

public class GameMenu {
	
	private String[] options;
	
	public GameMenu() {
		addDefaultOptions();
    }
	
	public GameMenu(String...options){
		this.options = options;
	}
	
	public void draw(int x, int y, int offset, Graphics g){
		
		Graphics2D g2d = (Graphics2D) g;
		
		for (int i = 0; i < options.length; i++) {
	        g2d.drawString(options[i], x, y + offset);
        }
		
	}
	
	private void addDefaultOptions(){
		this.options = new String[]{"New Game","Load Game","Options", "Quit"};
	}
}

und dann in der Spielklasse und dessen draw() methode , dem Menü einfach den Grafikkontext übergeben auf welchem ich es zeichnen lassen möchte, z.B eine Hintergrundgrafik ( BufferedImage ), welche ja bei Ihrer Instanziierung ihr eigenes Graphics Object vom System erhält.

Also sollte man auch das Zeichnen / das rendering des Hintergrundes auf den eigentlichen JPanel dann selbst übernehmen ja, und auch hier vermeiden per paintComponent zu zeichnen da ja auf dieser Grafik so gut wie alle Aktionen ausgeführt werden ?

[EDIT]Für einen einfachen Testlauf wird doch aber ein einfaches Zeichen reichen oder ?
das mit dem buffering / vorzeichnen kann man doch später wenn es komplexer wird doch einfach implementieren oder ?
[/EDIT]
 
Zuletzt bearbeitet:
Viel Glück und Erfolg!

Daran merke ich, wie schnell die Zeit rennt. Meine Zertifizierung war noch zu SUN-Zeiten und da hiessen sie noch SCJP bzw. SCJD.
 
Vielen Dank 😉

Naja, da ich das hier alles in Eigenregie mache , dauert es immer ein wenig, ich muss leider nebenbei noch auf Schicht 😀

Aber ich bin doch recht zuversichtlich, insofern ich die ganzen Fallstricke drauf hab ( irgendwann ), sollte das schon klappen, ich muss mich lediglich noch öfter mit nicht von mir geschriebenem Code auseinandersetzen, da der doch teilweise recht schwer zu lesen ist , und eben darauf auch ein großer teil der Zertifizierungs-tücken beruht ^^

mal abgesehen davon das die OCA nur in technischem Englisch abgelegt werden kann :toll:
 

Zurück
Oben