# Fullscreen Mode und Canvas



## JavaException (31. Aug 2010)

Hi,
habe ein kleines Spiel mit Hilfe eines Tutorials erstellt und wollte jetzt nachträglich noch etwas rumspielen. Hab mir gedacht ich könnte das Ding mal im Fullscreen Mode laufen lassen. Allerdings bekomm ich da nur ein schwarzes Bild mit Mauszeiger. Maus kann ich bewegen, allerdings wird nicht bis zum Bildschirmrand. Liegt möglicherweise auch an der Auflösung von 600x800. So, hier mal der Code-Ausschnitt:


```
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();

Frame f = new Frame(gd.getDefaultConfiguration());
gd.setFullScreenWindow(f);
        if (gd.isDisplayChangeSupported()) {
        gd.setDisplayMode(new DisplayMode(800, 600, gd.getDisplayMode().getBitDepth(),  
                                  gd.getDisplayMode().getRefreshRate()));
        }

f.add(this);
f.setBackground(Color.black);
f.pack();
f.setVisible(true);
```

Das ganze befindet sich im Konstruktor der Klasse, die von Canvas abgeleitet ist.
Also : WIDTH und HEIGHT des Canvas liefern mir den Wert 1. Habe auch schon

```
w = gd.getDisplayMode().getWidth();
h = gd.getDisplayMode().getHeight();
this.setPreferredSize(new Dimension(w, h));
```

ausprobiert.

Mit 
	
	
	
	





```
f.setExtendedState(Frame.MAXIMIZED_BOTH);
```
 funktionierts, allerdings ist das dann nur die Desktop Auflösung oder?

Ich zeichne dann die Inhalte in der paint() Methode.

Kann mir wer weiterhelfen?

[Edit]
Hätte gleich noch ne andere Frage und will jetzt keinen neuen Beitrag aufmachen.
Also, hab noch ein bissl rumgespielt und mal mit

```
System.setProperty("sun.java2d.opengl", "true");
```
opengl aktiviert, allerdings bekomm ich da auch nur ein schwarzes Bild. Reicht das dann nicht wenn 
ich einfach Graphics2D benutze? Was kann da noch falsch sein?

Und noch ne Frage zum Schluss:
Wenn ich ein 2D Spiel programmieren will mit Hardwareunterstützung, benutze ich dann Java 2D (also so wie oben erwähnt mit Graphics2D und dann Opengl einschalten(wenns denn so überhaupt funktioniert) oder programmiert man dann mit JOGL?
Für mich als Einsteiger ist JOGL noch etwas kompliziert. Ich frage mich halt obs nötig ist für 2D Spiele. Habe jetzt schon mehrere Spiele Tutorials durchgemacht (ganz normal JavaSE), aber irgendwie läuft das nie so richtig flüssig.


----------



## Friedhelm (31. Aug 2010)

Hmmm... also ich mache das so:

[Java]

	final JFrame jFrame = new JFrame(); 



			Color color = new Color(0,0,0);

			jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			jFrame.setTitle(title);

			Dimension d = Toolkit.getDefaultToolkit().getScreenSize();			
			jFrame.setLocation(0,0);			
			jFrame.setResizable(false);				
			jFrame.setSize(800, 600);			
			jFrame.setUndecorated(true);			
			jFrame.setLayout(null);
			jFrame.setBackground(color);
			jFrame.setVisible(true);	
			jFrame.setFocusable(true);
			jFrame.setResizable(false);

			GraphicsDevice graphicsDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();				

				if(graphicsDevice.isFullScreenSupported())	graphicsDevice.setFullScreenWindow(jFrame);									

				try {

					DisplayMode dm = new DisplayMode(800, 600, 16, 60);
					graphicsDevice.setDisplayMode(dm);				
				}
				catch(Exception e) { System.exit(0); }
			}


[/Java]


----------



## JavaException (31. Aug 2010)

Habs jetzt hinbekommen. Lag an den Parametern für bitDepth und RefreshRate. Allerdings funktionierts immer noch nicht so 100%ig. Also wenn ich mir die BreitexHöhe ausgeben lasse, dann hat mein Frame die eingegebenen 800x600 (auch wenn ich diese zuvor nicht mit setSize gesetzt habe. Ist das Standard oder wirkt sich da setDisplayMode irgendwie drauf aus?). Das Canvas hat allerdings 1440x900 (ist meine aktuell eingestellte Bildschirmauflösung des Desktop). Die Grösse des Canvas lässt sich nur ändern wenn ich mit setSize() die Auflösung umstelle, allerdings funktioniert das nur nach der Zeile "setFullscreenWindow(Frame)". Wenn ich das vorher mache, dann habe ich wieder die 1440x900.
Habe jetzt also die Auflösung des Canvas danach geändert, habe jetzt aber links und rechts am Bildschirm einen Rand. Also Frame und Canvas haben jetzt 800x600, der ganze Bildschirm ist auch schwarz, aber die Zeichenfläche wird eben durch diese Ränder begrenzt. Würde eigntlich gar nicht auffallen, habe aber ein kleines 2d Spiel gemacht und merke das, wenn ich mit der Spielfigur nicht ganz bis zum Bildschirmrand gehen kann.


----------



## Friedhelm (1. Sep 2010)

Das man die Canvasgröße erst nach setFullscreen ändert ist richtig.

Der Rand ist auch in Ordnung, weil wenn man einen 16:9 LCD hat, dann ist halt bei 800x600 (4:3) Platz der nicht genutzt werden kann. Lösung => eine 16:9/16:10 Auflösung benutzen 

Ansonsten kein Fullscreen einschalten, dann hat man 800x600 nativ


----------



## JavaException (2. Sep 2010)

Vielen Dank für deine Hilfe. Funktioniert jetzt wirklich alles super (mit der passenden Auflösung hab ich dann auch richtig Vollbild 

Jetzt hätt ich trotzdem noch ein paar Fragen:

Also: Hab jetzt schon einiges in Richtung 2D Spiele programmierung gemacht und wollt mal fragen welche Technik man so prinzipiell anwendet. Ich will vorallem auf Performance-Verbesserungen hinaus.

-Aktiviert man einfach per "System.setProperty("sun.java2d.opengl", "true");" die OpenGL Pipeline und 
 zeichnet dann mit Graphics2D. Ich habe das jetzt mit einem Canvas benutzt, hätte man mit Swing 
 Komponenten eig. noch einen grösseren Vorteil?
-Oder bringt JOGL sogar noch mehr Performance(Kenn mich mit JOGL allerdings noch gar nicht aus)?
 Macht es überhaupt viel Sinn für 2D Spiele JOGL zu benutzen?


----------



## Friedhelm (3. Sep 2010)

JavaException hat gesagt.:


> -Aktiviert man einfach per "System.setProperty("sun.java2d.opengl", "true");" die OpenGL Pipeline und
> zeichnet dann mit Graphics2D. Ich habe das jetzt mit einem Canvas benutzt, hätte man mit Swing
> Komponenten eig. noch einen grösseren Vorteil?
> -Oder bringt JOGL sogar noch mehr Performance(Kenn mich mit JOGL allerdings noch gar nicht aus)?
> Macht es überhaupt viel Sinn für 2D Spiele JOGL zu benutzen?




Also ich habe schon viel mit 2D und Java probiert... und alles was ich bisher getestet habe war "rukelig". Es hat keinen Spass gemacht. Man kommt zwar nah an ruckelfrei ran, aber das wars auch schon. Auch wenn man System.setProperty("sun.java2d.opengl", "true") aktiviert, hatte ich immer Performanceprobleme. Kann sein das ich keine Ahnung habe und hier ein Java 2D Crack Schreit "Oh mein Gott", aber ich habs nie hinbekommen.

Dann habe ich Jake2 (Quake2 in Java) gesehen das OpenGL für Java benutzt... und da ging mir ein Licht auf. Seit dem arbeite ich mit LWJGL 2.5 oder JOGL2 (eigentlich gleichzeitig... ich schalte ab und zu mal um).

Und da ist es, zumindest wenn man Fullscreen aktiviert wirklich flüssig. Im Windows-Modus ruckelt es je nachdem was sich auf dem übrigend Bildschirm so tut. Aber das reicht mir.

Der große Vorteil bei JOGL/LWJGL... ich kann jetzt ca. 2000 bewegte und rotierende 2D Flächen gleichzeitig auf den Screen flitzen lassen, ohne das es ruckelt und das war mein Ziel. Ausserdem kann man jetzt, wenn man sich in JOGL/LWJGL eingearbeitet hat auch leichter auf Android umsteigen, oder für beide Plattformen entwickeln. Das ist schon nett 

Ich kann ganz klar eine Empfehlung JOGL/LWJGL zu benutzen geben.


----------

