FullScreen

TiGreen

Mitglied
Hallo!

Ich möchte gerne mal ein FullScreen Spiel machen.
Dazu habe ich mir gedacht das man PageFlipping und BufferStrategie einbauen kann.
Hier in diesem Beispiel wird zwar der FullScreen-Mode aufgebaut aber der gameLoop wird nie durchlaufen.

Was ist daran falsch? Warum wird der Loop nie durchlaufen?

PS: Oder hat jemand noch generell irgendwelche Verbesserungsvorschläge zum Source-Code?
Was man vielleicht verbessern kann oder so?

Java:
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.image.BufferStrategy;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Window {
    
    public static JFrame fenster;
    private GraphicsDevice device;
    public static BufferCapabilities.FlipContents flipContents;
    public static BufferStrategy strategy;
    public static int bildWidth = 0, bildHeight = 0;
    private String fensterName = "Puzzle";
    
    public Window() {
        device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        GraphicsConfiguration gc = device.getDefaultConfiguration();
        BufferCapabilities bufCap = gc.getBufferCapabilities();
        boolean page = bufCap.isPageFlipping();

        if (!device.isFullScreenSupported()) {
            // Spätere Fehlermeldung
        }
        fenster = new JFrame(device.getDefaultConfiguration());
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setUndecorated(true);
        fenster.setResizable(false);
        fenster.setTitle(fensterName);
        
        bildWidth = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width;
        bildHeight = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height;
        
        
        fenster.pack();
        fenster.setVisible(true);
        device.setFullScreenWindow(fenster);
        
        fenster.createBufferStrategy(2);
        strategy = fenster.getBufferStrategy();

        flipContents = bufCap.getFlipContents();
        if (flipContents.equals(BufferCapabilities.FlipContents.UNDEFINED)) {
        } else if (flipContents.equals(BufferCapabilities.FlipContents.BACKGROUND)) {
        } else if (flipContents.equals(BufferCapabilities.FlipContents.PRIOR)) {
        } else if (flipContents.equals(BufferCapabilities.FlipContents.COPIED)) {
        }

        if (!page) {
             // Spätere Fehlermeldung
        }
              init();
	}
        public void init() {	
                Screen screen = new Screen();
                fenster.add(screen);
	     fenster.setVisible(true);
	}

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



Java:
import java.awt.*;
import javax.swing.*;

public class Screen extends JPanel implements Runnable {

    public static boolean gameRunning = true;
    private long delta = 0, last = 0, fps = 0;
    private Thread gameLoop = new Thread();

  public Screen() {
        initGame();
    }
    public void initGame() {
        last = System.nanoTime();

        gameLoop.start();
    }

   public void run() {
        while (true) {
            //  Geht hier nicht mal in die Schleife rein :/
            System.out.println("test");

            Graphics g = Window.strategy.getDrawGraphics();
            g.setColor(Color.white);
            g.fillRect(0, 0, Window.bildWidth, Window.bildHeight);
                   
            handleDelta();

            // Draw to graphics
            paintMyComponents(g);

            Window.strategy.show();
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
            }

        }
    }
     public void paintMyComponents(Graphics g) {
        // passiert dann natürlich auch nichts
        g.setColor(Color.red);
        g.fillRect(0, 0, Window.bildWidth, Window.bildHeight);

        g.setColor(Color.black);
        g.drawString("FPS: " + Long.toString(fps), 200, 100);
    }


}

Vielen Dank schonmal im Voraus.

LG

TiGreen
 
G

Gast2

Gast
Was ist daran falsch? Warum wird der Loop nie durchlaufen?
Du musst dem Thread dein Runnable übergeben. Aktuell hast du einen Thread, der nichts macht.

Du solltest deine Klasse auch nicht Window nennen, so eine Klasse gibts nämlich in der Java API schon.
 

TiGreen

Mitglied
Ok das mit dem Anzeigen klappt jetzt.
Ja ich weiß das es schon in der API eine Window-Klasse gibt aber solange ich sie nicht benutze klappt alles super :) aber vielleicht benenne ich sie doch um.

Gibt es noch weitere Verbesserungsvorschläge? Ist es so in Ordnung wie das Vollbild aufgebaut wird oder kann man daran noch etwas verbessern?
 

Ribbley

Mitglied
Auch wenn alt:

du musst deinem Thread-Constructor aufruf auch in diesem Fall das Target mitteilen.
Du willst ja nicht einfach nur nen Thread machen, sondern einen, der die runmethode von deinem JPanel durchläuft, also
Java:
gameLoop=new Thread(this);
das this ist hier das wichtige ^^
 

BuddaKaeks

Bekanntes Mitglied
Java:
fenster = new JFrame(device.getDefaultConfiguration());

machst du zu

Java:
fenster = new JFrame(gc);
 

Ähnliche Java Themen


Oben