Trouble with Fullscreen mode

Hi!

I have trouble getting my game running in fullscreen… =(
When starting up the game should try to enter 800x600x32 fullscreen-mode, if thats not possible it should fallback to 800x600x32 windowed mode.
But now it’s allways running in windowed mode, what am i doing wrong?? Yes, i have read the Sun Java API FullScreen-stuff…
Below is the method setting up the screen. It’s get called by the constructor of the maingame class which extends Canvas.
I’m i missing something??

private void setupGameDisplay()
{
mGameWindow = new JFrame(“JPlane”); // Skapar spelfönstret.
mGameWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // Vi lyssnar på WindowsClosing()-event istället, så att vi kan få stänga ner programmet själva.

    // Sätter upp panelen i vilken spelet ritas upp.
    JPanel gamePanel = (JPanel)mGameWindow.getContentPane();
    gamePanel.setPreferredSize(new Dimension(getGameSettingsElement(WINDOW_WIDTH),getGameSettingsElement(WINDOW_HEIGHT)));
    gamePanel.setLayout(null);
    setBounds(0, 0, getGameSettingsElement(WINDOW_WIDTH), getGameSettingsElement(WINDOW_HEIGHT));
    
    gamePanel.add(this);
    
    setIgnoreRepaint(true);   // Eftersom vi aktivt uppdaterar bildskärmen själva så är det onödigt att JVM också försöker.
    setFocusable(true);         // Se för säkerhetsskull till att vi kan få fokus.
    requestFocus();               // Och begär sedan fokus.
    mGameWindow.pack();
    
    mGameWindow.setResizable(false);  // Spelfönstret har en fix storlek. 
    mGameWindow.setVisible(true);        // Visa fönstret.
    
    // Ok, nu har vi ett fönster. Här näst testar vi om vi kan få spela i fullskärmsläge.
    GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice device = environment.getDefaultScreenDevice();
    
    // Bildskärmsläget spelet är gjort för(800x600x32@unknown).
    DisplayMode requestedDisplayMode = new DisplayMode(getGameSettingsElement(WINDOW_WIDTH), getGameSettingsElement(WINDOW_HEIGHT), 32, 0);
    
    // Kontrollerar om spelet kan köras i fullskärmsläge, annars faller vi tillbaka till fönsterläge.
    if (device.isFullScreenSupported())
    {
        DisplayMode currentDisplayMode = device.getDisplayMode();   // Hämtar nuvarande bildskärmsläge
        
        // Om vi redan befinner oss i rätt bildskärmsläge(upplösning) skall vi bara skifta om till fullskärm.
        if ((currentDisplayMode.getWidth() == requestedDisplayMode.getWidth()) && (currentDisplayMode.getHeight() == requestedDisplayMode.getHeight()) && (currentDisplayMode.getBitDepth() == requestedDisplayMode.getBitDepth()))
        {
            mGameWindow.setUndecorated(true);            // Ta bort menyrader och annat i fullskärmsläge.
            mOldDisplayMode = currentDisplayMode;        // Spara undan nuvarande bildskärmsläge.
            System.out.println("Skiftar till fullskärmsläge!");
            device.setFullScreenWindow(mGameWindow); // Skifta till fullskärmsläge.
        }
        
        // Om vi inte befinner oss i rätt bildskärmsläge(upplösing) kontrollera om vi får skifta bildskärmsläge. Annars blir det fönsterläge..
        else if (device.isDisplayChangeSupported())
        {
            DisplayMode[] avaibleModes = device.getDisplayModes();  // Hämtar alla bildskärmslägen som är tillgängliga
            int index = 0;
            
            // Loopar igenom och kontrollerar om vårt efterfrågade bildskärmsläge finns bland dessa.
            while ((index < avaibleModes.length) && (!avaibleModes[index].equals(requestedDisplayMode)))
            {
                index++;
            }
            
            // Hittade vi vårt bildskärmsläge?? I så fall byt till det läget och skifta till fullskärmsläge.
            if (currentDisplayMode.equals( requestedDisplayMode))
            {
                mGameWindow.setUndecorated(true);            // Ta bort menyrader och annat i fullskärmsläge.
                mOldDisplayMode = currentDisplayMode;        // Spara undan nuvarande bildskärmsläge, så att vi kan gå tillbaka till denna när spelet avslutas.
                System.out.println("Skiftar till fullskärmsläge!");
                device.setFullScreenWindow(mGameWindow); // Skifta till fullskärmsläge.
                System.out.println("Byter till önskad bildskärmsläge: " + requestedDisplayMode.getWidth() + "x" + requestedDisplayMode.getHeight() + "x" + requestedDisplayMode.getBitDepth());
                device.setDisplayMode(requestedDisplayMode);
            }
        }
    }
    
    if (mOldDisplayMode == null)
        System.out.println("Kunde inte växla till fullskärmsläge, spelet körs i fönsterläge i stället!");
    
    createBufferStrategy(2);      // 1st virtuell och 1st fysisk.
    mStrategy = getBufferStrategy(); 
}

BTW, Sorry for the native comments! I’ll try leaving them out next time! :slight_smile:

I’m not really sure what is the problem, but it appears that you never exit the full-screen mode (you need to call setFullScreenWindow(null) to exit fs mode.)

Dmitri

Hi Dmitri!

I have not included the code for going back to window-mode in this post, but the code looks almost like this:
try
{
setupGameDisplay()
}
finally
{
device.setDisplayMode(oldDisplayMode);
device.setFullScreenWindow(null);
}

The problem is not getting back to window-mode, BUT to get into fullscreen-mode… :-\

Any more suggestions??



  // Loopar igenom och kontrollerar om vårt efterfrågade bildskärmsläge finns bland dessa.
                while ((index < avaibleModes.length) && (!avaibleModes[index].equals(requestedDisplayMode)))
                {
                    index++;
                }
               
                // Hittade vi vårt bildskärmsläge?? I så fall byt till det läget och skifta till fullskärmsläge.
                if (currentDisplayMode.equals( requestedDisplayMode))

I believe your problem lies here.

That “if” should be “if (index<avaibleModes.length && currentDisplayMode.equals( avaibleModes[index]))”.
(or, adjust your while loop to include the line “currentDisplayMode = requestedDisplayMode;”)

Guess thats what happens when you use a while loop for something that should be done with a for :wink:

Hi, and thanks for all answers!
Yes, it was just a ugly hack, it has been rewritten… :slight_smile:

The problem was that i checked if it was possible to switch to the requested display-mode BEFORE going to fullscreen.
Thats why “device.isDisplayChangeSupported()” allways return “false”…
Now it’s working, in Windows, and only if i render directly to a JFrame. If if I render to a JPanel that is added to the JFrames contentPane I only get a grey screen.
Should it not be possible to render to a JPanel in a JFrame?
Looking forward to Mustang so that I can get Linux support up and running.

Thanks.

Nothing’s stopping you from downloading the latest Mustang snapshot now and trying it out… Better to play with it now and submit your issues than wait until Mustang ships (and it’s too late)!

Thanks,
Chris