Hallo,
ich bin mir nicht sicher, was das eigentliche Problem ist:
Ich habe ein JFrame für ein Spiel mit 3x3 JPanels (in einem 2D Array). Es wird ein Bild dargestellt, innerhalb des JPanels, und wenn eine Figur sich bewegt, wird das Bild gelöscht und ins neue Panel übertragen (also keine wirkliche Bewegung).
Das ganze funktioniert am Mac, lässt sich sogar in eine Jar überführen. ABER: Unter Windows treten einige Fehler auf (sowohl bei der Jar, als auch beim direkten Quelltext-Compilieren). Und zwar wird kein einziges Bild richtig angezeigt (oder am richtigen Ort), aber das Spiel läuft (also nach einiger Zeit kommt die Meldung, man habe verloren). Auch der Import funktioniert, denn Ton wird abgespielt, und ab und zu flackert ja auch mal ein Bild auf.
Das gleiche Problem war schon am Mac: Ich hatte erst das Programm mit Platzhalter-Bildern zum laufen gebracht. Dann die Bilder eingefügt, die Teilweise größer waren, als 185x185, und so kam es, wie jetzt bei Windows.
Der funktionierende Konstruktor vom Mac:
Zu den JPanels: Am Mac hatte ich das so eingestellt, dass sie mit setBounds() ihren richtigen Platz finden. Da das vielleicht an den Größen liegt, wollte ich Java das selbst machen lassen und ein GridLayout eingebaut: Plötzlich: Es klappt ein Mal! (Beim Neucompilieren ebenfalls immer das 1. Mal) Das Spiel ist so gemacht, dass man nach 15 Sekunden schon verloren haben könnte. Entsprechend erscheint ein JOptionPane, dass man entweder zum Hauptmenü (eigene Klasse) zurück kann, oder direkt neu startet. So oder so, ab dem 2. Mal wirkt es, als wären die Panels untereinander vertauscht. Der Spieler springt nun (wenn man ganz links startet) (und man „nach links“ drückt) erst nach ganz rechts, dann in die Mitte, und die Gegner springen auch innerhalb der Zeile.
Der Konstruktor mit GridLayout:
Ausschnitt aus der Methode getroffen(), für Neustart:
Mit frame.pack() wird nur der Rand des JFrames angezeigt.
Ich hoffe, jemand kann mir helfen, ich weiß nicht, woran es wirklich liegen könnte.
Schon mal ein sehr großes Dankeschön!!
ich bin mir nicht sicher, was das eigentliche Problem ist:
Ich habe ein JFrame für ein Spiel mit 3x3 JPanels (in einem 2D Array). Es wird ein Bild dargestellt, innerhalb des JPanels, und wenn eine Figur sich bewegt, wird das Bild gelöscht und ins neue Panel übertragen (also keine wirkliche Bewegung).
Das ganze funktioniert am Mac, lässt sich sogar in eine Jar überführen. ABER: Unter Windows treten einige Fehler auf (sowohl bei der Jar, als auch beim direkten Quelltext-Compilieren). Und zwar wird kein einziges Bild richtig angezeigt (oder am richtigen Ort), aber das Spiel läuft (also nach einiger Zeit kommt die Meldung, man habe verloren). Auch der Import funktioniert, denn Ton wird abgespielt, und ab und zu flackert ja auch mal ein Bild auf.
Das gleiche Problem war schon am Mac: Ich hatte erst das Programm mit Platzhalter-Bildern zum laufen gebracht. Dann die Bilder eingefügt, die Teilweise größer waren, als 185x185, und so kam es, wie jetzt bei Windows.
Der funktionierende Konstruktor vom Mac:
Java:
public Game1(){
frame = new JFrame();
frame.setTitle("ABC");
//Die Ecken des Frames werden gesetzt
frame.setBounds(0, 0, 600, 600);
frame.setVisible(true);
frame.getContentPane().setBackground(Color.darkGray);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
player = new Player();
//Die Panels werden erstellt und hinzugefuegt
panel = new JPanel[3][3];
int xP = 22;
int yP = 44;
for(int a = 0; a < panel.length; a++){
for(int b = 0; b < panel.length; b++){
panel[a][b] = new JPanel();
frame.add(panel[a][b]);
panel[a][b].setLayout(new BorderLayout());
panel[a][b].setBounds(xP, yP, 185, 185);
panel[a][b].setBackground(Color.darkGray);
xP += 185;
}
yP += 185;
xP = 22;
}
playerLabel = new JLabel();
playerLabel.setIcon(new ImageIcon(player.getImage()));
panel[2][1].add(playerLabel);
panel[2][1].validate();
frame.add(panel[2][1]);
}
Zu den JPanels: Am Mac hatte ich das so eingestellt, dass sie mit setBounds() ihren richtigen Platz finden. Da das vielleicht an den Größen liegt, wollte ich Java das selbst machen lassen und ein GridLayout eingebaut: Plötzlich: Es klappt ein Mal! (Beim Neucompilieren ebenfalls immer das 1. Mal) Das Spiel ist so gemacht, dass man nach 15 Sekunden schon verloren haben könnte. Entsprechend erscheint ein JOptionPane, dass man entweder zum Hauptmenü (eigene Klasse) zurück kann, oder direkt neu startet. So oder so, ab dem 2. Mal wirkt es, als wären die Panels untereinander vertauscht. Der Spieler springt nun (wenn man ganz links startet) (und man „nach links“ drückt) erst nach ganz rechts, dann in die Mitte, und die Gegner springen auch innerhalb der Zeile.
Der Konstruktor mit GridLayout:
Java:
public Game1(){
frame = new JFrame();
frame.setTitle("ABC");
//Bei dieser groesse klappt es, bei den meisten anderen nicht
frame.setBounds(0,0,560, 603);
//Es macht keinen Unterschied, wo sich das setVisible() befindet
frame.setVisible(true);
frame.getContentPane().setBackground(Color.darkGray);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
player = new Player();
//Mit GridLayout
eLayout = new GridLayout(3,3);
frame.setLayout(eLayout);
panel = new JPanel[3][3];
for(int a = 0; a < panel.length; a++){
for(int b = 0; b < panel.length; b++){
panel[a][b] = new JPanel();
panel[a][b].setSize(185, 185);
panel[a][b].setBackground(Color.darkGray);
panel[a][b].setDoubleBuffered(true);
frame.add(panel[a][b]);
}
}
playerLabel = new JLabel();
playerLabel.setIcon(new ImageIcon(player.getImage()));
panel[2][1].add(playerLabel);
panel[2][1].validate();
frame.add(panel[2][1]);
}
Ausschnitt aus der Methode getroffen(), für Neustart:
Java:
switch(take){
case 0: timer.cancel();
frame.setVisible(false);
frame = null;
MainPage.clip.stop();
new MainPage();
break;
case 1: timer.cancel();
frame.setVisible(false);
frame = null;
new GameSabiner1();
break;
}
Mit frame.pack() wird nur der Rand des JFrames angezeigt.
Ich hoffe, jemand kann mir helfen, ich weiß nicht, woran es wirklich liegen könnte.
Schon mal ein sehr großes Dankeschön!!