Probleme bei Pong

Java xyrse123

Bekanntes Mitglied
Hallo,
Ich habe neulich ein Pong Spiel programmiert. Das Problem liegt beim Abprallen des Balls vom Schläger, der Ball prallt relativ häufig ab, doch ab und zu geht er einfach durch den Schläger durch. Ich wäre für jede Hilfe dankbar.
 
Hier der Code:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Pong extends JPanel {
    // {
    int x = 30, y = 300;// Schläger 1
    int Px = 200, Py = 200; // Ball
    int x2 = 770, y2 = 300; // Schläger 2
    int dPx = 10, dPy = 10; // Geschwindigkeiz Ball
    boolean Spieler1o = false; // oben
    boolean Spieler1u = false; // unten
    boolean Spieler2o = false;
    boolean Spieler2u = false;

    public Pong() {
        setPreferredSize(new Dimension(800, 600));

        Ball neu = new Ball();
        neu.start();
        Schläger s = new Schläger();
        s.start();
    }

    public void paint(Graphics gr) { // beiden Schläger und Ball
        Graphics2D g = (Graphics2D) gr; // werden gezeichnet
        g.setColor(Color.WHITE);
        g.fill(g.getClipBounds());
        g.setColor(Color.BLACK);
        g.fillRect(x, y, 10, 80);
        g.fillOval(Px, Py, 30, 30);
        g.fillRect(x2, y2, 10, 80);
    }

    public void PositionSchläger1() { // AnfangsPosition
        x = 30;
        y = 300;
        repaint();
    }

    public void PositionBall() { // AnfangsPosition
        Px = 200;
        Py = 200;
        repaint();

    }

    public void PositionSchläger2() {
        x2 = 760;
        y2 = 300;
        repaint();
    }

    class Ball extends Thread {
        void bewegen() {
            Px = Px + dPx; //
            Py = Py + dPy;

            if (Px < 0) { // 30
                Px = 0;
                dPx = -dPx;
            }
            if (Py < 0) { // 30
                Py = 0;
                dPy = -dPy;
            }
            if (Py > 570) {
                Py = 570;
                dPy = -dPy;
            }
            if (Px > 770) {
                Px = 770;
                dPx = -dPx;
            }

            if (Px == 40 && Py >= y && Py <= y + 80) { // getY //80 //Py
                Px = 40;

                dPx = -dPx;

                dPy = -dPy;
            }

            if (Px == 740 && Py >= y2 && Py <= y2 + 80) {// && Px>=y2 && Px<=
                                                            // y2+80)
                Px = 740;
                dPx = -dPx;
                dPy = -dPy;
            }
            repaint();
        }

        public void run() { // Thread für Ball

            while (!isInterrupted()) {

                bewegen();
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    return;
                }
            }
        }
    }

    class Schläger extends Thread implements KeyListener {
        Schläger() {
            addKeyListener(this);
        }

        public void run() {

            while (true) {
                if (Spieler1o == true) {
                    y -= 12;
                }
                if (Spieler1u == true) {
                    y += 12;
                }
                if (Spieler2o == true) {
                    y2 -= 12;
                }
                if (Spieler2u == true) {
                    y2 += 12;
                }
                if (y2 > 520) { // 600-80 wegen Schlägerlänge
                    y2 = 520;
                }
                if (y2 < 0) {
                    y2 = 0;
                }
                if (y < 0) {
                    y = 0;
                }
                if (y > 520) {
                    y = 520;
                }
                repaint();
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        public void keyPressed(KeyEvent e) { // Spieler 1
            if (e.getKeyCode() == KeyEvent.VK_W) {
                Spieler1o = true;
            }
            if (e.getKeyCode() == KeyEvent.VK_S) {
                Spieler1u = true;
            }
            if (y > 520) { // 600-80 wegen Schlägerlänge
                y = 520;
            }
            if (y < 0) {
                y = 0;
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) { // Spieler2
                Spieler2o = true;
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                Spieler2u = true;
            }
        }

        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_W) {
                Spieler1o = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_S) {
                Spieler1u = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                Spieler2o = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                Spieler2u = false;
            }
        }

        public void keyTyped(KeyEvent e) {
        }
    }
}
und die Hauptklasse:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Fenster extends JFrame {
  private Pong pong = new Pong();

  public Fenster() {
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    getContentPane().add(pong);

    pong.PositionBall();
    pack();
    getRootPane();setVisible(true);

    pong.PositionSchläger2();
    pong.PositionSchläger1();
    pong.setFocusable(true);

  }

  public static void main(String[] args) {
    new Fenster();

  }
}
 
Zuletzt bearbeitet von einem Moderator:
Moin,

(a) nutze bitte die Code-Tags - so bekommt man ja Augenkrebs !!
(b) wie wäre es mit ein paar Kommentaren, in den Du an geeigenten Stellen beschreibst, was der Code tun soll ...

VG Klaus
 
Hallo,
Ich denke das manchmal die Koordinaten vom Schläger falsch bestimmt werden und deswegen der Ball manchmal durchgeht.
Wie kann ich den noch Kommentare hinzuzufügen?
VG Linus
 
Hier noch einmal der Hauptteil mit mehr Kommentaren, hoffe es reicht so.

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

public class Pong extends JPanel {
    
     int x = 30, y = 300; // Anfangskoordinaten Schläger 1
     int Px = 200, Py = 200; //Anfangskoordinaten Ball
     int x2 = 770, y2 = 300; //Anfangskoordinaten Schläger 2
     int dPx = 10, dPy = 10; // Geschwindigkeit Ball
     boolean Spieler1o = false; // Pfeiltaste oben am Anfang Taste nicht gedrückt
     boolean Spieler1u = false; // Pfeiltast unten
     boolean Spieler2o = false;
     boolean Spieler2u = false;

     public Pong() {
         setPreferredSize(new Dimension(800, 600)); // Fenstergröße

         Ball neu = new Ball();
         neu.start(); // Thraed Ball wird gestartet
         Schläger s = new Schläger(); // Thread Schläger wird gestartet
         s.start();
     }

     public void paint(Graphics gr) { // beiden Schläger und Ball
         Graphics2D g = (Graphics2D) gr; // werden gezeichnet
         g.setColor(Color.WHITE);
         g.fill(g.getClipBounds()); // damit die Zeichnung überschrieben wird
         g.setColor(Color.BLACK);
         g.fillRect(x, y, 10, 80); // Ball und Schläger werden gezeichnet
         g.fillOval(Px, Py, 30, 30);
         g.fillRect(x2, y2, 10, 80);
     }

     public void PositionSchläger1() { // wird auf AnfangsPosition gesetzt
         x = 30;
         y = 300;
         repaint();
     }

     public void PositionBall() { // AnfangsPosition
         Px = 200;
         Py = 200;
         repaint();

     }

     public void PositionSchläger2() // Anfangsposition{
         x2 = 760;
         y2 = 300;
         repaint();
     }

     class Ball extends Thread { // thread für Ball
         void bewegen() {
             Px = Px + dPx; //die Bewegung
             Py = Py + dPy;

             if (Px < 0) { // Ball prallt von der Wand ab
                 Px = 0;
                 dPx = -dPx;
             }
             if (Py < 0) {  // Ball prallt von der Wand ab
                 Py = 0;
                 dPy = -dPy;
             }
             if (Py > 570) { // Ball prallt von der Wand ab
                 Py = 570;
                 dPy = -dPy;
             }
             if (Px > 770) { // Ball prallt von der Wand ab
                 Px = 770;
                 dPx = -dPx;
             }

             if (Px == 40 && Py >= y && Py <= y + 80) { // Hier soll er vom Schläger1 abprallen
                 Px = 40;
                 dPx = -dPx;                
             }

             if (Px == 740 && Py >= y2 && Py <= y2 + 80) {//// Hier soll er vom Schläger2 abprallen
                                                            
                 Px = 740;
                 dPx = -dPx;
                 dPy = -dPy;
             }
             repaint();
         }

         public void run() { // Thread für Ball

             while (!isInterrupted()) {

                 bewegen();
                 try {
                     Thread.sleep(50);
                 } catch (InterruptedException e) {
                     return;
                 }
             }
         }
     }

     class Schläger extends Thread implements KeyListener {
         Schläger() {
             addKeyListener(this); // KeyListenr wird hinzugefügt
         }

         public void run() {

             while (true) { // solange Spieler Taste drückt
                                 //wird Schläger bewegt
               if (Spieler1o == true) { // Bewegung Schläger1
                     y -= 12;
                 }
                 if (Spieler1u == true) {
                     y += 12;
                 }
                 if (Spieler2o == true) { // Bewegung Schläger2
                     y2 -= 12;
                 }
                 if (Spieler2u == true) {
                     y2 += 12;
                 }
                
                   if (y2 > 520) { // 600-80 wegen Schlägerlänge
                     y2 = 520; // Damit die Schläger nicht aus dem Bild verschwinden
                 }
                 if (y2 < 0) {
                     y2 = 0;
                 }
                 if (y < 0) {
                     y = 0;
                 }
                 if (y > 520) {
                     y = 520;
                 }
                 repaint();
                 try {
                     Thread.sleep(50);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         }

         public void keyPressed(KeyEvent e) { // Spieler 1 hier wird geguckt ob Taste gedrückt
             if (e.getKeyCode() == KeyEvent.VK_W) {
                 Spieler1o = true;
             }
             if (e.getKeyCode() == KeyEvent.VK_S) {
                 Spieler1u = true;
             }
            
             if (e.getKeyCode() == KeyEvent.VK_UP) { // Spieler2 hier wird geguckt ob Taste gedrückt
                 Spieler2o = true;
             }
             if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                 Spieler2u = true;
             }
         }

         public void keyReleased(KeyEvent e) { // Hier ob Taste wieder losgelassen
             // wenn ja stoppt Schlägerbewegung
           if (e.getKeyCode() == KeyEvent.VK_W) {
                 Spieler1o = false;
             }
             if (e.getKeyCode() == KeyEvent.VK_S) {
                 Spieler1u = false;
             }
             if (e.getKeyCode() == KeyEvent.VK_UP) {
                 Spieler2o = false;
             }
             if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                 Spieler2u = false;
             }
         }

         public void keyTyped(KeyEvent e) {
         }
     }
}
VG

Linus
 
Mit einer sinnvollen Frage bekommt man auch hier schnelle Hilfe und gute Tipps 😉

Den relevanten Tipp hast du ja dort schon bekommen, der Ball kann "in deinem Schläger" bzw hinter deinem Schläger landen - wahrscheinlich ist das das Problem

EDIT: hast du bedacht, das der gezeichnete Ball und der gezeichnete Schläger eine Größe haben, der Code diese aber nicht immer passend berücksichtigst?
 
Zuletzt bearbeitet:

Zurück
Oben