Hallo zusammen,
Ich bin dabei als kleine Projektarbeit für die Uni ein BAP-Spiel zu schreiben, dabei habe 2 Probleme die ich leider durch suchen hier im Forum auch nicht gelösst bekomme:
Mein erster Versuche des Spiels habe ich im AWT geschrieben, da gibt es 3 Klassen: Balken, Ball und Spiel. Spiel ist für den Spielablauf da und bei den anderen beiden wird der Ball und der Balken definiert. Ist sicherlich noch ausbaufähig aber es bewegt sich schon mal.
Jetzt möchte ich das ganze in SWING schreiben (BAP_Spiel) und habe da schon einige Menüs etc. gemacht. Das klappt auch soweit. Da dachte ich mir ich mache ein Jpanel wo ich das eigentliche Spiel drin läuft. (Spielfeld).
Jetzt habe ich ein Panel gemacht und wenn ich das Programm startet zeichnet er mir die Menüleiste doppelt. Warum?
Und wäre ich für ein Tipps wie meine erste Version auf das JPanel bekomme sehr dankbar.
Ich hoffe ich habe mich halbwegs verständlich ausgedrückt wo ich mein Problem habe.
Danke schon mal für die Hilfe
Hier ist die AWT Version die ich gerne als JPanel haben möchte:
Die Balken:
Und der Ball
Das ist die Swing Version mit den ganzen Menüs
Das Spielfeld hier soll das Spiel drin laufen:
Ich bin dabei als kleine Projektarbeit für die Uni ein BAP-Spiel zu schreiben, dabei habe 2 Probleme die ich leider durch suchen hier im Forum auch nicht gelösst bekomme:
Mein erster Versuche des Spiels habe ich im AWT geschrieben, da gibt es 3 Klassen: Balken, Ball und Spiel. Spiel ist für den Spielablauf da und bei den anderen beiden wird der Ball und der Balken definiert. Ist sicherlich noch ausbaufähig aber es bewegt sich schon mal.
Jetzt möchte ich das ganze in SWING schreiben (BAP_Spiel) und habe da schon einige Menüs etc. gemacht. Das klappt auch soweit. Da dachte ich mir ich mache ein Jpanel wo ich das eigentliche Spiel drin läuft. (Spielfeld).
Jetzt habe ich ein Panel gemacht und wenn ich das Programm startet zeichnet er mir die Menüleiste doppelt. Warum?
Und wäre ich für ein Tipps wie meine erste Version auf das JPanel bekomme sehr dankbar.
Ich hoffe ich habe mich halbwegs verständlich ausgedrückt wo ich mein Problem habe.
Danke schon mal für die Hilfe
Hier ist die AWT Version die ich gerne als JPanel haben möchte:
Code:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
public class Spiel extends Canvas {
public static final int breite = 800, hoehe = 600, pause = 1, schlaegerBreite = 50, schlaegerHoehe = 12,schlaegerOben=545;
public int mausX,mausY,mausTaste, anzahlTreffer=0;
public boolean balkenTreffer = false;
public final int anzahlBalkenSpalten = 14,anzahlBalkenReihen = 2;
public BufferStrategy strategy;
Ball ball;
Balken balkenReihe[][] = new Balken[anzahlBalkenReihen][anzahlBalkenSpalten];
public Spiel() {
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
Frame fenster = new Frame();
fenster.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
fenster.add(this);
addMouseMotionListener(new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
mausX = e.getX();
mausY = e.getY();
}
});
fenster.setTitle("BAP - Spiel");
fenster.setSize(breite+7, hoehe+33);
fenster.setBackground(Color.black);
fenster.setLocation((d.width - fenster.getWidth()) / 2,
(d.height - fenster.getHeight()) / 2);
fenster.setResizable(false);
fenster.setVisible(true);
ball = new Ball(180,180,10);
ball.setSpeedX(1);
ball.setSpeedY(1);
for (int i = 1; i < anzahlBalkenReihen; i++) {
for (int j = 1; j < anzahlBalkenSpalten; j++){
balkenReihe[i][j] = new Balken((j-1) * 60 + 14,150 - (i * 20),Color.red);
}
}
createBufferStrategy(2);
strategy = getBufferStrategy();
}
public void zeichneSpielfeld() {
Graphics g = strategy.getDrawGraphics();
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
ball.paint(g);
for (int i=1;i<anzahlBalkenReihen;i++){
for (int j=1;j<anzahlBalkenSpalten;j++){
if (balkenReihe[i][j].getGetroffen() == false){
balkenReihe[i][j].paint(g);
}
}
}
g.setColor(Color.gray);
g.fill3DRect(mausX - schlaegerBreite/2, schlaegerOben, schlaegerBreite, schlaegerHoehe, true);
g.drawString("Treffer: " + anzahlTreffer,10,580);
strategy.show();
}
public void updateFenster() {
ball.bewegen(balkenTreffer);
balkenTreffer = false;
ball.testeObSchlaegerGetroffen(schlaegerOben,schlaegerOben+schlaegerHoehe,mausX - schlaegerBreite/2,mausX + schlaegerBreite/2);
for (int i=1;i<anzahlBalkenReihen;i++){
for (int j=1;j<anzahlBalkenSpalten;j++){
if (balkenReihe[i][j].getGetroffen() == false){
balkenReihe[i][j].pruefeTreffer(ball.getBallX(),ball.getBallY(),ball.getBallRadius());
if (balkenTreffer == false){
balkenTreffer = balkenReihe[i][j].getGetroffen();
if (balkenTreffer == true){anzahlTreffer++;}
}
}
}
}
}
public void game() {
while (isVisible()) {
updateFenster();
zeichneSpielfeld();
try {
Thread.sleep(pause);
} catch (InterruptedException e) {
}
}
}
public static void main(String[] args) {
Spiel bap = new Spiel();
bap.game();
}
}
Die Balken:
Code:
import java.awt.*;
public class Balken {
// Variablen
private int balkenX; // x - Position des Balken
private int balkenY; // y - Position des Balken
private static final int balkenBreite = 50; // Balkenbreite
private static final int balkenHoehe = 12; // Balkenhoehe
private Color c;
private boolean getroffen = false;
Balken(int balkenX, int balkenY, Color c) {
this.balkenX = balkenX;
this.balkenY = balkenY;
this.c = c;
}
public void pruefeTreffer(int ballX, int ballY, int ballRadius) {
int ballOben = ballY - ballRadius;
int ballUnten = ballY + ballRadius;
int ballLinks = ballX - ballRadius;
int ballRechts = ballX + ballRadius;
if (((ballOben <= balkenY + balkenHoehe) && (ballUnten >= balkenY) ) && ((ballLinks <= balkenX + balkenBreite) && (ballRechts >= balkenX))){
getroffen = true;
}
}
public boolean getGetroffen(){
return getroffen;
}
public void paint(Graphics g) {
if (getroffen == false) {
g.setColor(c);
g.fill3DRect(balkenX, balkenY, balkenBreite, balkenHoehe, true);
}
if (getroffen == true) {
g.setColor(Color.black);
g.fill3DRect(balkenX, balkenY, balkenBreite, balkenHoehe, true);
}
}
}
Und der Ball
Code:
import java.awt.*;
public class Ball {
// Variablen
private int ballX; // x - Position des Balles
private int ballY; // y - Position des Balles
private int ballRadius; // Ballradius
private int speedX; // Geschwindigkeit in x - Richtung
private int speedY; // Geschwindigkeit in y - Richtung
private boolean balkenTreffer;
// Positionen
private int ballOben; // Obergrenze des Balles
private int ballUnten; // Untergrenze des Balles
private int ballLinks; // Linke Grenze des Balles
private int ballRechts; // Rechte Grenze des Balles
//?
private int schlaegerOben; // Oberkante des Schlägers
private int schlaegerUnten; // Unterkante des Schlägers
private int schlaegerLinks; // Linke Grenze des Schlägers
private int schlaegerRechts; // Rechte Grenze des Schlägers
public Ball(int ballX, int ballY, int ballRadius) {
this.ballX = ballX;
this.ballY = ballY;
this.ballRadius = ballRadius;
}
public void setSpeedX(int speedX) {
this.speedX = speedX;
}
public void setSpeedY(int speedY) {
this.speedY = speedY;
}
public void bewegen(boolean balkenTreffer) {
this.balkenTreffer = balkenTreffer;
ballX += speedX;
ballY += speedY;
istBallOut();
}
public void istBallOut() {
// Ball bewegt sich nach links
if (speedX < 0) {
if (ballX < ballRadius) {
// Geschwindigkeit umdrehen
speedX = -speedX;
}
}
// Ball bewegt sich nach rechts
else if (speedX > 0) {
if (ballX > Spiel.breite-ballRadius) {
// Geschwindigkeit umdrehen
speedX = -speedX;
}
}
// Ball bewegt sich nach oben
if (speedY < 0) {
if ((ballY < 0+ballRadius) || (balkenTreffer == true)) {
speedY = -speedY;
}
}
// Ball bewegt sich nach unten
else if (speedY > 0) {
if ((ballY > Spiel.hoehe-ballRadius) || (balkenTreffer == true)) {
speedY = -speedY;
}
}
}
public void testeObSchlaegerGetroffen (int schlaegerOben, int schlaegerUnten,int schlaegerLinks, int schlaegerRechts) {
// Initialisierung der momentanen Positionen des Schlägers
this.schlaegerOben = schlaegerOben;
this.schlaegerUnten = schlaegerUnten;
this.schlaegerLinks = schlaegerLinks;
this.schlaegerRechts = schlaegerRechts;
// Initialisierung der Ballpositionen
ballOben = ballY - ballRadius;
ballUnten = ballY + ballRadius;
ballLinks = ballX - ballRadius;
ballRechts = ballX + ballRadius;
if ((ballX >= schlaegerLinks) && (ballX <= schlaegerRechts) && (ballUnten >= schlaegerOben) && (ballUnten<=schlaegerUnten)){
speedY = -speedY;
}
}
public void paint(Graphics g) {
g.setColor(Color.blue);
g.fillOval(ballX - ballRadius, ballY - ballRadius, 2 * ballRadius,
2 * ballRadius);
}
public int getspeedX() {
return speedX;
}
public int getspeedY() {
return speedY;
}
public int getBallX() {
return ballX;
}
public int getBallY() {
return ballY;
}
public int getBallRadius() {
return ballRadius;
}
}
Das ist die Swing Version mit den ganzen Menüs
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
*
* Beschreibung
*
* @version 1.0 vom 11.11.2006
* @author
*/
public class BAP_Spiel extends JFrame {
// Anfang Variablen
private JMenuBar jmb_menu = new JMenuBar();
private JMenu jmu_Spiel = new JMenu("Spiel");
private JMenuItem SpielJMenuItem1 = new JMenuItem("Neu");
private JMenuItem SpielJMenuItem2 = new JMenuItem("Beenden");
private JMenu jmu_Level = new JMenu("Level");
private JRadioButtonMenuItem LevelJRadioButtonMenuItem1 = new JRadioButtonMenuItem("Level 1");
private JRadioButtonMenuItem LevelJRadioButtonMenuItem2 = new JRadioButtonMenuItem("Level 2");
private JRadioButtonMenuItem LevelJRadioButtonMenuItem3 = new JRadioButtonMenuItem("Level 3");
private JRadioButtonMenuItem LevelJRadioButtonMenuItem4 = new JRadioButtonMenuItem("Level 4");
private JRadioButtonMenuItem LevelJRadioButtonMenuItem5 = new JRadioButtonMenuItem("Level 5");
private JMenu jmu_Highscore = new JMenu("Highscore");
private JMenuItem HighscoreJMenuItem1 = new JMenuItem("Anzeigen");
private JMenuItem HighscoreJMenuItem2 = new JMenuItem("löschen");
private JMenu jmu_Hilfe = new JMenu("Hilfe");
private JMenuItem HilfeJMenuItem1 = new JMenuItem("Hilfe");
private JMenuItem HilfeJMenuItem2 = new JMenuItem("Info");
private ButtonGroup LevelRadioButton = new ButtonGroup();
public Spielfeld SpielFeldBAP = new Spielfeld();
public static int mausX,mausY;
// Ende Variablen
public BAP_Spiel(String title) {
// Frame-Initialisierung
super(title);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) { System.exit(0); }
});
addMouseMotionListener(new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
mausX = e.getX();
mausY = e.getY();
}
});
int frameWidth = 800;
int frameHeight = 600;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2 ;
setLocation(x, y);
//SpielFeldBAP.setDoubleBuffered(true);
Container cp = getContentPane();
cp.add(SpielFeldBAP);
// Anfang Komponenten
setJMenuBar(jmb_menu);
jmb_menu.add(jmu_Spiel);
SpielJMenuItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
SpielJMenuItem1ActionPerformed(evt); } });
jmu_Spiel.add(SpielJMenuItem1);
jmu_Spiel.addSeparator();
SpielJMenuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
SpielJMenuItem2ActionPerformed(evt); } });
jmu_Spiel.add(SpielJMenuItem2);
//Hier wird definiert das die Levelauswahl gruppiert wird sprich immer nur eine Auswahl möglich
LevelRadioButton.add(LevelJRadioButtonMenuItem1);
LevelRadioButton.add(LevelJRadioButtonMenuItem2);
LevelRadioButton.add(LevelJRadioButtonMenuItem3);
LevelRadioButton.add(LevelJRadioButtonMenuItem4);
LevelRadioButton.add(LevelJRadioButtonMenuItem5);
// ENde der definition
jmb_menu.add(jmu_Level);
LevelJRadioButtonMenuItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
LevelJRadioButtonMenuItem1ActionPerformed(evt); } });
jmu_Level.add(LevelJRadioButtonMenuItem1);
LevelJRadioButtonMenuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
LevelJRadioButtonMenuItem2ActionPerformed(evt); } });
jmu_Level.add(LevelJRadioButtonMenuItem2);
LevelJRadioButtonMenuItem3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
LevelJRadioButtonMenuItem3ActionPerformed(evt); } });
jmu_Level.add(LevelJRadioButtonMenuItem3);
LevelJRadioButtonMenuItem4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
LevelJRadioButtonMenuItem4ActionPerformed(evt); } });
jmu_Level.add(LevelJRadioButtonMenuItem4);
LevelJRadioButtonMenuItem5.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
LevelJRadioButtonMenuItem5ActionPerformed(evt); } });
jmu_Level.add(LevelJRadioButtonMenuItem5);
jmb_menu.add(jmu_Highscore);
HighscoreJMenuItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
HighscoreJMenuItem1ActionPerformed(evt); } });
jmu_Highscore.add(HighscoreJMenuItem1);
jmu_Highscore.addSeparator();
HighscoreJMenuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
HighscoreJMenuItem2ActionPerformed(evt); } });
jmu_Highscore.add(HighscoreJMenuItem2);
jmb_menu.add(jmu_Hilfe);
HilfeJMenuItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
HilfeJMenuItem1ActionPerformed(evt); } });
jmu_Hilfe.add(HilfeJMenuItem1);
jmu_Hilfe.addSeparator();
HilfeJMenuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
HilfeJMenuItem2ActionPerformed(evt); } });
jmu_Hilfe.add(HilfeJMenuItem2);
// Ende Komponenten
setResizable(false);
//setVisible(true);
}
// Anfang Ereignisprozeduren
public void SpielJMenuItem1ActionPerformed(ActionEvent evt) {
}
public void SpielJMenuItem2ActionPerformed(ActionEvent evt) {
DialogBeenden DialogEnde = new DialogBeenden(this,"Ende?",true);
}
public void LevelJRadioButtonMenuItem1ActionPerformed(ActionEvent evt) {
}
public void LevelJRadioButtonMenuItem2ActionPerformed(ActionEvent evt) {
}
public void LevelJRadioButtonMenuItem3ActionPerformed(ActionEvent evt) {
}
public void LevelJRadioButtonMenuItem4ActionPerformed(ActionEvent evt) {
}
public void LevelJRadioButtonMenuItem5ActionPerformed(ActionEvent evt) {
DialogName DialogNameEingeben = new DialogName(this,"Herzlichen Glückwunsch!",true);
}
public void HighscoreJMenuItem1ActionPerformed(ActionEvent evt) {
DialogHighscore DialogHiscoreAnzeigen = new DialogHighscore(this,"Die TOP 10",true);
}
public void HighscoreJMenuItem2ActionPerformed(ActionEvent evt) {
DialogHighscoreLoeschen DialogHL = new DialogHighscoreLoeschen(this,"Löschen?",true);
}
public void HilfeJMenuItem1ActionPerformed(ActionEvent evt) {
DialogHilfe DialogHilfeAnzeigen = new DialogHilfe(this,"Anleitung",true);
}
public void HilfeJMenuItem2ActionPerformed(ActionEvent evt) {
DialogInfo DialogInfoAnzeigen = new DialogInfo(this,"Info",true);
}
// Ende Ereignisprozeduren
public void spielAblauf(){
while (isVisible()){
SpielFeldBAP.repaint();
}
}
public static void main(String[] args) {
BAP_Spiel spiel = new BAP_Spiel("BAP Spiel von Bejer / DeLiello / Krieger / Küls");
spiel.spielAblauf();
}
}
Das Spielfeld hier soll das Spiel drin laufen:
Code:
import java.awt.*;
import javax.swing.*;
class Spielfeld extends JPanel {
@Override
protected void paintComponent(Graphics g){
super.paintComponents(g);
g.fill3DRect(BAP_Spiel.mausX,BAP_Spiel.mausY,20,20,true);
g.setColor(Color.red);
g.drawLine( 10, 10, 100, 50 );