# FullScreenExlusiveMode HILFE!!!



## radiac (26. Aug 2009)

Hallo Leute,


Habe ein Problem...

Ich möchte mein Spiel mit FullExclusiveMode laufen lassen.

Jedoch klappt das nicht, wenn ich meine Grafiken laden möchte. Strings usw... werden aber einwandfrei angezeigt.  Hier mal der Code der Probleme macht.


```
public Graphics gScr;
   ...


 protected void screenUpdate()
  // use active rendering
  { try {
      gScr = bufferStrategy.getDrawGraphics();
      gameRender(gScr);
      gScr.dispose();
      if (!bufferStrategy.contentsLost())
        bufferStrategy.show();
      else
        System.out.println("Contents Lost");
      // Sync the display on some systems.
      // (on Linux, this fixes event queue problems)
      Toolkit.getDefaultToolkit().sync();
    }
    catch (Exception e)
    { e.printStackTrace();
      running = false;
    }
  }  // end of screenUpdate()
```

Da sich dieser Code in einer abstrakten Klasse befindet, muss ich Ihn in meiner Main.Klasse die Methode gameRender(); ausführen.

Hier die gameRender() Methode:

```
protected void gameRender(Graphics gScr) {

    if(isStarted()){
    map.drawVisibleMap(gScr);  <-- ScrollMAP
    Tier.drawObjects(gScr);   <--- Objekt
    }else{
    gScr.setColor(Color.black);
    gScr.drawString("Press Enter!", 400, 300);
    }
    gScr.setColor(Color.red);
    gScr.drawString(Long.toString(fps),20,20);
    }
```

Aber wenn ich das ausführe, bekomme ich folgende Exception:
java.lang.NullPointerException
        at Main.ScrollGame.gameRender(ScrollGame.java:174)
        at Game.GamePanel.screenUpdate(GamePanel.java:209)
        at Game.GamePanel.run(GamePanel.java:200)
        at java.lang.Thread.run(Thread.java:619)


Lasse ich aber die Methode gameRender(); anstatt der oberen laden, funktioniert alles:

```
@Override
    protected void gameRender(Graphics gScr) {
    // clear the background
    gScr.setColor(Color.white);
    gScr.fillRect (0, 0, pWidth, pHeight);
    gScr.setFont(font);
    gScr.setColor(Color.black);
    gScr.drawString(Long.toString(fps),400,300);
    }
```

Ich finde einfach nicht den Fehler... kann mir jemand Helfen???

Danke sehr! :toll:


----------



## Spacerat (26. Aug 2009)

Kann eigentlich nur an "map" oder "Tier" liegen... eines oder beides ist null. Hast du 'ne IDE? Einfach mal 'nen Breakpoint in besagter Zeile 174 setzen und debuggen.


----------



## radiac (26. Aug 2009)

Okay, ich weis jetzt wo der Fehler ist:


```
display = new Rectangle2D.Double(0,0,parent.getWidth(),parent.getHeight());
```

display soll wie oben diese Werte aufnehmen.
parent ist die main Klasse mit der ich mein Java Programm starten möchte.
Dort hat mein Programm, bevor ich es auf FSEM umgebaut habe die Werte für getWidth() und getHeight() hergenommen.
Da ich jetzt aber diese Werte in einer abstrakten Klasse zuweise, bekommt die Main Methode keine Werte mehr zurück, da sich die Größezuweisung des Panels in der Abstrakten Klasse (ScrollGame abspielt. Hier die Zuweisung in der Abstrakten Klasse.

```
private void initFullScreen()
  {
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    gd = ge.getDefaultScreenDevice();

    setUndecorated(true);
    setIgnoreRepaint(true);
    setResizable(false);

    if (!gd.isFullScreenSupported()) {
      System.out.println("Full-screen exclusive mode not supported");
      System.exit(0);
    }
    gd.setFullScreenWindow(this); // switch on full-screen exclusive mode

    setDisplayMode(800, 600, 32);   // WERT ZUWEISUNG FÜR GRÖßE DES PANELS!!!!
    //setDisplayMode(1024, 768, 32);

    pWidth = getBounds().width;
    pHeight = getBounds().height;

    setBufferStrategy();
  }  // end of initFullScreen()

...

private void setDisplayMode(int width, int height, int bitDepth)
  // attempt to set the display mode to the given width, height, and bit depth
  {
    if (!gd.isDisplayChangeSupported()) {
      return;
    }

      if (!isDisplayModeAvailable(width, height, bitDepth)) {
      return;
      }

      DisplayMode dm = new DisplayMode(width, height, bitDepth,
      DisplayMode.REFRESH_RATE_UNKNOWN);   // any refresh rate
      try {
      gd.setDisplayMode(dm);
      }
      catch (IllegalArgumentException e)
      {}

      try {  // sleep to give time for the display to be changed
      Thread.sleep(1000);  // 1 sec
      }
      catch(InterruptedException ex){}
  }  // end of setDisplayMode()



    private boolean isDisplayModeAvailable(int width, int height, int bitDepth)

    { DisplayMode[] modes = gd.getDisplayModes();


    for(int i = 0; i < modes.length; i++) {
    if (width == modes[i].getWidth() && height == modes[i].getHeight() &&
    bitDepth == modes[i].getBitDepth())
    return true;
    }
    return false;
    }  // end of isDisplayModeAvailable()*/
```

Hier werden die Werte in Zeile 16 für das Panel (Fenster) zugewiesen. Auch kann ich die Werte aus pWidht, und pHeight ausrufen lassen.... Diese werden auch als Strings in meinem Programm angezeigt.

```
gScr.drawString("Abmessungen"+pWidth+"/"+pHeight, 100, 100);
```

Da habe ich mir gedacht, das ich einfach anstatt die parent.getHeight, die pHeight angebe usw... jedoch scheint das dort garnicht durchzukommen...

Wie kann ich es schaffen, das trotzdem in der eigentlichen parent class Main eine größe übergeben wird??? 

So sieht sie momentan aus:

```
public static void main(String[] args){
		new ScrollGame();
	}

	   public ScrollGame(){
            super();
    }
```

Und so sah sie früher aus:


```
public static void main(String[] args){
		new ScrollGame(800,600); //<--- parent.getWidth() hat hier funktioniert!!!!
	}

	   public ScrollGame(int w, int h){
            super(w,h);
    }
```

In Zeile 2 wurden dann die Werte für das display Objekt rausgeholt. Jetzt geht das nicht mehr. Ich will einfach die 800x600 extra drin stehen haben... oder die Möglichkeit haben, das die getWidth() für das display Objekt gefüllt sind.

offiziell sagt mir der debugger das hier null ist:

```
public boolean intersects(Rectangle2D r) {
	return intersects(r.getX(), r.getY(), r.getWidth(), r.getHeight());
    }
```


```
public boolean intersects(double x, double y, double w, double h) {
	if (isEmpty() || w <= 0 || h <= 0) {
	    return false;
	}
	double x0 = getX();
	double y0 = getY();
	return (x + w > x0 &&
		y + h > y0 &&
		x < x0 + getWidth() &&
		y < y0 + getHeight());
```

Ich bekomms auf jedenfall nicht hin ohne alles umzuwerfen... vielleicht weis einer von euch wie das geht. Aber bedenkt das ich kein Profi bin xD. Ist mein erstes Spiel :bae:
Aber en bissl blicken tu ich es, sonst wäre ich nicht so weit . Ich denke auch, das es ein mini Fehler ist, und mir nur das know How fehlt das zu blicken wie der wegzumachen ist.  :rtfm:


----------



## Spacerat (26. Aug 2009)

Ein Fullscreen-Frame hat standardmässig Höhe und Breite der aktuell eingestellten Bildschirmgrösse. die Werte sollten mit "getSize()" usw. auch gelesen werden können. Soweit ich weiss kann die Grösse im FSEM jedoch nicht explizit gesetzt werden. Um die Fullscreen-Grösse zu ändern muss die Klasse DisplayMode verwendet werden. Hab' mich mit der FSEM-Problematik aber auch nur recht kurz befasst und das ist auch schon länger her.


----------



## radiac (26. Aug 2009)

Ja, das hab ich eben auch gemerkt, als ich mir das mal hab auslesen lassen...


aber wieso bekomme ich dann eine Exception das etwas keinen Wert hat obwohl es doch dran steht?

dadruch, das ich dachte, das die Elternklasse ScrollGame(); keine Screen Werte zugewiesen bekommt, hätte ich das Problem gelöst... aber Pustekuchen... 
Es fehlt angeblich immer noch was...

folgendes hat die Exception trotz angegebener parent.getWidht(), usw... ausgegeben:

public boolean intersects(double x, double y, double w, double h) {
	if (isEmpty() || w <= 0 || h <= 0) {
	    return false;
	}
	double x0 = getX();
	double y0 = getY();
	return (x + w > x0 &&
		y + h > y0 &&
		x < x0 + *getWidth*() &&
		y < y0 + *getHeight*());
    }

und die Rot angezeigten Werte seien kleiner als 0???
AUf jedenfall werden diese beanstandet....

???:L:-(


Nachtrag: Hab mal ein Screenshot vom Frame gemacht.
Der erste Wert ist der offiziell eingestellte Wert in der abstracten klasse GamePanel
Und der 2te Wert ist der, der automatisch übernommen wird von der GamePanel zur ScrollGame(main) Methode... die ich via getWidth usw... ausrufen lasse über einen String...

Und das gleiche wird ja auch ausgerufen in der MapDisplay(); über parent.getWidth();

ScrollGame = parent;


HILFE HILFE HILFE!!! ;(

:rtfm:


----------



## Spacerat (26. Aug 2009)

Wofür ist ist dieses rumhantieren mit der Bildschirmgrösse eigentlich nötig? Normalerweise genügt es, dem Frame einen Container (Panel) hinzuzufügen. dieser bekommt vom Standardlayout des Frames definitiv immer die Grösse und Position der Frame-Insets. Das heisst, das er bei "setUndecorated(true)" ebenfalls die Grösse des Screens an Position (0, 0) bekommt. Könntest du vllt. den Quellcode mal komplett posten (z.B. als Archiv)) Dann kann ich mir es ja mal ansehen.


----------



## Spacerat (27. Aug 2009)

Danke für den Code. So sah die Fehlermeldung meines 1. Tests aus...
	
	
	
	





```
java.lang.NullPointerException
	at Main.ScrollGame.gameRender(ScrollGame.java:170)
	at Game.GamePanel.screenUpdate(GamePanel.java:214)
	at Game.GamePanel.run(GamePanel.java:205)
	at java.lang.Thread.run(Thread.java:619)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:41)
	at java.awt.image.Raster.createPackedRaster(Raster.java:458)
	at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)
	at java.awt.GraphicsConfiguration.createCompatibleImage(GraphicsConfiguration.java:163)
	at Sprite.SpriteLib.getSprite(SpriteLib.java:82)
	at Map.ImageControl.setSourceImage(ImageControl.java:27)
	at Map.MapDisplay.<init>(MapDisplay.java:37)
	at Main.ScrollGame.gameStart(ScrollGame.java:43)
	at Game.GamePanel.<init>(GamePanel.java:62)
	at Main.ScrollGame.<init>(ScrollGame.java:34)
	at Main.ScrollGame.main(ScrollGame.java:30)
```
...wenn im Speicher irgendwann kein Platz mehr für neue Objekte ist (warum auch immer) dann bleiben sie halt leer.


----------

