Schwarzer Rand in meinem LWJGL Spiel

Hallo, ich habe das Problem, dass ich in meinem LWJGL Spiel, seit dem ich es vergößerbar gemacht habe, einen Schwarzen Rand habe.
Dieser verschwindet allerdings sobalt ich das Fenster vergrößen oder verkleiner.
Aber seht selbst

Und hier der relevante Code:

Main.java
[spoiler]


static int ScreenX = 1280, ScreenY = 720;
try {
Display.setDisplayMode(new DisplayMode(ScreenX, ScreenY));
Display.create();
Display.setResizable(true);
Display.setVSyncEnabled(true);
Display.setTitle("Game");
} catch (LWJGLException e) {
System.exit(0);
}

OpenGl.init();

while (!Display.isCloseRequested()) {
Render.makeRender();
Display.update();
}
Display.destroy();	
}

[/spoiler]

OpenGl.java
[spoiler]


public static void init(){

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glClearColor(0.1F, 0.3F, 0.0F, 1.0F);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 2048, 1152  , 0, 1, 0);
GL11.glViewport(0, 0, Display.getWidth(), Display.getHeight());

}

[/spoiler]

Render.java
[spoiler]


public static void makeRender(){
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
if(Display.wasResized()){
GL11.glViewport(0, 0, Display.getWidth(), Display.getHeight());
}

//weitere Render commnads(Bilder zeichnen)
		
}

[/spoiler]

Ich hoffe jemand kann mir helfen.
Danke im Vorraus.

Ich kenne mich nicht genug(gar nicht) mit OpenGL aus, aber das Bild sieht so aus als wäre die Map(bzw. das entsprechende Panel) verschoben!

static int ScreenX = 1280, ScreenY = 720;

Ich frage mich gerade, was Benutzer machen, die einen 1024 * 768 Monitor haben.
Man kann doch die Bildschirm-Dimensionen mit Java ermitteln und dann entsprechend die Größe setzen. Notfalls abzüglich des Rahmens vom JFrame und/oder der Windows-Startleiste.

Ja, ist halt nicht testbar, aber

  • es kommt NUR durch das “setResizable(true)”? (Und bei “false” passiert das nicht?)
  • Nach einer Größenänderung ist alles OK? (Und bleibt es auch, wenn man wieder die ursprüngliche Größe einstellt?)

[QUOTE=L-ectron-X]
Man kann doch die Bildschirm-Dimensionen mit Java ermitteln und dann entsprechend die Größe setzen.[/QUOTE]

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

Ich frage mich gerade, was Benutzer machen, die einen 1024 * 768 Monitor haben.

Sich einen grösseren Bildschirm kaufen:

[QUOTE=Marco13]Ja, ist halt nicht testbar, aber

  • es kommt NUR durch das “setResizable(true)”? (Und bei “false” passiert das nicht?)
  • Nach einer Größenänderung ist alles OK? (Und bleibt es auch, wenn man wieder die ursprüngliche Größe einstellt?)[/QUOTE]

-ja
-ja, ja

Verschiedene Bildschirm Größen habe ich schon getestet.

Und mir ist eben aufgefallen, dass die fps Anzeige in “randmodus“ abgeschnitten ist

Gibt es den eine Art Map oder ein GamePanel?
Ich hatte da mal ein ähnliches Problem und da war das Problem das die Map verschoben war!

Das kommt jetzt vieleicht ein bisschen blöd rüber, aber ich habe eben selbst per Zufall eine Lösung gefunden :twisted: .
Als ich nämlich den Tipp mit der Blidschrimgröße einbauen wollte, habe ich herausgefunden, dass wenn ich

Display.setLocation(Display.getX(), Display.getY());

in die Main einfüge, das Problem verschwindet.
Vielen Dank das ihr mir (indirekt) geholfen habt.

Offensichtlich ist, dass es auf Windows(7) passiert… Ich weiss jetzt nicht, ob man dass als Bug bezeichnen kann, geschweige denn, wer für diesen zur Verantwortung gezogen werden kann. Wenn der schwarze Rand 5 Pixel Breit bzw. Hoch ist, liegt es aber genau daran, dass Java von Windows im Non-Resizable-Mode eines Windows falsche Insets-Werte bekommt, bzw das Window 10*10 Pixel (5 an jeder Seite) zu groß gezeichnet wird.

import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Frame;

public class ResizableTest {
	public static void main(String[] args) throws Exception {
		final Frame c = new Frame("Resizable test");
		c.pack();
		final Insets i = c.getInsets();
		final Frame f = new Frame() {
			private static final long serialVersionUID = 1L;

			String inside, outside, insets, shouldBe;

			@Override
			public void paint(Graphics g) {
				Insets i2 = getInsets();
				int x = i.left;
				int y = i.top;
				int w = getWidth() - i.left - i.right;
				int h = getHeight() - i.top - i.bottom;
				inside  = "inside  width: " + getWidth() + "; height: " + getHeight();
				outside = "outside width: " + c.getWidth() + "; height: " + c.getHeight();
				insets  = "insets left: " + i2.left + "; right : " + i2.right + "; ";
				insets += "top :" + i2.top + "; bottom: " + i2.bottom;
				shouldBe  = "shouldBe left: " + i.left + "; right : " + i.right + "; ";
				shouldBe += "top :" + i.top + "; bottom: " + i.bottom;
				g.setColor(Color.YELLOW);
				g.fillRect(x, y, w, h);
				g.setColor(Color.BLACK);
				g.drawString(inside, 10, i.top + 15);
				g.drawString(outside, 10, i.top + 30);
				g.drawString(insets, 10, i.top + 45);
				g.drawString(shouldBe, 10, i.top + 60);
			}
		};
		f.setVisible(true);
		c.setVisible(true);
		f.setBounds(0, 0, 320, 240);
		c.setBounds(320, 0, 320, 240);
		Thread.sleep(5000);
		f.setResizable(false);
		Thread.sleep(5000);
		f.setResizable(true);
		Thread.sleep(5000);
		f.dispose();
		c.dispose();
	}
}```

EDIT: Wie ich es gedacht hab'. Jeweils 5 Pixel schwarzer Rand und jeweils 5 Pixel die auf jeden Fall links und mit Sicherheit auch oben fehlen. Leider sind die 5 Pixel nicht verbindlich. Wählt man ein anderes Design kann es schon wieder ein anderer Wert sein. Beim klassischen Windows(95/98)-Style ists z.B. nur ein Pixel pro Kante.