Hallo,
ich beschäftige mich momentan mit meinem ersten Java-Game.
Nachdem ich mich jetzt schon eine Weile mit der GUI rumplage, wende ich mich nun an das Forum.
Die Idee:
Es wird ein Startbildschirm angezeigt. Im Hintergrund befindet sich ein Bild, auf welchem verschiedene Komponenten dargestellt werden (Buttons, Labels...).
Zufällig soll in einem Rahmen von 10 Sekunden ein Stern in Form eines kleinen Ovals erscheinen und sich über das Bild bewegen. Dabei soll der Hintergrund weiterhin sichtbar sein.
Die Umsetzung:
Ich habe eine LayeredPane erzeugt, welche zwei Panels enthält.
1. das mainPanel (Hintergrundbild, Buttons etc.)
2. das SternPanel (der sich bewegende Stern)
Diese setzte ich auf einen Frame.
Das Ergebnis:
Am Anfang wird alles richtig angezeigt. Nachdem der Stern jedoch das erste mal das Bild durchläuft, verschwinden die beiden Buttons, welche sich in dem mainPanel befinden. Komischerweise bleiben sowohl das Hintergrundbild, als auch das Textfeld erhalten.
Weiterhin zeigt sich der Stern nicht als sich bewegender Punkt, sondern als Linie. Hier bräuchte ich wohl eine Art ClearScreen-Methode.
Wäre super, wenn ihr mir da weiterhelfen könntet, weil ich langsam wirklich verzweifle
Hier ist der Code:
ich beschäftige mich momentan mit meinem ersten Java-Game.
Nachdem ich mich jetzt schon eine Weile mit der GUI rumplage, wende ich mich nun an das Forum.
Die Idee:
Es wird ein Startbildschirm angezeigt. Im Hintergrund befindet sich ein Bild, auf welchem verschiedene Komponenten dargestellt werden (Buttons, Labels...).
Zufällig soll in einem Rahmen von 10 Sekunden ein Stern in Form eines kleinen Ovals erscheinen und sich über das Bild bewegen. Dabei soll der Hintergrund weiterhin sichtbar sein.
Die Umsetzung:
Ich habe eine LayeredPane erzeugt, welche zwei Panels enthält.
1. das mainPanel (Hintergrundbild, Buttons etc.)
2. das SternPanel (der sich bewegende Stern)
Diese setzte ich auf einen Frame.
Das Ergebnis:
Am Anfang wird alles richtig angezeigt. Nachdem der Stern jedoch das erste mal das Bild durchläuft, verschwinden die beiden Buttons, welche sich in dem mainPanel befinden. Komischerweise bleiben sowohl das Hintergrundbild, als auch das Textfeld erhalten.
Weiterhin zeigt sich der Stern nicht als sich bewegender Punkt, sondern als Linie. Hier bräuchte ich wohl eine Art ClearScreen-Methode.
Wäre super, wenn ihr mir da weiterhelfen könntet, weil ich langsam wirklich verzweifle
Hier ist der Code:
Java:
import javax.swing.*;
import java.util.ArrayList;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.*;
import java.awt.event.*;
public class Asteroids {
static final int FRAME_WIDTH = 800;
static final int FRAME_HEIGHT=600;
JFrame mainFrame=new JFrame("Asteroids - Danger from outer space");;
JPanel mainPanel;
JLayeredPane layer;
Image background;
Font bigFont = new Font("Arial",Font.ITALIC,20);
Button newGameButton;
Button highscoresButton;
public static void main (String[] args){
Asteroids game = new Asteroids();
game.getImages();
game.startGUI();
}
public void startGUI(){
GridBagLayout gbl = new GridBagLayout();
Runnable starJob = new starMovement();
Thread starThread = new Thread(starJob);
starThread.start();
layer = new JLayeredPane();
layer.setBounds(0,0,FRAME_WIDTH,FRAME_HEIGHT);
mainFrame.setResizable(false);
mainFrame.setPreferredSize(new Dimension(FRAME_WIDTH,FRAME_HEIGHT));
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.pack();
mainFrame.setVisible(true);
JLabel textLabel = new JLabel ("Asteroids - Danger from outer Space");
textLabel.setHorizontalAlignment(JLabel.CENTER);
textLabel.setFont(bigFont);
textLabel.setOpaque(true);
textLabel.setForeground(new Color(255,255,255));
textLabel.setBackground(new Color(0,0,0));
newGameButton = new Button("Neues Spiel starten");
newGameButton.setBackground(Color.DARK_GRAY);
newGameButton.setForeground(Color.white);
newGameButton.addActionListener(new newGameListener());
highscoresButton = new Button ("Highscores");
highscoresButton.setBackground(Color.darkGray);
highscoresButton.setForeground(Color.white);
highscoresButton.addActionListener(new highscoresListener());
mainPanel = new JPanel();
mainPanel.setLayout(gbl);
mainPanel.setBounds(0,0,FRAME_WIDTH,FRAME_HEIGHT);
starPanel s = new starPanel();
s.setBounds(0,0,FRAME_WIDTH,FRAME_HEIGHT);
s.setOpaque(false);
addComponent(mainPanel,gbl,textLabel,0,0,1,1,0,10);
addComponent(mainPanel,gbl,new JLabel(),0,1,1,1,0,50);
addComponent(mainPanel,gbl,newGameButton,0,2,1,1,1,10);
addComponent(mainPanel,gbl,highscoresButton,0,3,1,1,1,10);
addComponent(mainPanel,gbl,(new JLabel(new ImageIcon(background))),0,0,0,0,0,0);
mainFrame.add(BorderLayout.CENTER,layer);
layer.add(mainPanel, new Integer(0),0);
layer.add(s, new Integer(1),0);
}
public void getImages(){
background = new ImageIcon (getClass().getResource("background.png")).getImage();
/*Bild liegt in Resource-Ordner, welcher unter Properties der
* Klasse hinzugefügt wurde.
*/
}
public void startGame(){
}
public class newGameListener implements ActionListener{
public void actionPerformed(ActionEvent e){
System.out.println("Neues Spiel gestartet");
startGame();
}
}
public class highscoresListener implements ActionListener{
public void actionPerformed(ActionEvent e){
System.out.println("Highscores");
}
}
static void addComponent( Container cont,
GridBagLayout gbl,
Component c,
int x, int y,
int width, int height,
double weightx, double weighty )
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.NONE;
gbc.gridx = x; gbc.gridy = y;
gbc.gridwidth = width; gbc.gridheight = height;
gbc.weightx = weightx; gbc.weighty = weighty;
gbl.setConstraints( c, gbc );
cont.add( c );
}
public class starMovement implements Runnable{
public void run(){
while(true){
System.out.println("Stern erscheint");
mainFrame.repaint();
/* alle panel-relevanten Methoden werden erneut durchlaufen
* --> paintStar wird erneut instanziiert!!!
*/
try{
Thread.sleep((long) (Math.random()*10000));
}catch(Exception ex){ex.printStackTrace();}
}
}
}
public class starPanel extends JPanel{
/* wird paintStar instanziiert, wird automatisch die Methode
* paintComponent aufgerufen.
*/
public void paintComponent (Graphics g){
System.out.println("test");
g.setColor(new Color (255,255,255));
for(int i = 0; i<FRAME_WIDTH;i++){
g.fillOval(i,i, 2, 2);
}
}
}
}