Spiel lässt sich nicht aus GUI starten

FlexiTus

Mitglied
Hallo,

ich habe folgendes Problem: Wenn ich mein Spiel aus der Klasse heraus starte, dann läuft es ohne Probleme, natürlich das normale Flackern von Java^^ Nun rufe ich diese Klasse aus meiner GUI auf, wenn ich einen Button drücke (ActionListener). Das Fenster öffnet sich, weißer Schrim, nichts geschieht und es lässt sich nicht schließen (setDefaultCloseOperation(3); ). Ich poste jetzt meinen Quelltext hinten dran. Haben sich schon ein paar Leute den Kopf dran zerbrochen😀

Erst den meines Spiels: (nur relevante Klassen für das Projekt hier drin)
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Graphics.*;
import java.io.*;

public class Spielereins extends JFrame implements KeyListener, MouseListener, MouseMotionListener
{

    private int x=700,y=350,xm=10,ym=10,y1=300,y2=300, a=3,b=0;
    private boolean pause=true;
    //x1=1140, y1=834, nx=1100, ny=25, xm=10, ym=10, x2=140 , y2=834, x=0 , y=0;
    private JLabel jl;

    public Spielereins(){
        super("Pong - Game");
        setLocation(0,0);
        setSize(1000,700);
        getContentPane().setBackground(Color.BLACK);
        setResizable(false);
        setDefaultCloseOperation(3);
        setLayout(null);
        setVisible(true);

        this.addKeyListener(this); //Key Listener
        this.addMouseListener(this); //Mouse Listener
        this.addMouseMotionListener(this); //MouseMotionListener

        move();
        repaint();

    }

    public void paint(Graphics g){
        /*g.clearRect(0,0,getWidth(),getHeight());
        g.fillRect(140,y1,10,100); //rechtes Paddle
        g.fillRect(1140,y2,10,100); //linkes Paddle

        g.setColor(Color.RED);
        g.fillOval(x,y,25,25);*/

        g.clearRect(0,0,getWidth(),getHeight());

        g.setColor(Color.RED);
        g.fillRect(0,0,1000,5);
        g.fillRect(0,0,5,700);
        g.fillRect(0,695,1000,5);
        g.fillRect(995,0,5,700);

        g.setColor(Color.PINK);
        g.fillRect(0,250,20,200);
        g.fillRect(980,250,20,200);

        g.drawLine(500,0,500,700);
        g.drawOval(400,250,200,200);
        g.drawRect(0,150,100,400);
        g.drawRect(900,150,100,400);

        g.setColor(Color.BLACK);
        g.fillRect(getWidth()/3,y1,20,100);
        g.fillRect(getWidth()/3*2-20,y2,20,100);

        g.setFont(new Font("Arial Black",1,40));
        g.setColor(Color.RED);
        g.drawString(""+b,40,100);
        g.drawString(""+a,950,100);

        g.setColor(Color.RED);
        g.fillOval(x,y,50,50);

    }

    public void keyReleased(KeyEvent e){

    }

    public void keyTyped(KeyEvent e){

    }

    public void keyPressed(KeyEvent e){
        //Figur 1
        /*if(e.getKeyCode()==KeyEvent.VK_W){
        if(x+10<getWidth()-50){
        y-=25;

        }
        }*/

        if(e.getKeyCode()==KeyEvent.VK_S){ //runter S1
            if(x-10>0){
                y1+=30;

            }
        }
        if(e.getKeyCode()==KeyEvent.VK_W){ //hoch S1
            if(x-10>0){
                y1-=30;

            }
        }
        if(e.getKeyCode()==KeyEvent.VK_P){ //Pause
            pause=false;
        }

        if(e.getKeyCode()==KeyEvent.VK_O){ //Pause
            pause=true;
        }
        
        /*}if(e.getKeyCode()==KeyEvent.VK_S){
        if(x+10<getWidth()-50){
        y+=25;

        }
        }*/

        repaint();
    }

    public void mouseMoved(MouseEvent e){ 

        y2 = e.getY();//holt y von Maus
        repaint();

    }

    public void mouseDragged(MouseEvent e){

    }

    public void mousePressed(MouseEvent e) {

    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }

    public void mouseExited(MouseEvent e) {

    }

    public void mouseClicked(MouseEvent e) {
    }

    public void move(){
        while(pause){

            try{
                Thread.sleep(50);

                if(y>getHeight()-50||y<0){
                    ym*=-1; //Ball titscht von Wand ab

                }

                if(x>getWidth()-50||x<0){
                    xm*=-1; //Ball titscht von Wand ab

                }

                if(x+50<getWidth()/3 && x+50+xm>getWidth()/3 && y+25>y1 && y+25<y1+100){                   //Spieler 1 links nach rechts
                    xm*=-1;
                }if(x>getWidth()/3+20 && x+xm<getWidth()/3+20 && y+25>y1 && y+25<y1+100){                   //Spieler 1 rechts nach links
                    xm*=-1;
                }if(x+50<getWidth()/3*2-20 && x+xm+50>getWidth()/3*2-20 && y+25>y2 && y+25<y2+100){         //Spieler 2 links nach rechts
                    xm*=-1;
                }if(x>getWidth()/3*2 && x+xm<getWidth()/3*2 && y+25>y2 && y+25<y2+100){                     //Spieler 2 rechts nach links
                    xm*=-1;
                }if(x+25>getWidth()/3-15 && x+25<getWidth()/3+35 && y+50<y1+10 && y+50+ym>y1+10){           //Spieler 1 oben nach unten
                    ym*=-1;
                }if(x+25>getWidth()/3-15 && x+25<getWidth()/3+35 && y>y1+90 && y+ym<y1+90){                 //Spieler 1 unten nach oben
                    ym*=-1;
                }if(x+25>getWidth()/3*2-35 && x+25<getWidth()/3*2+15 && y+50<y2+10 && y+50+ym>y2+10){       //Spieler 2 oben nach unten
                    ym*=-1;
                }if(x+25>getWidth()/3*2-35 && x+25<getWidth()/3*2+15 && y>y2+90 && y+ym<y2+90){             //Spieler 2 unten nach oben
                    ym*=-1;
                }

                if(y>=250&&y<400&&x==0){
                    a+=1;
                    y=600;
                    x=200;
                    xm*=-1;
                    ym*=-1;
                }

                if(y>=250&&y<400&&x+50==1000){
                    b+=1;
                    y=400;
                    x=400;
                    xm*=-1;
                    ym*=-1;

                }
                y+=ym;
                x+=xm;
                //repaint();
                
            }catch(InterruptedException e){

            }

        }

    }
    
    
}

Und den meiner GUI:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * Write a description of class GUI here.
 * 
 * @author Niklas Seeliger, Nico Wynands
 * @version Alpha 0.1
 */

public class GUI extends JFrame implements ActionListener{

    private JButton spielen, optionen, credits, steuerung, schliessen ;
    private JFrame jfenster;
    private SteuerungF str;

    public GUI(){
        super("Pong");
        setBounds(5,5,800,600);
        getContentPane().setBackground(Color.BLACK);
        setResizable(false);
        setDefaultCloseOperation(0);
        setLayout(null);
        setVisible(true);

        spielen = new JButton("Spiel Starten");
        optionen = new JButton("Optionen");
        steuerung = new JButton("Steuerung");
        credits = new JButton("Mitwirkende");
        schliessen = new JButton("Spiel beenden");        

        spielen    .setBounds(325,200,150,50);
        optionen   .setBounds(325,280,150,50);
        steuerung  .setBounds(325,360,150,50);
        credits    .setBounds(325,440,150,50);
        schliessen .setBounds(325,520,150,50);

        add(spielen);
        add(optionen);
        add(steuerung);
        add(credits);
        add(schliessen);

        spielen     .addActionListener(this);
        optionen    .addActionListener(this);
        steuerung   .addActionListener(this);
        credits     .addActionListener(this);
        schliessen  .addActionListener(this);  
        
        

    }
    
    public void dummy(){
        new Spielereins();
        
    }

    

    public void actionPerformed(ActionEvent e){
        if(e.getSource()== schliessen){
            System.exit(0);
        }
        if(e.getSource() == steuerung){
            
            SteuerungF str = new SteuerungF();
        }
        if(e.getSource() == credits){
            Credits c = new Credits();
        }
        if(e.getSource() == spielen){
            dummy();
        }
    }
}

Ich habe keine Ahnung wo der Fehler liegt, Spiel läuft ja auch ohne Probleme, nur lässt es sich nicht aufrufen. Ich hoffe ihr werdet daraus schlau.

Danke

lg
Niklas

ps: main methode auch vorhanden😀
 
Ist doch klar, dass der Screen so bleibt...

Guck doch mal in den Konstruktor deiner Spielereins-Klasse

Zuerst initialisierst du die Variablen...
Dann rufst du die Methode move() auf.

Die Methode läuft so lange, bis pause == false.
Danach ruft er die paint()-Methode auf.

D.h. dass der JFrame erst gefärbt wird, wenn das Spiel eigentlich schon vorbei ist...

Um das zu ändern, solltest du dir entweder mal das Interface Runnable angucken oder die Methode einfach in dein move() implementieren

Gruß eMmiE
 
Du sollst dir einfach nur das Runnable interface anschauen.
Damit kannst du erreichen, dass du deine repaint-Methode und die move-Methode parallel ausführen kannst.
 
Du sollst dir einfach nur das Runnable interface anschauen.
Damit kannst du erreichen, dass du deine repaint-Methode und die move-Methode parallel ausführen kannst.

Hab mich jetzt ne zeit lang damit beschäftigt, habe immer noch dasselbe Problem.

habe das eingefügt:
Java:
public void run(){
         move();
         repaint();

}

Im Konstruktor repaint() und move() durch run() ersetzt. Oder wie war das gemeint?
 
Runnable siehts so aus, dass du einen Thread, d.h. ein Element, das einen Programmteil (-> die run-methode) ausführt.

Diesen Thread musst du im Konstruktor starten, vorzugsweise nachdem du alles andere initialisiert hast.
Runnable gewährt einfach nur einen möglichst reibungslosen Ablauf des Threads.
Wenn jetzt in deiner run-Methode eine (quasi-)Unendlichschleife drin ist, a lá while(true) oder while(running);running = true; dann führt das Programm immer wieder das aus, bis du es unterbrichst.

Probier einfach mal aus, dass du mithilfe des Interfaces Runnable ein Programm schreibst, das in der Schleife immer wieder per sysout "läuft" schreibt, bis du eine bestimmte Taste drückst.

So ähnlich läuft das dann auch mit deinem anderen Programm.
Code:
while(true) {
move();
repaint();
}

Dabei musst du natürlich darauf achten, dass im move() keine Unendlichschleife entstehen kann, da sonst nicht repainted wird.

Probier mal das hier aus, zu Verdeutlichung:
Code:
int xPos = 0;
Thread t = new Thread(this); //<- im Konstruktor
t.start();

while(running) {
move();
repaint();
try {
t.sleep(5000);
} catch (Exception e) {}
}

void move() {
xPos++;
}

void paint() {
System.out.println("Male Objekt bei "+xPos);
}

Gruß eMmiE

P.S.: Viel Spaß 😉
 

Neue Themen


Zurück
Oben