Map größer als das Frame

janco2000

Mitglied
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! :)

Java:
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

Top Contributor
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

Mitglied
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
 
Zuletzt bearbeitet:

Gucky

Top Contributor
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?
 

Ruzmanz

Top Contributor
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:

Java:
/** 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 ;)
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Java:
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.
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben