# 2D Sprites an die JPanel Größe (Auflösung) anpassen/skalieren



## CuriousBob (13. Feb 2011)

Hi,
ich habe gerade das 2D-Spieleprogrammierung Tutorial von Quaxli durchgearbeitet und auch schon ein paar Änderungen vorgenommen. Jetzt hätte ich allerdings ein paar Fragen zu den Sprites.

Ich würde es gerne so machen das sich der Benutzer eine beliebige Auflösung aussuchen kann (800x600, 1024x768, etc.) und die Sprites sich entsprechend anpassen. Gibt es dafür vllt. Methoden die die Sprites auf dich richtige Größe ausdehnen bzw. verkleinern? 
Bisher ist es dem 800x600 Hintergrundbild (.jpg) nämlich ganz egal ob das JPanel größer ist als das Bild. Das behält seine feste Größe und bleibt an der 0x0 Position.

Als nächtes hätte ich noch eine Frage zur Positionierung. Ich würde z.B. einen Gegner bei x=256, y=252 starten lassen. Natürlich sind das zwei "unterschiedliche" Positionen, wenn man einmal eine JPanel Größe von 800x600 und einmal 1920x1080 hat. Wie gehe ich da am geschicktesten vor?


----------



## Marco13 (13. Feb 2011)

Ganz allgemein klingt das, als solltest/könntest/würdest/müßtest du dir ein eigenes Koordinatensystem bauen. Wenn du ein einem 100x100-Panel 10x10 Tiles (order Sprites) unterbringst, und das ganze dann in ein 200x200-Panel malen willst, kannst du eigentlich einfach alles skaliert zeichnen (Graphics2D#scale und los...). Vielleicht ist aber noch mehr notwendig. Warte mal ab, was Quaxli dazu sagt.


----------



## Quaxli (14. Feb 2011)

Warum soll ausgerechnet ich was dazu sagen?  Sowas ist im Tutorial nicht vorgesehen, das ist ja was für Anfänger und geht von einer fixen Größe aus.

Der Ansatz von Marco klingt für mich ganz gut. Ich haber aber so etwas auch noch nie ausprobiert und frage mich gerade, wie das optisch wirkt, wenn man die vorhanden Sprites einfach um den Faktor x vergrößert? Könnte u. U. etwas klobig werden. 

Das Problem mit der Startposition würde ich rechnerisch lösen. x-Position von 256 ist bei 800 Pixeln Breite grob gerechnet ein Drittel. Das läßt sich ja einfach rechnen...


----------



## Quaxli (14. Feb 2011)

Ich habe jetzt mal auf die Schnelle ein bißchen rumprobiert, weil mich das doch interessiert hat:
Graphics2D.scale(...) funktioniert und wenn man ein bißchen mit den RenderingHints rumspielt, könnte man ein brauchbares Ergebnis hinbekommen. 

Für's Tutorial habe ich einfach mal nur die Zeichenroutine geändert. Damit ist das Bild zwar nicht vollständig sichtbar, aber mich hat an der Stelle auch nur die Optik interessiert. Auch mit den verwendeten RenderingHints habe ich nicht groß rumprobiert, so daß da evtl. noch ein besseres Ergebnis möglich ist.


```
@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		Graphics2D g2 = (Graphics2D) g;
		//g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		g2.scale(1.5,1.5);
		
		g2.drawImage(background, 0, 0, this);
		
		g2.setColor(Color.red);
		g2.drawString("FPS: " + Long.toString(fps), 20, 10);
		
		if(!isStarted()){
			return;
		}
		

		if(actors!=null){
			for(int i=0;i<actors.size();i++){
				actors.get(i).drawObjects(g2);
			}
		}
		
	}
```

Insgesamt sieht das einigermaßen gut aus. Da so nur die Grafik größer gemalt wird, hat man auch keinen Schmerz mit Startpositionen etc..

Alternative wäre vielleicht noch, das Programm in eine FullScreen-Anwendung umzuwandeln. Da gibt's im "Killer Game Programming" - Tutorial schöne Erklärungen dazu 
Killer Game Programming in Java


----------

