Heyho,
ich bin grad dabei ein Spiel zu basteln. Es besitzt eine Klasse (extend JComponent) für die Map, deren Größe in ihrem Konstruktor festgelegt wird.
Im JFrame Konstruktor wird ein JViewport erstellt, und ihm die Map als View übergeben.
Ich habe einen KeyListener mit eingebaut, der per setViewPosition(...) die Map scrollen sollte.
Das Problem ist, dass er die Map zwar scrollt, jedoch die neu aufgetauchten Bereiche der Map nicht zeichnet.
Mir ist beim Debugversuch aufgefallen, dass die Größe der Map immer der Größe des Viewports angepasst wird, sodass es logischerweise beim scrollen nichts mehr zu zeichnen gibt Oo...
Ich habe es auch mit einem ScrollPane versucht. Bei dem sind die Scrollbalken dann so groß, dass ebenfalls kein Scrollen mehr möglich ist (selber Grund).
Egal ob ich die Größe der Map vor dem zufügen zum Viewport einstelle, oder hinterher, oder per setViewSize, wird beim laden des Programms immer wieder der Viewportgröße angepasst.
Gibt es da einen einfachen Fehler/Grund, oder etwas das ich beachten muss, damit das nicht passiert?
ich bin grad dabei ein Spiel zu basteln. Es besitzt eine Klasse (extend JComponent) für die Map, deren Größe in ihrem Konstruktor festgelegt wird.
Im JFrame Konstruktor wird ein JViewport erstellt, und ihm die Map als View übergeben.
Ich habe einen KeyListener mit eingebaut, der per setViewPosition(...) die Map scrollen sollte.
Das Problem ist, dass er die Map zwar scrollt, jedoch die neu aufgetauchten Bereiche der Map nicht zeichnet.
Mir ist beim Debugversuch aufgefallen, dass die Größe der Map immer der Größe des Viewports angepasst wird, sodass es logischerweise beim scrollen nichts mehr zu zeichnen gibt Oo...
Ich habe es auch mit einem ScrollPane versucht. Bei dem sind die Scrollbalken dann so groß, dass ebenfalls kein Scrollen mehr möglich ist (selber Grund).
Egal ob ich die Größe der Map vor dem zufügen zum Viewport einstelle, oder hinterher, oder per setViewSize, wird beim laden des Programms immer wieder der Viewportgröße angepasst.
Gibt es da einen einfachen Fehler/Grund, oder etwas das ich beachten muss, damit das nicht passiert?
Java:
public class Frame extends JFrame implements KeyListener{
Welt welt; // die Map, die grad im Fenster angezeigt wird, evtl. auch für
// Kampfmodi etc. verwenden
Bottom bottom; // die Leiste unter der Map, für Buttons, Icons etc.
JViewport VP;
JScrollPane ScP;
public Frame(String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Programm wird beendet
// wenn Fenster
// geschlossen wird
// Karte
welt = new Welt(50, 50);
// Objekt für die Anzeige des Kartenausschnitts
VP = new JViewport();
VP.setView(welt);
VP.add(welt);
VP.setPreferredSize(new java.awt.Dimension(700, 700));
//VP.setViewSize(new java.awt.Dimension(1750, 1750));
System.out.println(VP.getViewSize());
//VP.setAutoscrolls(true);
//VP.setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
// Bottomleiste
bottom = new Bottom();
// zweigeteilter Fensterinhalt
JSplitPane SP = new JSplitPane(JSplitPane.VERTICAL_SPLIT, VP, bottom);
SP.setBorder(null);
SP.setResizeWeight(1.0); // beim Vergrößern wird nur die Welt vergrößert
SP.setOneTouchExpandable(false);
SP.setDividerSize(0);
//setMap(welt);
setContentPane(VP);
addKeyListener(this);
pack();
validate();
setVisible(true);
System.out.println(VP.getViewSize());
System.out.println(welt.getSize());
}...
class Welt extends JComponent implements Karte{
private Feld[][] _Spielfeld;
private int _hoehe;
private int _breite;
/**
* Constructor for objects of class Welt
*/
public Welt() {
_hoehe = 10;
_breite = 10;
setPreferredSize(new Dimension(35 * _breite, 35 * _hoehe));
setSize(35 * _breite, 35 * _hoehe);
_Spielfeld = new Feld[_breite][_hoehe];
for (int i = 0; i < _breite; i++) {
for (int j = 0; j < _hoehe; j++) {
_Spielfeld[i][j] = new Feld();
}
}
}
/**
* konstruktor für beliebig große welten
*/
public Welt(int x, int y) {
_hoehe = x;
_breite = y;
setSize(35 * _breite, 35 * _hoehe);
_Spielfeld = new Feld[_breite][_hoehe];
for (int i = 0; i < _breite; i++) {
for (int j = 0; j < _hoehe; j++) {
_Spielfeld[i][j] = new Feld();
}
}
for (int k = 0; k < 6; k++) {
_Spielfeld[k][0].setTerrain(new Berg());
_Spielfeld[k][1].setTerrain(new Berg());
_Spielfeld[k][2].setTerrain(new Wald());
_Spielfeld[k][3].setTerrain(new Wald());
_Spielfeld[k][19].setTerrain(new Wald());
}
}
public void paint(Graphics g) {
for (int i = 0; i < _breite; i++) {
for (int j = 0; j < _hoehe; j++) {
java.awt.Graphics2D g2d = (Graphics2D) g;
_Spielfeld[i][j].paint(i, j, g2d);
}
}
}...
Zuletzt bearbeitet: