# Map größer als das Frame



## janco2000 (1. Feb 2014)

Hallo,
ich bin komplett neu hier. Ich möchte ein Spiel programmierne, bei dem man einen Spieler steuert. Dazu möchte ich eine Map haben, die sich mitbewegt wenn der Spieler läuft. Vielen Dank für jede Hilfe! 


```
package Spiel;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Background {
	private float f_posx;
	private float f_posy;
	private float f_speed;
	private BufferedImage look;
	
	public Background(float f_speed){
		this.f_speed = f_speed;
		
		try {
			look = ImageIO.read(getClass().getClassLoader().getResourceAsStream("gfx/back.png"));
		} catch (IOException e) {e.printStackTrace();}
	}
	
	public void update(float timeSinceLastFrame){
	
	}
	
	public int getX(){
		return (int)f_posx;
	}
	
	public BufferedImage getLook(){
		return look;
	}
}
```


----------



## Gucky (1. Feb 2014)

Vielleicht wäre ein JScrollPane etwas für dich, wenn die Maps nicht unbedingt größer sind, als der Speicherplatz, den die JavaVM vom Betriebssystem bekommt.


----------



## Thunderstorm (1. Feb 2014)

Offsets wären hier angebrcht, diese werden zu alle Zeichenkoordinaten addiert und beim Bewegen des Spielers manipuliert. Dadurch wird der Anschein erweckt, der Spieler laufe in die gewünschte Richtung.

Außerdem würde ich dir noch raten, bei sehr großen Karten, dich mit clipping auseinanderzusetzen, sodass nur der Viewport neu gerendert wird. 

lg Thunder


----------



## janco2000 (1. Feb 2014)

Danke für eure Antworten! 
@Gucky: Könntest du vielleicht einen Beispiel-Quellcode posten?


----------



## Gucky (1. Feb 2014)

Naja. Beispielquellcode ist, glaube ich, nicht vonnöten. Du verlegst die gesamte Spiellogik auf das JScrollPane und scrollst dann je nach dem, wie sich der Spieler bewegt. Du bewegst also nicht den Spieler sondern die Welt unter ihm (was nicht zwingend notwendig ist).
Für was genau meinst du denn den Beispielcode? Rendern? Bild einfügen? Scrollen?


----------



## janco2000 (1. Feb 2014)

Ich meine einen Code für das Scrollen. Danke!


----------



## Ruzmanz (1. Feb 2014)

Die Antwort von Thunderstorm ist richtig. Das JScrollPane ist in diesem Fall nicht zu gebrauchen und wird auch in keinem mir bekannten Spiel so gemacht!



> Offsets wären hier angebrcht, diese werden zu alle Zeichenkoordinaten addiert und beim Bewegen des Spielers manipuliert. Dadurch wird der Anschein erweckt, der Spieler laufe in die gewünschte Richtung.



Beispiel:

Deine Map ist 5000x5000 Pixel groß.
Dein Spieler-Zentrum befindet sich auf Position 600, 600.
Dein Bildschirm hat eine Auflösung von 500x500 Pixel.
Deine Map muss du also bei x=600-500/2=350 und y = 600-500/2=350 auf Bildschirmgröße schneiden und auf der Position 0/0 anzeigen.

Pseudocode:


```
/** Zeichnet die Map */
public void draw() {
  int offset_X = spieler.getX()-display.width()/2;
  int offset_Y = spieler.getY()-display.height()/2;

  // posX, posX, imagePath, offsetX, offsetY, width, height
  drawImage(0, 0, "map.jpeg", offsetX, offsetY, display.width(), display.height());
}
```

Wenn sich dein Spieler bewegt, passt sich die Map automatisch an die Position an. Nicht der Spieler läuft, sondern die Map unter dem Spieler wird verschoben


----------



## Gucky (1. Feb 2014)

```
JPanel level = new JPanel();
//Tu, was immer nötig ist, um das Level in das JPanel zu laden
JScrollBar scrollLevel = new JScrollBar(level, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
      ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);//Damit das JPanel hinzugefügt wird und keine ScrollBars gezeigt werden.
JScrollBar vertikal = scrollLevel.getVerticalScrollBar();
JScrollBar horzontal = scrollLevel.getHorizontalScrollBar();

for (int i=0, j=0;i<vertikal.getMaximum && j<horizontal.getMaximum;i++,j++){
   vertikal.setValue(i);
   horizontal.setValue(j);
}//ein Durchscrollen des ScrollPanes im 45° Winkel
```

Zwar ungetestet aber es müsste hinhauen.


EDIT: Ich habe jetzt nach einer einfach umzusetzenden Möglichkeit gesucht. Nicht die Beste aber die einfachste.


----------



## janco2000 (1. Feb 2014)

Danke für eure Hilfe!


----------

