# Bildschirmgröße ändert sich



## moritzmoritz (17. Nov 2012)

Hallo,

ich bin momentan dabei ein 2D-Game zu programmieren, das funktioniert soweit auch ganz gut...

nur mache ich mir die ganze Zeit schon Gedanken, wie sich mein Spiel verhalten soll, wenn die Größe des Fensters nicht vorgegeben ist? 

gibt es eine Möglichkeit Bilder "je nach belieben" zu vergrößeren und zu verkleinern? Weil bisher arbeite ich nur mit .png-datein ... und die haben ja nunmal eine fixe Größe (bsp. 50x50px), aber auf einem größeren Fenster will ich genau das gleiche wie auf einem kleineren Fenster sehen.

Ich hoffe, dass ich mich verständlich ausgedrückt habe und jemand mein Problem verstanden hat 

Schönes Wochenende euch,

Moritz


----------



## Fab1 (17. Nov 2012)

Ich würde am Anfang dem GamePanel einfach eine fixe Größe geben und nur das "außenrum" vergrößern/ -kleinern

Ansonsten kannst du dir ja mal Java ist auch eine Insel – 14.9 Bilder anzeigen und Grafiken verwalten anschauen. Vielleicht ist da was dabei. Müsstest halt immer, wenn die Größe des Fensters verändert wird, die Bilder entsprechend aktualisieren. (evtl. mit Observer Pattern, falls sich das irgendwie realisieren lässt)

Aber im Detail hab ich mich damit leider auch noch nicht befasst. Viel Erfolg.


----------



## BRoll (17. Nov 2012)

Ich machs immer so,
das ich ein BufferedImage als Zeichengrund nehme.
Und darin zeichne ich das Spielgeschehen rein.
Das BufferedImage hat eine fixe Größe, welche
die InGame-Auflösung ist. Zb. 1000x600.

Und dann kann ich einfach das BufferedImage selber am
Ende am Bildschirm in einer beliebigen Größe anzeigen-
dadurch wird alles mit der richtigen Größe angezeigt.

So sieht das im Code aus:


```
private  BufferedImage screen =new BufferedImage(1000,600,BufferedImage.TYPE_INT_RGB);

public void paint(Graphics p)
	{

            Graphics g=screen.getGraphics();

           //So jetzt alle Zeichenvorgänge mit  der Graphics  g machen
         
             //Und zum Schluss
            	p.drawImage(screen,0,0,breite,hoehe,null);
               }
```
So kann man breite und hoehe beliebig einstellen.


----------



## moritzmoritz (18. Nov 2012)

BRoll hat gesagt.:


> die InGame-Auflösung ist. Zb. 1000x600.



also heißt das, wenn das Objekt einen x-Punkt (weite der Spielgrafik 1000-weite des Objekts) hat ist es am Rand angekommen? 

Wie sieht's denn mit der Schärfe aus, wenn ich mit 32x32px-Grafiken arbeiten sollte? Wird das nicht ziemlich unscharf? ... 

Moritz


----------



## BRoll (18. Nov 2012)

moritzmoritz hat gesagt.:


> also heißt das, wenn das Objekt einen x-Punkt (weite der Spielgrafik 1000-weite des Objekts) hat ist es am Rand angekommen?
> 
> Wie sieht's denn mit der Schärfe aus, wenn ich mit 32x32px-Grafiken arbeiten sollte? Wird das nicht ziemlich unscharf? ...
> 
> Moritz



Ja das ist ja das gute daran. Du kannst immer mit der InGame Auflösung rechnen,
obwohl sich die eigentliche Auflösung anders sein kann.
Die Mauspositionen muss man dann bloß Rückrechnen, ist aber auch kein
Problem.

Schärfe ist natürlich wenn das Fenster genausogroß wie die InGame Auflösung 
ist, am Besten. Ist genauso ansonsten wie wenn du ein Bild vergrößerst oder
verkleinerst.  Bloß auf pixelgenauer Ebene. Dh. in Java wird die Vergrößerung/Verkleinerung
mit Pixelwiederholung umgesetzt. 

Hier siehst du wie das mit einem Testbild aussehen würde: http://www.teialehrbuch.de/Kostenlose-Kurse/Adobe-Photoshop/images/01_33.jpg 

mfg BRoll


----------



## moritzmoritz (18. Nov 2012)

Also sollte man mit größeren Grafiken arbeiten?

Gibt es denn eine Übersicht von heutigen Standardgrößen von Bildschirmen? Was ist das "größte" was ist das "kleinste"?


----------



## Fab1 (18. Nov 2012)

Übersicht, naja du könntest ja einfach mal bei deinem Onlineshop des Vertrauens schauen, welche Größen die denn so anbieten 

Ansonsten schau mal hier: Bildschirm / Monitor / Display


----------



## BRoll (18. Nov 2012)

moritzmoritz hat gesagt.:


> Also sollte man mit größeren Grafiken arbeiten?



Das kann man ganz einfach beantworten:

Umso größer du deine Grafiken machst, desto besser ist das Ergebnis-
da auch bei sehr hohen Auflösungen das Bild nicht vergrößert werden muss.
Jedoch ist der Verwaltungsaufwand größer, Ladezeiten länger und
die Framerate geht auch irgendwann in den Keller.
Besonders wenn man mit Java einfach mit AWT arbeitet sollte
man das Zeichnen von großen Bildern seinlassen, wenn das Programm
schnell laufen solllte.
Und dann ist da auch noch das Format des Bildes wichtig.
Umso kleiner die Datei, desto schneller läufts jedoch meistens
auch schlechtere Qualität.

Also musst du einen Mittelweg für dan Anwendungszweck suchen.

Pauschal kann mans aber nicht sagen.


----------



## moritzmoritz (18. Nov 2012)

Danke für eure Antworten, habe mir jetzt schon paar Gedanken gemacht und auch schon eine Idee 




BRoll hat gesagt.:


> Besonders wenn man mit Java einfach mit AWT arbeitet sollte
> man das Zeichnen von großen Bildern seinlassen, wenn das Programm
> schnell laufen solllte.



Gibt es eine andere Möglichkeit Grafiken mit Java darzustellen?

Moritz


----------



## moritzmoritz (18. Nov 2012)

Sry für den Doppelpost:

Habe das jetzt mit dem Screen und dem .getGraphics() probiert, kriege aber immer eine NullPointerException ... warum? Habe ein "leeres" BufferedImage erstellt, kann es daran liegen?

EDIT:
Außerdem habe ich irgendwie einen Abstand von 10px von links und von oben .. wodran kann das liegen, wenn ich nämlich ein Objekt erzeuge wird es bei x=0 und y=0 in echt bei x=10 und y=10 gezeichnet .. hat das JPANEL einen Abstand, und kann man den irgendwie "löschen"? 


Moritz


----------



## BRoll (18. Nov 2012)

moritzmoritz hat gesagt.:


> Sry für den Doppelpost:
> 
> Habe das jetzt mit dem Screen und dem .getGraphics() probiert, kriege aber immer eine NullPointerException ... warum? Habe ein "leeres" BufferedImage erstellt, kann es daran liegen?
> 
> ...



Bitte mal den ganzen Code posten, dann kann ich dir sagen was nicht stimmt.
Kann viele Gründe haben, hast du das BufferedImage initialisiert?
Stimmt die Reihenfolge?  usw...

Zu JPanel kann ich nicht sagen ob das einen eingebauten Abstand hat,
hab damit noch nicht gearbeitet.
Vielleicht weiß das jemand anderes.


----------

