Hallo!.
Ich habe ein Spiel mit einem Menü und dem eigentlichen Spiel.
Mein Problem ist das, wenn ich das Menü durch das Game-Play erstetze (CardLayout) mein KeyListener und wenn ich es anderrum versuche der ActionListener nicht mehr funktioniert.
Bitte dringend um Hilfe!
Vielen Dank schonmal!
Die Hauptklasse:
Die GamePlay Klasse
Die Menu (noch GameEnd ist aber am Ende das gleiche) Klasse
Ich habe ein Spiel mit einem Menü und dem eigentlichen Spiel.
Mein Problem ist das, wenn ich das Menü durch das Game-Play erstetze (CardLayout) mein KeyListener und wenn ich es anderrum versuche der ActionListener nicht mehr funktioniert.
Bitte dringend um Hilfe!
Vielen Dank schonmal!
Die Hauptklasse:
Java:
package com.ludevstudio.brickbreaker;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.text.Position;
public class Main extends JFrame implements ActionListener{
GamePlay playGround = new GamePlay(this);
GameEnd gameEnd = new GameEnd(playGround, this);
Menu menu = new Menu();
JPanel masterContainer = new JPanel();
CardLayout layout = new CardLayout();
public static void main(String[] args) {
new Main();
}
public Main() {
setSize(800, 800);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setFocusable(true);
setLocationRelativeTo(null);
setLayout(null);
initComponents();
setVisible(true);
}
public void initComponents() {
masterContainer.setBounds(0, 0, 800, 800);
masterContainer.setVisible(true);
masterContainer.setFocusable(true);
masterContainer.setLayout(layout);
this.add(masterContainer);
gameEnd.setBounds(0, 0, 800, 800);
gameEnd.setFocusable(true);
masterContainer.add(gameEnd, "gameend");
playGround.setBounds(0, 0, 800, 800);
playGround.setFocusable(true);
masterContainer.add(playGround, "playground");
}
@Override
public void actionPerformed(ActionEvent e) {
}
public void showGameEnd() {
layout.show(masterContainer, "gameend");
}
public void showGamePlay() {
layout.show(masterContainer, "playground");
}
}
Die GamePlay Klasse
Java:
package com.ludevstudio.brickbreaker;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GamePlay extends JPanel implements KeyListener, ActionListener {
Timer timer;
int delay = 1;
Boolean play = false;
// Komponenten
Player player;
Border border;
Ball ball;
Levels levels;
MapGenerator mapGen;
Main mainFrame;
public GamePlay(Main mainFrame) {
this.mainFrame = mainFrame;
setFocusable(true);
addKeyListener(this);
timer = new Timer(delay, this);
timer.start();
player = new Player();
border = new Border();
ball = new Ball(player);
levels = new Levels();
mapGen = new MapGenerator(levels.level1, levels.getLevel1Colors());
}
public void paint (Graphics g) {
// Hintergrund
g.setColor(Color.BLACK);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
// Player
player.draw((Graphics2D)g);
// Border
border.draw((Graphics2D)g);
// Ball
ball.draw((Graphics2D)g);
// Map
mapGen.draw((Graphics2D)g);
}
@Override
public void actionPerformed(ActionEvent arg0) {
timer.start();
if(play) {
ball.move();
ball.rebound();
if(ball.getBall().y>800) {
mainFrame.showGameEnd();
}
}
repaint();
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_LEFT) {
play = true;
player.moveLeft();
repaint();
} else if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
play = true;
player.moveRight();
repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
Die Menu (noch GameEnd ist aber am Ende das gleiche) Klasse
Java:
package com.ludevstudio.brickbreaker;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class GameEnd extends JPanel implements ActionListener{
JButton btnPlay, btnExit;
JLabel labelTitle, labelSubTitle, labelCopyRight;
Main mainFrame;
GamePlay gamePlay;
public GameEnd(GamePlay gamePlay, Main mainFrame) {
this.mainFrame = mainFrame;
this.gamePlay = gamePlay;
setLayout(null);
setBackground(Color.BLACK);
setVisible(true);
initComponents();
}
public void initComponents() {
Font titleFont = new Font ("segoe script", Font.BOLD, 100);
Font SubTitlefont = new Font("segoe script", Font.BOLD, 20);
Font font = new Font("segoe script", Font.BOLD, 50);
labelTitle = new JLabel("BrickBreaker");
labelTitle.setBounds(0, 60, 800, 130);
labelTitle.setHorizontalAlignment(JLabel.CENTER);
labelTitle.setFont(titleFont);
labelTitle.setForeground(Color.RED);
this.add(labelTitle);
labelSubTitle = new JLabel("powered by LuDev Studio");
labelSubTitle.setBounds(0, 150, 800, 50);
labelSubTitle.setHorizontalAlignment(JLabel.CENTER);
labelSubTitle.setFont(SubTitlefont);
labelSubTitle.setForeground(Color.CYAN);
this.add(labelSubTitle);
btnPlay = new JButton("Play");
btnPlay.setBounds(300, 350, 200, 80);
btnPlay.setFont(font);
btnPlay.addActionListener(this);
this.add(btnPlay);
btnExit = new JButton("Exit");
btnExit.setBounds(300, 470, 200, 80);
btnExit.setFont(font);
btnExit.addActionListener(this);
this.add(btnExit);
labelCopyRight = new JLabel("@2017 LuDev Studio - All rights reserved.");
labelCopyRight.setBounds(0, 730, 800, 30);
labelCopyRight.setHorizontalAlignment(JLabel.CENTER);
labelCopyRight.setFont(SubTitlefont);
labelCopyRight.setForeground(Color.CYAN);
this.add(labelCopyRight);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btnPlay) {
mainFrame.showGamePlay();
} else if(e.getSource()==btnExit) {
System.exit(0);
}
}
}