Thread pausieren und wieder starten

Odi1234

Neues Mitglied
Hallo zusammen,

ich habe zwei Probleme. Und zwar bin ich grade ein "Spiel" am programmieren, bei den sich 2 Bälle (später sollen per Button noch mehr dazu kommen) in einem Feld bewegen.
Jetzt habe ich einen Start und einen Stop Button in mein Layout eingefügt, welches den aktuellen Thread stoppen soll. Leider wird beim stoppen der komplette Thread gefreezt, halt so lange bis der Thread.sleep() abgelaufen ist. Wie mache ich das, dass ich ohne zeitliche begrenzung die Buttons jeder Zeit drücken kann und der Thread dann an der selben stelle vor dem stoppen wieder weiter läuft?

Außerdem hab ich das Problem, dass sich die Bälle überschneiden, sie sollen aber von einander abprallen.. :(

Danke für eure Hilfe!!!

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Ball extends JPanel{
    private static final int box_breite = 640;
    private static final int box_hoehe = 480;
   
    //Ball 1
    private float ball_radius = 75;
    private float ball_x = ball_radius + 50;
    private float ball_y =ball_radius + 20;
    private float ball_geschX = 3;
    private float ball_geschY = 2;
   
    //private float mittelpunkt = ball_radius;
   
    //Ball 2
    private float ball_radius2 = 50;
    private float ball_x2 = ball_radius2 + 200;
    private float ball_y2 = ball_radius2 + 250;
    private float ball_geschX2 = 2;
    private float ball_geschY2 = 3;
   
   
    private boolean b = false;
   
    //private float mittelpunkt2 = ball_radius2;
    //

/*
    JButton start = new JButton ("Start");
    JButton stop = new JButton ("Stop");
   
    JPanel panel = new JPanel();
        panel.add(start);
        panel.add(stop);
        panel.setVisible(true);
    */
   
    private static final int update_rate = 30;
   
      @Override
       public void paintComponent(Graphics g) {
          super.paintComponent(g);  
    
          g.setColor(Color.WHITE);
          g.fillRect(0, 0, box_breite, box_hoehe);
        
          //Ball 1
          g.setColor(Color.BLACK);
          g.fillOval((int) (ball_x - ball_radius), (int) (ball_y - ball_radius),
                (int)(2 * ball_radius), (int)(2 * ball_radius));
         
          //Ball 2
          g.setColor(Color.RED);
          g.fillOval((int) (ball_x2 - ball_radius2), (int) (ball_y2 - ball_radius2),
                    (int)(2 * ball_radius2), (int)(2 * ball_radius2));
         
       }
   
    public Ball (){
        this.setPreferredSize(new Dimension(box_breite, box_hoehe));
        JPanel panel = new JPanel ();
        JButton start = new JButton ("Start");
         JButton stop = new JButton ("Stop");
          panel.add(start);
          panel.add(stop);
          add(panel, BorderLayout.EAST);
         
        //Thread für Ball 1
        Thread game = new Thread(){
            public void run(){
                while(true){
                    ball_x += ball_geschX;
                    ball_y += ball_geschY;
                     
                       if (ball_x - ball_radius < 0) {
                           ball_geschX = -ball_geschX;
                           ball_x = ball_radius;
                       } else if (ball_x + ball_radius > box_breite) {
                           ball_geschX = -ball_geschX;
                           ball_x = box_breite - ball_radius;
                       }
                      
                       if (ball_y - ball_radius < 0) {
                           ball_geschY = -ball_geschY;
                           ball_y = ball_radius;
                       } else if (ball_y + ball_radius > box_hoehe) {
                           ball_geschY = -ball_geschY;
                           ball_y = box_hoehe - ball_radius;
                       }
                      
                       /*
                     //Wenn die Distanz zwischen den Mittelpunkten zweier Kreise kleiner ist als die Summe ihrer Radien, so liegt eine Kollision vor
                      
                       if(mittelpunkt+mittelpunkt2 < ball_radius+ball_radius2 || mittelpunkt+mittelpunkt2 < ball_radius+ball_radius2){
                           ball_geschX = -ball_geschX;
                           ball_x = ball_x - ball_radius;
                          
                           ball_geschX2 = -ball_geschX2;
                           ball_x2 = ball_x2 - ball_radius2;
                          
                       }else if (mittelpunkt+mittelpunkt2 < ball_radius+ball_radius2 ||mittelpunkt+mittelpunkt2 < ball_radius+ball_radius2){
                           ball_geschY = -ball_geschY;
                           ball_y =  ball_y - ball_radius;
                          
                           ball_geschY2 = -ball_geschY2;
                           ball_y2 = ball_y2 - ball_radius2;
                    
                       }
                       */
                       repaint();
                       try {
                          Thread.sleep(1000 / update_rate); 
                       } catch (InterruptedException ex) { }
                }
            }
        };
        //game.start();
       
        //Thread für Ball 2
        Thread game2 = new Thread(){
            public void run(){
                while(true){
                    ball_x2 += ball_geschX2;
                    ball_y2 += ball_geschY2;
                     
                       if (ball_x2 - ball_radius2 < 0) {
                           ball_geschX2 = -ball_geschX2;
                           ball_x2 = ball_radius2;
                       } else if (ball_x2 + ball_radius2 > box_breite) {
                           ball_geschX2 = -ball_geschX2;
                           ball_x2 = box_breite - ball_radius2;
                       }
                      
                       if (ball_y2 - ball_radius2 < 0) {
                           ball_geschY2 = -ball_geschY2;
                           ball_y2 = ball_radius2;
                       } else if (ball_y2 + ball_radius2 > box_hoehe) {
                           ball_geschY2 = -ball_geschY2;
                           ball_y2 = box_hoehe - ball_radius2;
                       }
                      
                    /*  
                     //falls kolidierung
                       if(ball_x == ball_x2){
                           ball_geschX2 = -ball_geschX2;
                           ball_x2 = ball_radius2;
                       } else if (ball_y == ball_y2){
                           ball_geschY2 = -ball_geschY2;
                           ball_y2 = ball_radius2;
                       }
                       */
                      
                       repaint();
                       try {
                          Thread.sleep(1000 / update_rate); 
                       } catch (InterruptedException ex) { }
                }
            }
        };
        //game2.start();
       
       
        start.addActionListener(new ActionListener(){
           
            @Override
            public void actionPerformed(final ActionEvent e){
                    game.start();
                    game2.start();
                    b = true;
                   
            }
           
            }
        );
       
        stop.addActionListener(new ActionListener(){
           
            @Override
            public void actionPerformed(final ActionEvent e){
           
                try {
                   
                      b = false;
                     
                      if(b == false){
                            Thread.sleep(1000);
                            //game2.sleep(1000);
                      }
                     
                      if(b == true){
                      game.start();
                      game2.start();
                     
                      }
                   } catch (InterruptedException ex) { }
                   
                }
               
            }
        );
       
    }
   
    public static void main(String[]args){
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                JFrame frame = new JFrame("Bouncing Ball");

              
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new Ball());
                frame.pack();
                frame.setVisible(true);
             }
          });
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Minecraft PlayerBot (Listener Thread für jeden Spieler?) Spiele- und Multimedia-Programmierung 3
H Exeption in thread "Thread-2" NullPointerExeption: init methode? Spiele- und Multimedia-Programmierung 25
kaoZ Animation in eigenen Thread auslagern..... Spiele- und Multimedia-Programmierung 1
gamebreiti Daemon Thread Spiele- und Multimedia-Programmierung 4
M Point & Click Thread Probleme Spiele- und Multimedia-Programmierung 20
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
Kenan89 Alternative zu Thread Runnable Spiele- und Multimedia-Programmierung 2
O Universe <- show Thread Spiele- und Multimedia-Programmierung 14
Y Warum Thread für Spieleprogrammierung? Spiele- und Multimedia-Programmierung 27
C ***** bitte thread löschen *** Spiele- und Multimedia-Programmierung 3
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2
D Snake n+1-Thread Spiele- und Multimedia-Programmierung 2
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
S Ein Thread für alle Animationen oder mehrere? Spiele- und Multimedia-Programmierung 2
G Thread startet nicht im Vollbild modus Spiele- und Multimedia-Programmierung 3
E TetrisApplet Thread Hilfe Spiele- und Multimedia-Programmierung 6
Developer_X Thread in Java3D Spiele- und Multimedia-Programmierung 8
D Methode in eigenem Thread auslagern Spiele- und Multimedia-Programmierung 9
S Probleme mit Thread beim Streaming Spiele- und Multimedia-Programmierung 1
F Problem mit Thread.sleep() Spiele- und Multimedia-Programmierung 7
Tapsi Thread wartet auf Threads Spiele- und Multimedia-Programmierung 7
M Thread.sleep() problem Spiele- und Multimedia-Programmierung 10
0 Workaround für Thread.sleep()-Bug Spiele- und Multimedia-Programmierung 15
M Roundbased - Thread anhalten Spiele- und Multimedia-Programmierung 8
D Wasserstrahl animieren: ein Thread je Tropfen? Spiele- und Multimedia-Programmierung 7
S Thread unterbrechen Spiele- und Multimedia-Programmierung 3
T [LWJGL] Textur / File wieder freigeben Spiele- und Multimedia-Programmierung 4
C Schon wieder ein Mastermind Spiele- und Multimedia-Programmierung 0
S Kollisionserkennung in Slick2D... Mal wieder Spiele- und Multimedia-Programmierung 4
1 JOGL: Fensterinhalt verschwindet sofort wieder Spiele- und Multimedia-Programmierung 3
baddestpoet Animation startet bei gedrückter Taste immer wieder von vorn Spiele- und Multimedia-Programmierung 12
aze Java 3D : 3D Objekte speichern und später wieder einlesen Spiele- und Multimedia-Programmierung 9
J JOGL - Bild wird immer wieder weiß Spiele- und Multimedia-Programmierung 2
Apo ApoPrism - Bringe die Sterne wieder zum Leuchten Spiele- und Multimedia-Programmierung 19
D Map wieder Tilemap =( Spiele- und Multimedia-Programmierung 4
A Ich mal wieder :-) - Problem mit Interpolatoren Spiele- und Multimedia-Programmierung 3
D wieder einer von anfang an. Spiele- und Multimedia-Programmierung 4

Ähnliche Java Themen

Neue Themen


Oben