Animiertes JPanel dynamisch wechseln

elGurko

Mitglied
Hallo,
ich bin relativ neu in der Programmiering von graphischen Oberflächen und habe ein Problem. Ich habe einen kleinen Sidescroller programmiert, in dem man mit einer Figur auf Zombiejagd geht. Das Spiel an sich funktioniert wunderbar, nur wollte ich zur Krönung noch ein schönes Menü einbauen.

Meine Fensterklasse sieht so aus
Java:
public class GameFrame extends JFrame{
	
	private Menu menu = new Menu(this); 
	private World world = new World();
	
	public GameFrame(String name) {
		super(name);
		this.setPreferredSize(new Dimension(1100,625));
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		
		this.add(menu);
		this.pack();
	}
	
	public void startNewGame() {
		this.remove(menu);
		this.add(world);
		this.pack();
		world.startGame();
	}
	

}

Ich habe zwei Klassen die von JPanel abgeleitet sind: World (die eigentliche Spielfläche) und Menu.
World ist ist ein KeyListener hinzugefügt, der die Steuerung des Helden übernimmt. Die startGame() Methode von world startet die Gameloop inkl. der Neuzeichnung des JPanles alle 10 Millisekunden (die Zeichnung in einem eigenen Thread).
Das Spiel startet mit dem Menü. Menu wird im Konstruktor das GameFrame Object übergeben, weil es dessen Inhalt auf Knopfdruck ändern muss. Dem Menü sind mehrere Buttons hinzugefügt, darunter auch ein "new Game" Button. Dessen ActionListener ruft die startNewGame() methode von GameFrame auf.

Menu:
Java:
public class Menu extends JPanel {

	private final Image background = new ImageIcon(Menu.class.getResource("../images/menu.jpeg")).getImage();
	private ArrayList<Cloud> clouds = new ArrayList<>();

	private GameFrame mother;

	public Menu(GameFrame mother) {

		this.mother = mother;

		this.setPreferredSize(new Dimension(1100, 600));
		this.setLayout(null);

		JButton newGame = new JButton("New Game");
		newGame.addActionListener(new NewGameListener());
		newGame.setBounds(800, 150, 200, 30);
		this.add(newGame);

		JButton options = new JButton("Options");
		options.setBounds(800, 220, 200, 30);
		this.add(options);

		JButton credits = new JButton("Credits");
		credits.setBounds(800, 290, 200, 30);
		this.add(credits);

		JButton quit = new JButton("Quit");
		quit.addActionListener(new QuitListener());
		quit.setBounds(800, 360, 200, 30);
		this.add(quit);


		for (int i = 0; i < 7; i++) {
			this.clouds.add(new Cloud(new Random().nextInt(1100), new Random().nextInt(50) + 20));
		}		
	}
	
	public void paint(Graphics g) {
		g.drawImage(background, 0, 0, null);
		for (Cloud c : this.clouds) {
			g.drawImage(Cloud.CLOUD_PIC, c.getXCoor(), c.getYCoor(), null);
		}
		super.paintComponents(g);
	}

	private class QuitListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			mother.dispose();
		}

	}

	private class NewGameListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			mother.startNewGame();
		}
	}

}

Was dann passiert ist seltsam:
Die Logik des Spiels läuft, es werden auch Statusinformationen ausgegeben. Jedoch ist hat sich das Panel nicht verändert. Der Button ist quasi eingefroren. Ich kann auch meinen Helden auch nicht bewegen, der KeyListener funktioniert also auch irgendwie nicht.
Am Ende, wenn mich meine Gegner getötet haben, wird das letzte Game-over Bild des World-Panels allerdings angezeigt.

Ich hoffe ihr könnt mir helfen und meine Beschreibung war ausführlich genug. Wenn ich mehr Code posten soll, einfach schreiben :)
 

Bile Demon

Bekanntes Mitglied
Deine Paint-Methode sieht schonmal falsch aus. Du meinst wohl
Code:
super.paintComponent(g)
. Außerdem sollte dieser Aufruf VOR deinen eigenen Zeichenoperationen stehen und nicht dahinter.
 

elGurko

Mitglied
Hi,
nein, ich habe mehrer Buttons in meinem Panel Container, also super.paintComponents(g). Und dovor schreiben würde sie ja mit dem Hintergrundbild übermalen.
 

Bile Demon

Bekanntes Mitglied
Java:
this.setVisible(true);
this.add(menu);
this.pack();

Das würde ich so z.B. nicht machen. Normalerweise sollte setVisible(true) als letztes aufgerufen werden, wenn das Objekt fertig konfiguriert ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Animiertes GIF erstellen Spiele- und Multimedia-Programmierung 2
R JPanel wird erst im Fullscreen angezeigt Spiele- und Multimedia-Programmierung 1
P selectedItem aus einem Methodenerstellten JPanel auslesen. Spiele- und Multimedia-Programmierung 5
M JPanel mit Graphics2D Objekten mit JScrollpane Spiele- und Multimedia-Programmierung 6
K JPanel wechseln & Neu starten - SnakeSpiel Spiele- und Multimedia-Programmierung 2
A paintComponent in JPanel in JFrame Spiele- und Multimedia-Programmierung 7
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
W Panel/JPAnel createImage() Exception Spiele- und Multimedia-Programmierung 2
R Probleme mit JPanel!KeyListener geht nicht Spiele- und Multimedia-Programmierung 6
T Problem bei LinkedList / JPanel Spiele- und Multimedia-Programmierung 4
C 2D Sprites an die JPanel Größe (Auflösung) anpassen/skalieren Spiele- und Multimedia-Programmierung 3
F Vektorgrafik in JPanel Spiele- und Multimedia-Programmierung 5
E Active Rendering im FSEM auf ein JPanel? Spiele- und Multimedia-Programmierung 4
L 2D-Spiele ruckeln auf JPanel Spiele- und Multimedia-Programmierung 7
A Mehrere geometrische Objekte in JPanel zeichnen Spiele- und Multimedia-Programmierung 4
X JPanel dynamisch (Koordinatensystem)? Spiele- und Multimedia-Programmierung 30
M Jpanel Graphik speichern Spiele- und Multimedia-Programmierung 6
DamienX Canvas vs JPanel Spiele- und Multimedia-Programmierung 15
S Problem mit JPanel bzw p a i n t Spiele- und Multimedia-Programmierung 6
K stringWidth bei Graphics von JPanel und Printer unterschiedl Spiele- und Multimedia-Programmierung 4
R SimpleUniverse in JPanel Spiele- und Multimedia-Programmierung 4
M 1. Menüleiste wird doppelt gezeichnet 2. awt auf ein jpanel Spiele- und Multimedia-Programmierung 4
M Jpanel mit Keylistener Spiele- und Multimedia-Programmierung 6
D 2D Graphic Objekte in ein JPanel einfügen Spiele- und Multimedia-Programmierung 2
O Image dynamisch erstellen. Spiele- und Multimedia-Programmierung 6

Ähnliche Java Themen

Neue Themen


Oben