Hallo,
Ich programmiere gerade ein Jump and Run und benutze das CardLayout für die verschiedenen Bildschirme. Ich möchte wenn ein Level geladen wird einen Ladebildschirm einblenden, was aber komischerweise in meinem Listener nicht funktioniert, am Anfang, wenn das Hauptmenü geladen wird allerdings schon.
Die Main-Klasse:
Und die LoadingScreen-Klasse:
Weiss jemand, warum das nicht funktioniert und wie man es zum laufen bringt?
Wäre sehr froh um eine Lösung.
mfg, Faberix
Ich programmiere gerade ein Jump and Run und benutze das CardLayout für die verschiedenen Bildschirme. Ich möchte wenn ein Level geladen wird einen Ladebildschirm einblenden, was aber komischerweise in meinem Listener nicht funktioniert, am Anfang, wenn das Hauptmenü geladen wird allerdings schon.
Die Main-Klasse:
Java:
package ch.faberix.jumpandrun;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;
public class Main extends JPanel implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
public static LevelIcon LEVEL_1;
public static LevelIcon LEVEL_2;
public static final String SCREEN_MAIN_MENU = "0";
public static final String SCREEN_LEVEL_MENU = "1";
public static final String SCREEN_WAIT = "2";
public static final String SCREEN_RUNNING_GAME = "3";
public String CurrentScreen = "2";
public static Component currentScreenComponent;
public static final JPanel levelMenu = new LevelMenu();
private JButton start;
public static JFrame f;
public JFrame frame;
public Game4 game4;
public Game game;
public static Image background;
private static int width;
private static int height;
private static CardLayout cardLayout = new CardLayout();
public LoadingScreen loadingScreen = null;
private static Main Instance;
private static Main.LevelButtonListener LButtonListener;
public static jumpListener JumpListener;
public Main() {
ImageIcon icon = new ImageIcon(this.getClass().getResource("assets/wolken.png"));
width = icon.getIconWidth();
height = icon.getIconHeight();
background = icon.getImage();
loadingScreen = new LoadingScreen(background, width, height);
f.getContentPane().add(loadingScreen, SCREEN_WAIT);
f.setVisible(true);
start = new JButton("Spiel starten");
start.addActionListener(this);
add(start);
Instance = this;
LevelButtonListener LBListener = new LevelButtonListener();
LButtonListener = LBListener;
JumpListener = new jumpListener();
}
public static void main(String...args) {
f = new JFrame("Jump and Run");
f.getContentPane().setLayout(cardLayout);
Main menu = new Main();
f.setSize(width, height);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
try {
BufferedImage levelIcon = ImageIO.read(Instance.getClass().getResource("assets/levelIcon.png"));
BufferedImage displayImage1 = DisplayImageCreator.create(ImageIO.read(Instance.getClass().getResource("assets/level/1.png")));
BufferedImage displayImage2 = DisplayImageCreator.create(ImageIO.read(Instance.getClass().getResource("assets/level/2.png")));
LEVEL_1 = new LevelIcon(ImageIO.read(Instance.getClass().getResource("assets/level/1.png")), /*ImageIO.read(Instance.getClass().getResource("assets/level/1_2.png"))*/displayImage1, ImageIO.read(Instance.getClass().getResource("assets/levelIcon.png")), "1");
LEVEL_2 = new LevelIcon(ImageIO.read(Instance.getClass().getResource("assets/level/2.png")), displayImage2, levelIcon, "2");
} catch (IOException e) {
e.printStackTrace();
}
buildLevelMenu(LEVEL_1, LEVEL_2);
f.getContentPane().add(menu, SCREEN_MAIN_MENU);
f.getContentPane().add(levelMenu, SCREEN_LEVEL_MENU);
menu.setScreen(SCREEN_MAIN_MENU);
currentScreenComponent = menu;
System.out.println("visible");
}
private static void buildLevelMenu(LevelIcon...levels) {
levelMenu.setLayout(new FlowLayout());
for(int i = 0; i < levels.length; i++) {
levelMenu.add(levels[i]);
levels[i].addActionListener(LButtonListener);
}
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == start) {
setScreen(SCREEN_LEVEL_MENU);
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(background, 0, 0, this);
}
public void setScreen(String screen) {
System.out.println("================================Current Screen: " + screen + "=======================");
CurrentScreen = screen;
cardLayout.show(f.getContentPane(), screen);
}
public void setGamePaused() {
game.isPaused = true;
game.pauseButton.setVisible(false);
game.add(game.backToGame);
game.add(game.restartLevel);
game.add(game.backToLevelMenu);
game.add(game.backToMainMenu);
game.backToGame.setVisible(true);
game.restartLevel.setVisible(true);
game.backToLevelMenu.setVisible(true);
game.backToMainMenu.setVisible(true);
game.repaint();
}
public void setGameRunning() {
game.isPaused = false;
game.backToGame.setVisible(false);
game.restartLevel.setVisible(false);
game.backToLevelMenu.setVisible(false);
game.backToMainMenu.setVisible(false);
game.remove(game.backToGame);
game.remove(game.restartLevel);
game.remove(game.backToLevelMenu);
game.remove(game.backToMainMenu);
game.pauseButton.setVisible(true);
System.out.println("running");
synchronized(game) {
game.notify();
System.out.println("game: running");
}
}
public void setGameRunningAfterDeath() {
game.isDead = false;
game.backToLevelMenu.setVisible(false);
game.backToMainMenu.setVisible(false);
game.remove(game.backToLevelMenu);
game.remove(game.backToMainMenu);
synchronized(game) {
game.notify();
}
}
public void restartLevel(BufferedImage displayImage, BufferedImage sourceImage) throws IOException {
game.running = false;
synchronized(game.game2) {
game.game2.notify();
}
synchronized(game) {
game.notify();
}
game = new Game(this, displayImage, sourceImage);
}
public class jumpListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
// System.out.println("=============Pressed===============================");
if(CurrentScreen.equals(SCREEN_RUNNING_GAME)) {
if(e.getKeyCode() == KeyEvent.VK_SPACE) {
/*if(!game.isFalling)
game.isJumping = true;*/
if(!game.isFalling)
game.isJumping = true;
}
else if(e.getKeyCode() == KeyEvent.VK_ESCAPE && !game.isDead) {
if(game.isPaused)
setGameRunning();
else
setGamePaused();
}
}
}
@Override
public void keyReleased(KeyEvent e) {
if(CurrentScreen.equals(SCREEN_RUNNING_GAME)) {
if(e.getKeyCode() == KeyEvent.VK_SPACE) {
/*game.isJumping = false;
game.isFalling = true;*/
game.isJumping = false;
game.isFalling = true;
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
}
public class LevelButtonListener implements ActionListener {
private BufferedImage sourceImage;
private BufferedImage displayImage;
//wenn ein Levelbutton gedrückt wird (startet Level)
@Override
public void actionPerformed(ActionEvent e) {
if(loadingScreen == null)
System.out.println("=============LoadingScreen = null!===============");
if(e.getSource() instanceof LevelIcon) {
Component[] c = f.getContentPane().getComponents();
for(Component c2 : c) {
System.out.println(c2.toString());
}
setScreen(SCREEN_WAIT);
LevelIcon icon = (LevelIcon) e.getSource();
sourceImage = icon.getSourceImage();
displayImage = icon.getDisplayImage();
try {
game = new Game(Instance, sourceImage, displayImage);
f.getContentPane().add(game, SCREEN_RUNNING_GAME);
game.addKeyListener(new jumpListener());
while(!game.finishedLoading) {
}
setScreen(SCREEN_RUNNING_GAME);
game.setFocusable(true);
game.requestFocus();
game.start();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
Und die LoadingScreen-Klasse:
Java:
package ch.faberix.jumpandrun;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.*;
public class LoadingScreen extends JPanel {
private Image background;
private int width, height;
public LoadingScreen(Image background, int width, int height) {
super();
this.background = background;
this.setSize(width, height);
this.width = width;
this.height = height;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
//Hintergrund und Text zeichnen
g.drawImage(background, 0, 0, null);
g.setFont(new Font("sans", Font.PLAIN, 60));
g.setColor(Color.DARK_GRAY);
g.drawString("Ladevorgang", width/2 - 200, height/2 - 40);
}
}
Weiss jemand, warum das nicht funktioniert und wie man es zum laufen bringt?
Wäre sehr froh um eine Lösung.
mfg, Faberix